EKSのsystem:mastersアクセス許可とは何か

2022年12月27日

Amazon EKS

Amazon EKS クラスターを作成すると、クラスターを作成した IAM ユーザは kubectl を使って Kubernetes のリソースを操作できます。このユーザは何でもできる root ユーザのような権限を持っています。2022 年 12 月時点の AWS のドキュメント クラスターへの IAM ユーザーおよびロールアクセスを有効にする - Amazon EKS によると、クラスターを作成した IAM ユーザーは EKS の RBAC 設定で、system:masters アクセス許可が自動的に付与されているとのこと。この「system:masters アクセス許可」って何だろうと、調べた内容の備忘録です。EKS のバージョンは 1.23 です。

目次

  1. RBAC のおさらい
  2. RBAC から system:masters を探す
  3. system:masters に所属するユーザを増やしたいときは
  4. まとめ

RBAC のおさらい

Role-based access control (RBAC) は Kubernetes の認可の機能です。クラスター、namespace、リソース(deployment, service, pod, secrets, configMap など) の単位でアクセス制御をすることができます。詳しくは Using RBAC Authorization | Kubernetes を参照。

RBAC は以下の 4 つのリソースで構成されています。

  • Role
    • アクセスを許可するリソースと操作を定義します。対象範囲は namespace です。
  • RoleBinding
    • User、Group、Service Account に対して、どの Role を紐づけるか定義します。対象範囲 は namespace です。
  • ClusterRole
    • アクセスを許可するリソースと操作を定義します。対象範囲はクラスタ内のすべての namespace です。
  • ClusterRoleBinding
    • User、Group、Service Account に対して、どの ClusterRole を紐づけるか定義します。対象範囲はクラスタ内のすべての namespace です。

RBAC から system:masters を探す

AWS のドキュメント クラスターへの IAM ユーザーおよびロールアクセスを有効にする - Amazon EKS によると、クラスターを作成した IAM ユーザーは EKS の RBAC 設定で、system:masters アクセス許可が自動的に付与されているとのこと。

Amazon EKS クラスターを作成すると、このクラスターを作成した AWS Identity and Access Management (IAM) エンティティユーザーまたはロール (フェデレーティッドユーザーなど) は、Amazon EKS コントロールプレーンのクラスターロールベースアクセスコントロール (RBAC) 設定で、system:masters アクセス許可が自動的に付与されます。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html

「system:masters アクセス許可」(英文では system:masters permission と書いてある)というのがよく分からないのですがとりあえず RBAC のリソースを探します。

ClusterRoleBinding を system:masters で検索すると、見つかりました。system:masters は ClusterRoleBinding で定義されている Group でした。

kubectl get clusterrolebindings -o json | jq -r '.items[] | select(.subjects[]?.kind=="Group" and .subjects[]?.name=="system:masters")'
{
  "apiVersion": "rbac.authorization.k8s.io/v1",
  "kind": "ClusterRoleBinding",
  "metadata": {
    "annotations": {
      "rbac.authorization.kubernetes.io/autoupdate": "true"
    },
    "creationTimestamp": "2022-12-25T02:32:29Z",
    "labels": {
      "kubernetes.io/bootstrapping": "rbac-defaults"
    },
    "name": "cluster-admin",
    "resourceVersion": "142",
    "uid": "b9189b85-7c73-44ed-8cd2-9ad196d1001c"
  },
  "roleRef": {
    "apiGroup": "rbac.authorization.k8s.io",
    "kind": "ClusterRole",
    "name": "cluster-admin"
  },
  "subjects": [
    {
      "apiGroup": "rbac.authorization.k8s.io",
      "kind": "Group",
      "name": "system:masters"
    }
  ]
}

ClusterRoleBinding では cluster-admin という ClusterRole が割り当てられているので、cluster-admin の定義を調べてみると、すべての権限が許可されていることが分かります。

kubectl get clusterrole cluster-admin -o json
{
    "apiVersion": "rbac.authorization.k8s.io/v1",
    "kind": "ClusterRole",
    "metadata": {
        "annotations": {
            "rbac.authorization.kubernetes.io/autoupdate": "true"
        },
        "creationTimestamp": "2022-12-25T02:32:29Z",
        "labels": {
            "kubernetes.io/bootstrapping": "rbac-defaults"
        },
        "name": "cluster-admin",
        "resourceVersion": "80",
        "uid": "574d48c7-5955-4c87-b088-45fa31682e6c"
    },
    "rules": [
        {
            "apiGroups": [
                "*"
            ],
            "resources": [
                "*"
            ],
            "verbs": [
                "*"
            ]
        },
        {
            "nonResourceURLs": [
                "*"
            ],
            "verbs": [
                "*"
            ]
        }
    ]
}

デフォルトの ClusterRole と ClusterRoleBindings のオブジェクト

Using RBAC Authorization - Default roles and role bindings | Kubernetes によると、デフォルトの ClusterRole や ClusterRoleBindings のオブジェクトの多くは system: で始まり、kubernetes.io/bootstrapping=rbac-defaultsのラベルがついているとのこと。先ほど検索したリソースにもこのラベルがついていることが確認できます。

API servers create a set of default ClusterRole and ClusterRoleBinding objects. Many of these are system: prefixed, which indicates that the resource is directly managed by the cluster control plane. All of the default ClusterRoles and ClusterRoleBindings are labeled with kubernetes.io/bootstrapping=rbac-defaults.

https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindings

system:masters グループと cluster-admin は Using RBAC Authorization - User-facing roles | Kubernetes にも解説がありました。すべての操作権限を与えることが書かれています。

Allows super-user access to perform any action on any resource. When used in a ClusterRoleBinding, it gives full control over every resource in the cluster and in all namespaces. When used in a RoleBinding, it gives full control over every resource in the role binding's namespace, including the namespace itself.

https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles

system:masters に所属するユーザを増やしたいときは

別の人に system:masters アクセス許可を付与したい場合は Amazon EKS でクラスターを作成した後、他の IAM ユーザーおよびロールにアクセス権を付与する を参考に aws-auth ConfigMap を修正することで対応可能です。

以下のコマンドで ConfigMap を編集できます。

kubectl edit -n kube-system configmap/aws-auth

data.mapUsers に system:masters グループに所属させたいユーザの情報を追加します。

data: 
  mapRoles: | 
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-XXXXXXXXXXXXX 
      username: system:node:{{EC2PrivateDNSName}} 
      groups: 
        - system:bootstrappers 
        - system:nodes 
  mapUsers: |
    - userarn: arn:aws:iam::123456789012:user/my-user
      username: my-user
      groups:
        - system:masters

まとめ

  • system:masters はクラスタ全体で有効なグループ
  • system:masters グループには cluster-admin の ClusterRole が紐付けられている
  • cluster-admin はすべての操作権限が許可されている
  • EKS クラスタを作成した IAM ユーザは system:masters アクセス許可が自動的に付与されていて、クラスタ全体のすべての操作権限を持つ

-技術ブログ
-