🦉

ServiceAccountに紐づくRoleを一発で特定する方法

2022/06/20に公開

手軽な方法

$ 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 の部分を UserGroup に変え、<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