KubernetesはすべてのデフォルトのServiceAccountに権限を与えます.
4451 ワード
環境準備:
プライベートなネーミングスペースmynamespaceを作成し、デフォルトのservice accountを使用するpodを作成します.
なぜpodがミラー:radial/busyboxplus:curlを使用するのかは、curlコマンドを実行して検証を容易にするためです.
mynamespaceを表示すると2つのサービスaccountがあります
コンテナに入り、curlコマンドを実行してpodの権限を表示します.
結果はpods is forbidden:Userで、権限がないことを示します.
権限
次にdefaultの権限を変更して、defaultにlist podの権限を持たせます.権限ロールを追加してからdefaultのserviceaccountにロールを付与します
次にclusterrolebindingを作成し、すべてのdefault serviceaccountにロールを追加します.
再びコンテナに入り、curlコマンドを実行してすべてのpodを取得し、実行に成功しました
プライベートなネーミングスペースmynamespaceを作成し、デフォルトのservice accountを使用するpodを作成します.
#cat mynamespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: mynamespace
#cat example-pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-default-verbs
namespace: mynamespace
spec:
shareProcessNamespace: true
containers:
- name: shell
image: radial/busyboxplus:curl
stdin: true
tty: true
なぜpodがミラー:radial/busyboxplus:curlを使用するのかは、curlコマンドを実行して検証を容易にするためです.
mynamespaceを表示すると2つのサービスaccountがあります
#kubectl get serviceaccount -n mynamespace
NAME SECRETS AGE
default 1 14h
example-sa 1 14h
#kubectl describe serviceaccount default -n mynamespace
Name: default
Namespace: mynamespace
Labels:
Annotations:
Image pull secrets:
Mountable secrets: default-token-sg9f6
Tokens: default-token-sg9f6
Events:
コンテナに入り、curlコマンドを実行してpodの権限を表示します.
#kubectl attach -it test-default-verbs -n mynamespace
$curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt --header "Authorization:Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT/api/v1/namespaces/$(cat/var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "pods is forbidden: User \"system:serviceaccount:mynamespace:default\" cannot list resource \"pods\" in API group \"\" at the cluster scope",
"reason": "Forbidden",
"details": {
"kind": "pods"
},
"code": 403
結果はpods is forbidden:Userで、権限がないことを示します.
権限
次にdefaultの権限を変更して、defaultにlist podの権限を持たせます.権限ロールを追加してからdefaultのserviceaccountにロールを付与します
#cat example-clusterrole.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
#kubectl apply -f example-clusterrole.yaml
#kubectl describe clusterrole example-clusterrole
Name: example-clusterrole
Labels:
Annotations: PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
pods [] [] [get watch list]
次にclusterrolebindingを作成し、すべてのdefault serviceaccountにロールを追加します.
#cat example-clusterrolebinding.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: example-clusterrolebinding
subjects:
- kind: Group
name: system:serviceaccounts
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: example-clusterrole
apiGroup: rbac.authorization.k8s.io
#kubectl apply -f example-clusterrolebinding.yaml
#kubectl describe clusterrolebinding example-clusterrolebinding
Name: example-clusterrolebinding
Labels:
Annotations: Role:
Kind: ClusterRole
Name: example-clusterrole
Subjects:
Kind Name Namespace
---- ---- ---------
Group system:serviceaccounts
再びコンテナに入り、curlコマンドを実行してすべてのpodを取得し、実行に成功しました
#kubectl attach -it test-default-verbs -n mynamespace
$curl --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt --header "Authorization:Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT/api/v1/namespaces/$(cat/var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods
...
"imageID": "docker-pullable://radial/busyboxplus@sha256:a68c05ab1112fd90ad7b14985a48520e9d26dbbe00cb9c09aa79fdc0ef46b372",
"containerID": "docker://d6b1a94caa364392ac7e3c07dd99faa1c80f15fe6f757aa54509ea778b6c93aa",
"started": true
}
],
"qosClass": "BestEffort"
}
}
]