secret 是一个命名空间资源,可以通过适当的 rbac 权限访问。但是,任何不当的 rbac 权限都可能导致泄漏。
您必须 role bind pod 的关联服务帐户。这是一个完整的例子。在此示例中,我为角色绑定创建了一个新服务帐户。但是,您可以根据需要使用默认的 service account。
第 1 步:创建一个名为 demo-namespace 的命名空间
kubectl create ns demo-namespace
第二步:在demo-namespace 中创建一个秘密:
kubectl create secret generic other-secret -n demo-namespace --from-literal foo=bar
secret/other-secret created
第 2 步:在 default 命名空间中创建一个服务帐户(my-custom-sa)。
kubectl create sa my-custom-sa
第 3 步:验证默认情况下,您在上一步中创建的服务帐户无权访问 demo-namespace 中存在的机密。
kubectl auth can-i get secret -n demo-namespace --as system:serviceaccount:default:my-custom-sa
no
第 4 步:从 demo-namespace 命名空间创建具有 get 和 list 机密权限的集群角色。
kubectl create clusterrole role-for-other-user --verb get,list --resource secret
clusterrole.rbac.authorization.k8s.io/role-for-other-user created
step-5:创建一个rolebinding来绑定上一步创建的集群角色。
kubectl create rolebinding role-for-other-user -n demo-namespace --serviceaccount default:my-custom-sa --clusterrole role-for-other-user
rolebinding.rbac.authorization.k8s.io/role-for-other-user created
第 6 步:验证默认 ns 中的服务帐户现在是否可以访问 demo-namespace 的机密。 (注意与步骤 3 的区别)
kubectl auth can-i get secret -n demo-namespace --as system:serviceaccount:default:my-custom-sa
yes
step-7:在默认命名空间中创建一个 pod 并挂载您之前创建的服务帐户。
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: my-pod
name: my-pod
spec:
serviceAccountName: my-custom-sa
containers:
- command:
- sleep
- infinity
image: bitnami/kubectl
name: my-pod
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
第 7 步:验证您是否可以从默认命名空间中的 pod 中读取 demo-namespace 的秘密。
curl -sSk -H "Authorization: Bearer $(cat /run/secrets/kubernetes.io/serviceaccount/token)" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/demo-namespace/secrets
{
"kind": "SecretList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "668709"
},
"items": [
{
"metadata": {
"name": "other-secret",
"namespace": "demo-namespace",
"uid": "5b3b9dba-be5d-48cc-ab16-4e0ceb3d1d72",
"resourceVersion": "662043",
"creationTimestamp": "2022-08-19T14:51:15Z",
"managedFields": [
{
"manager": "kubectl-create",
"operation": "Update",
"apiVersion": "v1",
"time": "2022-08-19T14:51:15Z",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:data": {
".": {},
"f:foo": {}
},
"f:type": {}
}
}
]
},
"data": {
"foo": "YmFy"
},
"type": "Opaque"
}
]
}