Экспериментирую со служебными аккаунтами. Я считаю, что следующее должно вызвать ошибку доступа (но это не так):
apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
serviceAccountName: test-sa
containers:
- image: alpine
name: test-container
command: [sh]
args:
- -ec
- |
apk add curl;
KUBE_NAMESPACE="$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)";
curl \
--cacert "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" \
-H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
"https://kubernetes.default.svc/api/v1/namespaces/$KUBE_NAMESPACE/services";
while true; do sleep 1; done;
kubectl apply -f test.yml
kubectl logs test-pod
Я вижу успешный список служб, но я ожидал бы ошибки разрешений, потому что я никогда не создавал никаких RoleBinding
или ClusterRoleBinding
для test-sa
.
Я изо всех сил пытаюсь найти способы перечислить разрешения, доступные для конкретной SA, но согласно Kubernetes check serviceaccount permissions, это должно быть возможно с:
kubectl auth can-i list services --as=system:serviceaccount:default:test-sa
> yes
Хотя я скептически отношусь к тому, действительно ли эта команда работает, потому что я могу заменить test-sa
любой тарабарщиной, и она все равно говорит «да».
Согласно документации, сервисные учетные записи по умолчанию имеют обнаружение разрешения, предоставленные всем авторизованным пользователям. В нем не говорится, что это на самом деле означает, но, читая больше, я нашел этот ресурс, о котором, вероятно, идет речь:
kubectl get clusterroles system:discovery -o yaml
> [...]
> rules:
> - nonResourceURLs:
> - /api
> - /api/*
> [...]
> verbs:
> - get
Это означало бы, что все учетные записи служб имеют get
разрешения на все конечные точки API, хотя бит nonResourceURLs подразумевает, что это не будет применяться к API для ресурсов, таких как службы, даже если эти API находятся по этому пути… (???)
Если я полностью удалю заголовок Authorization
, я увижу ошибку доступа, как и ожидалось. Но я не понимаю, почему он может получать данные с помощью этой пустой учетной записи службы. В чем мое недоразумение и как правильно ограничить разрешения?
kubectl get role,rolebinding -n default
иkubectl get clusterrole,clusterrolebinding
- person Arghya Sadhu   schedule 14.07.2020clusterrole.rbac.authorization.k8s.io/admin
,clusterrole.rbac.authorization.k8s.io/system:controller:service-controller
иclusterrolebinding.rbac.authorization.k8s.io/system:controller:service-controller
среди многих других. Что-нибудь особенное из этого вывода, о котором вы хотите узнать? - person Dave   schedule 14.07.2020cluster-admin
роли кластера? - person Arghya Sadhu   schedule 14.07.2020kubectl cluster-info dump | grep authorization-mode
показывает, что режимы управления доступомNode,RBAC
- person Dave   schedule 14.07.2020test-sa
является недавно созданной - я могу изменить ее имя и снова запуститьapply
и увидеть тот же эффект, поэтому я не думаю, что это связано с каким-либо глупым состоянием на этом ресурсе. - person Dave   schedule 14.07.2020clusterrolebinding docker-for-desktop-binding
, который добавляетcluster-admin
кsystem:serviceaccounts
(?!). Так что, похоже, это действительно настольный докер. - person Dave   schedule 14.07.2020