Amazon EKS クラスターで IAM ユーザーの名前空間全体でアクセス許可を管理する方法を教えてください。
最終更新日: 2021 年 6 月 25 日
Amazon Elastic Kubernetes Service (Amazon EKS) クラスター内の名前空間全体で AWS Identity and Access Management (IAM) ユーザーのユーザーアクセス許可を管理したいと考えています。
簡単な説明
Amazon EKS クラスターの名前空間全体でユーザーのアクセス許可を管理するには、次の手順を実行する必要があります。
- 組織のメンバーが引き受けることができる IAM ロールを作成する。
- (Kubernetes ウェブサイトから) クラスターの Kubernetes ロールベースのアクセスコントロール (RBAC) ロール (Role) およびロールバインディング (RoleBinding) を作成する。
- aws-auth ConfigMap を使用して、IAM ロールを RBAC ロールおよびグループにマッピングする。
注: クラスターを作成すると、クラスターを作成した IAM ユーザーまたはロールの Amazon リソースネーム (ARN) のみが aws-auth ConfigMap に追加されます。また、system:masters アクセス許可を持っているのはこの ARN だけです。つまり、クラスター作成者のみが aws-auth ConfigMap にユーザーまたはロールを追加できます。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
組織のメンバーが引き受けることができる IAM ロールを作成する
組織のメンバーに名前空間へのアクセスを許可するには、メンバーが引き受けることができる IAM ロールを作成する必要があります。
1. IAM ユーザーにアクセス許可を委任するロールを作成します。
2. ステップ 1 から IAM ロールを引き受けるアクセス許可がユーザーに付与されていることを確認するには、AWS CLI を設定します 。次に、そのユーザーのワークステーションから次のコマンドを実行します。
$ aws sts assume-role --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --role-session-name abcde
{
"Credentials": {
"AccessKeyId": "yourAccessKeyId",
"SecretAccessKey": "yourSecretAccessKey",
"SessionToken": "yourSessionToken",
"Expiration": "2020-01-30T01:57:17Z"
},
"AssumedRoleUser": {
"AssumedRoleId": "yourAssumedRoleId",
"Arn": "arn:aws:iam::yourAccountID:role/yourIAMRoleName"
}
}
注: yourAccessKeyId、yourSecretAccessKey、yourSessionToken、yourAssumedRoleId、yourAccountID、および yourIAMRoleName を実際の値に置き換えます。
3. Kubernetes API にアクセスするときに常にロールを使用するように IAM ユーザーの kubectl を設定するには、次のコマンドを実行して kubeconfig ファイルを更新します。
$ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName
注: yourClusterName、yourAccountID、および yourIAMRoleName を実際の値に置き換えます。
クラスターの Kubernetes RBAC ロールとロールバインディングを作成する
重要: 次の手順は、Kubernetes にアクセスするように設定されたワークステーションから実行する必要があります。ユーザーは、クラスター作成者であるか、aws-auth ConfigMap を通じてアクセス許可が既にある IAM エンティティである必要があります。前の手順で作成した IAM ロールには、クラスターへのアクセス権がまだ付与されていません。
クラスターロール (ClusterRole) をロールバインディングにバインドできます。バインドできるのは、RBAC ロールとロールバインディングが Kubernetes 名前空間リソースであるためです。ただし、ロールをクラスターロールバインディング (ClusterRoleBinding) にバインドすることはできません。
1. すべての組み込みクラスターロールを一覧表示するには、クラスターロール管理者をその名前空間のロールバインディングにバインドしてから、次のコマンドを実行します。
$ kubectl get clusterrole
2. クラスターロール管理者に関連付けられたアクセス許可を表示するには、次のコマンドを実行します。
$ kubectl describe clusterrole admin
重要: 既存の名前空間を使用するには、次のステップ 3 をスキップできます。名前空間 test に別の名前を選択する場合、次のステップ 4 と 6 で namespace パラメータの値を置き換えます。
3. IAM グループの一部として IAM ユーザーにアクセスを許可する名前空間 test を作成するには、次のコマンドを実行します。
$ kubectl create namespace test
4. Kubernetes RBAC ロールを作成するには、次のコードを新しい YAML ファイル (たとえば、role.yaml) にコピーします。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: k8s-test-role
namespace: test
rules:
- apiGroups:
- ""
- "apps"
- "batch"
- "extensions"
resources:
- "configmaps"
- "cronjobs"
- "deployments"
- "events"
- "ingresses"
- "jobs"
- "pods"
- "pods/attach"
- "pods/exec"
- "pods/log"
- "pods/portforward"
- "secrets"
- "services"
verbs:
- "create"
- "delete"
- "describe"
- "get"
- "list"
- "patch"
- "update"
注: 上記のロールにより、ユーザーは verbs セクションのすべてのアクションを実行できます。
5. RBAC ロールを作成するには、次のコマンドを実行します。
$ kubectl apply -f role.yaml
6. Kubernetes ロールバインディングを作成するには、次のコードを新しい YAML ファイル (例えば、rolebinding.yaml) にコピーします。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: k8s-test-rolebinding
namespace: test
subjects:
- kind: User
name: k8s-test-user
roleRef:
kind: Role
name: k8s-test-role
apiGroup: rbac.authorization.k8s.io
注: ロールバインディングは、roleRef セクションの RBAC ロールを subjects セクションのユーザーにバインドする名前空間付きリソースです。Kubernetes にはリソースタイプ user がないため、ユーザー k8s-test-user を作成する必要はありません。
7. RBAC ロールバインディングを作成するには、次のコマンドを実行します。
$ kubectl apply -f rolebinding.yaml
aws-auth ConfigMap を使用して、IAM ロールを RBAC ロールおよびグループにマッピングします。
1. IAM ロール yourIAMRoleName を Kubernetes ユーザー k8s-test-user に関連付けるには、次のコマンドを実行します。
$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user
注: yourClusterName、yourAccountID、および yourIAMRoleName を実際の値に置き換えます。
名前空間へのアクセスをテストする
1. 名前空間 test へのアクセスをテストするには、作成したユーザーの IAM ロール yourIAMRoleName を引き受け、次のコマンドを実行します。
$ kubectl create job hello -n test --image=busybox -- echo "Hello World"
注: 上記のコマンドは、前に作成した RBAC ロール k8s-test-role を使用してジョブを作成します。
2. 名前空間テストでポッドとジョブを確認するには、以下のコマンドを実行します。
$ kubectl get job -n test
NAME COMPLETIONS DURATION AGE
hello 1/1 4s 15s
$ kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
hello-tpjmf 0/1 Completed 0 2m34s
これで、IAM グループの一部である IAM ユーザーは、この名前空間を使用してアプリケーションをデプロイできるようになりました。