Экспериментирую со служебными аккаунтами. Я считаю, что следующее должно вызвать ошибку доступа (но это не так):
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
s или ClusterRoleBinding
s для test-sa
.
Я изо всех сил пытаюсь найти способы перечислить разрешения, доступные для конкретной SA, но в соответствии с Kubernetes check serviceaccount permissions , это должно быть возможно с:
kubectl auth can-i list services --as=system:serviceaccount:default:test-sa
> yes
Хотя я скептически отношусь к тому, действительно ли эта команда работает, потому что я могу заменить test-sa
любым gibberi sh, и он все равно говорит «да».
Согласно документации, учетные записи служб по умолчанию имеют «разрешения на обнаружение, предоставленные всем аутентифицированным пользователям» . Он не говорит, что это на самом деле означает, но, прочитав больше, я нашел этот ресурс, который, вероятно, имеет в виду:
kubectl get clusterroles system:discovery -o yaml
> [...]
> rules:
> - nonResourceURLs:
> - /api
> - /api/*
> [...]
> verbs:
> - get
Это означает, что все учетные записи служб имеют get
разрешения на все API. конечные точки, хотя бит «nonResourceURLs» подразумевает, что это не применимо к API для ресурсов, таких как службы, даже если эти API находятся по этому пути… (???)
Если я полностью удалю заголовок Authorization
, я увижу ожидаемую ошибку доступа. Но я не понимаю, почему он может получать данные с помощью этой пустой учетной записи службы. В чем мое недоразумение и как правильно ограничить разрешения?