【发布时间】:2020-11-03 15:49:25
【问题描述】:
我正在试验服务帐户。我相信以下应该会产生访问错误(但不会):
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
我看到的是成功的服务列表,但我预计会出现权限错误,因为我从未为 test-sa 创建任何 RoleBindings 或 ClusterRoleBindings。
我正在努力寻找列出特定 SA 可用权限的方法,但根据 Kubernetes check serviceaccount permissions,应该可以:
kubectl auth can-i list services --as=system:serviceaccount:default:test-sa
> yes
虽然我怀疑该命令是否真的有效,因为我可以用任何乱码替换test-sa,它仍然说“是”。
根据文档,服务帐户默认具有"discovery permissions given to all authenticated users"。它并没有说明这实际上意味着什么,但从更多阅读中我发现这个资源可能就是它所指的:
kubectl get clusterroles system:discovery -o yaml
> [...]
> rules:
> - nonResourceURLs:
> - /api
> - /api/*
> [...]
> verbs:
> - get
这意味着所有服务帐户在所有 API 端点上都具有 get 权限,尽管“nonResourceURLs”位意味着这不适用于服务等资源的 API,即使这些 API 位于该路径下……(? ??)
如果我完全删除 Authorization 标头,我会看到预期的访问错误。但我不明白为什么它能够使用这个空的服务帐户获取数据。我的误解是什么?如何正确限制权限?
【问题讨论】:
-
你能分享
kubectl get role,rolebinding -n default和kubectl get clusterrole,clusterrolebinding的输出吗 -
@ArghyaSadhu 第一个命令返回“在默认命名空间中找不到资源”。第二个返回一个大列表,包括
clusterrole.rbac.authorization.k8s.io/admin、clusterrole.rbac.authorization.k8s.io/system:controller:service-controller和clusterrolebinding.rbac.authorization.k8s.io/system:controller:service-controller等等。有什么特别想知道的输出吗? -
您是否有机会创建了一个 clusterrolebinding 来将此服务帐户绑定到
cluster-adminclusterrole? -
如果有帮助:这是使用 Docker 内置的“启用 Kubernetes”选项对 Kubernetes 进行本地测试部署。我相信没有自定义配置。值得一提的是,运行
kubectl cluster-info dump | grep authorization-mode表明访问控制模式为Node,RBAC -
@ArghyaSadhu 一位同事帮我找到了
clusterrolebinding docker-for-desktop-binding,它将cluster-admin添加到system:serviceaccounts(?!)。所以看起来它确实是一个 docker 桌面的东西。
标签: kubernetes permissions docker-desktop kubernetes-security