AWS EKS RBAC 入門:特定 Namespace に Admin ユーザーを追加する方法
AWS EKS で特定 Namespace に Admin ユーザーを追加する方法を解説します。IAM Policy、Access Entry、Role、RoleBinding、ClusterRole までまとめて確認できます。
Kubernetes を管理していると、他のユーザーに共同管理用のアカウントを作成する必要が出てくることがあります。特定 namespace への最大権限を付与する場合、Role だけでなく ClusterRole も考慮する必要があります。
この記事では demo namespace を例に、IAM から RBAC までの設定フローを一通り説明します。
流れの概要
- IAM User を作成し、最小権限の Policy をアタッチする
- EKS Access Entry を作成し、IAM User を K8S の ID にマッピングする
- Namespace の Role と RoleBinding を作成する
- ClusterRole と ClusterRoleBinding を作成する(最小限の Cluster 権限)
- kubeconfig を設定して動作確認する
ステップ 1:IAM Policy を作成する
eks:DescribeCluster の呼び出しを許可する IAM Policy を作成します。これは aws eks update-kubeconfig を実行するために必要な最低限の権限です:
1
2
3
4
5
6
7
8
9
10
11
12
{
"Statement": [
{
"Action": "eks:DescribeCluster",
"Effect": "Allow",
"Resource": [
"arn:aws:eks:ap-northeast-1:{AWS_ACCOUNT_ID}:cluster/{AWS_EKS_CLUSTER_NAME}"
]
}
],
"Version": "2012-10-17"
}
IAM User を作成した後、この Policy をアタッチします。
ステップ 2:EKS Access Entry を作成する
AWS EKS では IAM ID を K8S RBAC にマッピングする方法が 2 種類あります:
- EKS Access Entry(新しい方法・推薦)
- aws-auth ConfigMap(従来の方法・引き続き対応)
方法 1:EKS Access Entry を使う(推薦)
1
2
3
4
5
aws eks create-access-entry \
--cluster-name {AWS_EKS_CLUSTER_NAME} \
--principal-arn arn:aws:iam::{AWS_ACCOUNT_ID}:user/demo-admin \
--username demo-admin \
--kubernetes-groups demo-admin
方法 2:aws-auth ConfigMap を編集する(従来の方法)
1
kubectl edit configmap aws-auth -n kube-system
mapUsers フィールドに以下を追加します:
1
2
3
4
5
mapUsers: |
- userarn: arn:aws:iam::{AWS_ACCOUNT_ID}:user/demo-admin
username: demo-admin
groups:
- demo-admin
ステップ 3:Namespace の Role と RoleBinding を作成する
demo namespace に Role を作成し、よく使うリソースへのフルアクセス権限を付与します。次に RoleBinding で demo-admin グループにバインドします:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: demo-admin
namespace: demo
rules:
- apiGroups: ["*"]
resources: ["pods", "pods/log", "pods/exec", "pods/portforward", "secrets", "ingresses", "ingresses/status", "services", "configmaps", "deployments", "replicasets", "statefulsets", "jobs", "cronjobs"]
verbs: ["get", "list", "watch", "create", "patch", "update", "delete"]
- apiGroups: ["*"]
resources: ["serviceaccounts", "roles", "rolebindings"]
verbs: ["get", "list", "watch", "create", "patch", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: demo-admin
namespace: demo
roleRef:
kind: Role
name: demo-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
name: demo-admin
apiGroup: rbac.authorization.k8s.io
1
kubectl apply -f role.yaml
ステップ 4:ClusterRole と ClusterRoleBinding を作成する
Namespace スコープの Role だけでは不十分です。多くの kubectl 操作(例:ノードの確認、namespace の一覧取得)には最小限の Cluster レベル権限が必要です。
cluster リソースへの read-only アクセスのみを付与する ClusterRole を作成します:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: list-node-role
rules:
- apiGroups: [""]
resources: ["nodes", "persistentvolumes"]
verbs: ["get", "watch", "list"]
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "list"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: list-node-role-binding
subjects:
- kind: User
name: demo-admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: list-node-role
apiGroup: rbac.authorization.k8s.io
1
kubectl apply -f cluster-role.yaml
ステップ 5:ユーザーの kubeconfig を設定する
対象ユーザーのマシンで以下のコマンドを実行し、クラスターのアクセス認証情報を取得します:
1
2
3
aws eks update-kubeconfig \
--region ap-northeast-1 \
--name {AWS_EKS_CLUSTER_NAME}
動作確認
現在のユーザーの K8S ID マッピングを確認します:
1
kubectl auth whoami
demo namespace のリソースへのアクセスを確認します:
1
kubectl get pods -n demo
他の namespace へのアクセスが拒否されることを確認します(Forbidden が返ってくるはずです):
1
kubectl get pods -n default