🦉
ServiceAccountに紐づくRoleを一発で特定する方法
手軽な方法
$ kubectl get rolebinding -o wide | grep <SERVICE ACCOUNT NAME>
$ kubectl get clusterrolebinding -o wide | grep <SERVICE ACCOUNT NAME>
※<SERVICE ACCOUNT NAME>
の部分をUserやGroupに変えたり、Roleに変えることで検索対象を変更可能。
例)corednsに紐付いているRoleを探す場合。
$ kubectl get clusterrolebinding -o wide | grep coredns
system:coredns ClusterRole/system:coredns 172d kube-system/coredns
上記結果より、coredns
ServiceAccountには ClusterRole/system:coredns
が紐付いていることがわかる。
jqを利用して検索
$ kubectl get clusterrolebinding -o json | jq '.items[] | select(.subjects[].kind == "ServiceAccount" and .subjects[].name == "<SERVICE ACCOUNT NAME>")'
※ServiceAccount
の部分を User
や Group
に変え、<SERVICE ACCOUNT NAME>
を対象のリソース名にすることで、検索対象を変更可能。
例)corednsに紐付いているRoleを探す場合。
$ kubectl get clusterrolebinding -o json | jq '.items[] | select(.subjects[].kind == "ServiceAccount" and .subjects[].name == "coredns")'
{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
"metadata": {
"creationTimestamp": "2021-12-28T14:54:12Z",
"name": "system:coredns",
"resourceVersion": "260",
"uid": "6da297fb-2d10-4beb-89d4-eba379895c4f"
},
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "system:coredns" # ここにRole名が記載されいている
},
"subjects": [
{
"kind": "ServiceAccount",
"name": "coredns",
"namespace": "kube-system"
}
]
}
上記結果より、coredns
ServiceAccountには system:coredns
ClusterRole が紐付いていることがわかる。
何をしているのか
grep利用パターン
ServiceAccountやUser、GroupとどのRoleが紐付いているかは、RoleBindingやClusterRoleBindingが管理している。
そしてその情報は kubectl describe
するか、下記のように kubectl get -o wide
することで閲覧可能。
$ kubectl get rolebinding -o wide
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS
kube-proxy Role/kube-proxy 172d system:bootstrappers:kubeadm:default-node-token
kubeadm:kubelet-config-1.21 Role/kubeadm:kubelet-config-1.21 172d system:nodes, system:bootstrappers:kubeadm:default-node-token
kubeadm:nodes-kubeadm-config Role/kubeadm:nodes-kubeadm-config 172d system:bootstrappers:kubeadm:default-node-token, system:nodes
system::extension-apiserver-authentication-reader Role/extension-apiserver-authentication-reader 172d system:kube-controller-manager, system:kube-scheduler
system::leader-locking-kube-controller-manager Role/system::leader-locking-kube-controller-manager 172d system:kube-controller-manager kube-system/kube-controller-manager
system::leader-locking-kube-scheduler Role/system::leader-locking-kube-scheduler 172d system:kube-scheduler kube-system/kube-scheduler
system:controller:bootstrap-signer Role/system:controller:bootstrap-signer 172d kube-system/bootstrap-signer
system:controller:cloud-provider Role/system:controller:cloud-provider 172d kube-system/cloud-provider
system:controller:token-cleaner Role/system:controller:token-cleaner 172d kube-system/token-cleaner
なのでそれを利用して、grepなどで絞り込んでやることでServiceAccountなどに紐付いているRoleを特定可能。
jq利用パターン
kubectl get -o json
を利用することで下記のようにリソースの詳細情報を一覧化できる。
$ kubectl get clusterrolebinding -o json
{
"apiVersion": "v1",
"items": [
{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
"metadata": {
"annotations": {
"rbac.authorization.kubernetes.io/autoupdate": "true"
},
"creationTimestamp": "2021-12-28T14:54:11Z",
"labels": {
"kubernetes.io/bootstrapping": "rbac-defaults"
},
"name": "cluster-admin",
"resourceVersion": "151",
"uid": "f3b421a7-7412-45f7-a25d-8bc2205aec19"
},
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "cluster-admin"
},
"subjects": [
{
"apiGroup": "rbac.authorization.k8s.io",
"kind": "Group",
"name": "system:masters"
}
]
},
{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRoleBinding",
"metadata": {
"creationTimestamp": "2021-12-28T14:54:31Z",
"name": "docker-for-desktop-binding",
"resourceVersion": "514",
"uid": "928d939f-8635-40e5-9d42-e1660f569537"
},
"roleRef": {
"apiGroup": "rbac.authorization.k8s.io",
"kind": "ClusterRole",
"name": "cluster-admin"
},
"subjects": [
{
"apiGroup": "rbac.authorization.k8s.io",
"kind": "Group",
"name": "system:serviceaccounts",
"namespace": "kube-system"
}
]
}
],
"kind": "List",
"metadata": {
"resourceVersion": "",
"selfLink": ""
}
}
※出力結果が長いので一部省略している。
この結果を jq
に通して、ほしいリソースを絞り込むことで特定可能。
今回は、Roleを何のリソースに紐付けているかが記載されている .items[].subjects[]
を検索対象にして特定している。
Discussion