Amazon EKS クラスターを作成すると、クラスターを作成した IAM ユーザは kubectl を使って Kubernetes のリソースを操作できます。このユーザは何でもできる root ユーザのような権限を持っています。2022 年 12 月時点の AWS のドキュメント クラスターへの IAM ユーザーおよびロールアクセスを有効にする - Amazon EKS によると、クラスターを作成した IAM ユーザーは EKS の RBAC 設定で、system:masters アクセス許可が自動的に付与されているとのこと。この「system:masters アクセス許可」って何だろうと、調べた内容の備忘録です。EKS のバージョンは 1.23 です。
目次
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) 設定で、
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.htmlsystem:masters
アクセス許可が自動的に付与されます。
「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
https://kubernetes.io/docs/reference/access-authn-authz/rbac/#default-roles-and-role-bindingssystem:
prefixed, which indicates that the resource is directly managed by the cluster control plane. All of the default ClusterRoles and ClusterRoleBindings are labeled withkubernetes.io/bootstrapping=rbac-defaults
.
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 アクセス許可が自動的に付与されていて、クラスタ全体のすべての操作権限を持つ