我正在试验服务帐户。我相信以下应该会产生访问错误(但不会):
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
标题,我会看到预期的访问错误。但我不明白为什么它能够使用这个空的服务帐户获取数据。我有什么误解,如何正确限制权限?