Amazon EKS クラスターで IAM ユーザーの名前空間全体でアクセス許可を管理する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) クラスター内の名前空間全体で AWS Identity and Access Management (IAM) ユーザーのユーザーアクセス許可を管理したいと考えています。
簡単な説明
Amazon EKS クラスター内の名前空間全体でユーザーの権限を管理するには、次の手順を実行します。
- 組織のメンバーが引き受ける IAM ロールを作成します。
- クラスターの Kubernetes ロールベースのアクセス制御 (RBAC) ロール (Role) とロールバインディング (RoleBinding) を作成します。詳細については、Kubernetes ウェブサイトの「Using RBAC authorization」を参照してください。
- aws-auth ConfigMap を使用して、IAM ロールを RBAC ロールおよびグループにマッピングします。
**注:**IAM ユーザーまたはロールがクラスターを作成すると、この IAM アイデンティティの ARN のみが aws-auth ConfigMap に追加され、system: masters 権限が付与されます。つまり、aws-auth ConfigMap にユーザーまたはロールを追加できるのはクラスターの作成者のみです。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
組織のメンバーが引き受けられる IAM ロールを作成する
IAM ロールを作成して、組織のメンバーに名前空間へのアクセス権を付与します。
-
ユーザーに 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 は、ご自身の値に置き換えてください。
-
kubeconfig ファイルを更新して、IAM ユーザーの kubectl が Kubernetes API にアクセスするときに常にそのロールを使用するように設定します。
$ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName
**注:**yourClusterName、yourAccountID、yourIAMRoleName は、ご自身の値に置き換えてください。
クラスター用の Kubernetes RBAC ロールとロールバインディングを作成する
**重要:**Kubernetes にアクセスするように設定されたワークステーションから、次の手順を実行する必要があります。クラスターの作成者であるか、既に aws-authConfigMap を介してアクセスできる IAM ID である必要があります。IAM ロールにはまだクラスターへのアクセス権がありません。
クラスターロール (ClusterRole) をロールバインディングにバインドします。RBAC ロールとロールバインディングは Kubernetes の名前空間リソースです。ただし、ロールをクラスターロールバインディング (ClusterRoleBinding) にバインドすることはできません。
-
次のコマンドを実行してすべての組み込みクラスターロールを一覧表示し、クラスターロール管理者を名前空間のロールバインディングにバインドします。
$ kubectl get clusterrole
-
次のコマンドを実行して、クラスターロール管理者に関連付けられている権限を確認します。
$ kubectl describe clusterrole admin
-
test という名前の名前空間を作成して、IAM グループの一部として IAM ユーザーにアクセス権を付与します。
**注:**別の名前を選択した場合は、名前空間パラメータの値を置き換えてください。既存の名前空間を使用するには、手順 4 に進みます。$ kubectl create namespace test
-
Kubernetes RBAC ロールを作成するには、次のコードを新しい YAML ファイル (role.yaml など) にコピーします。** **
kind: Role apiVersion: rbac.authorization.k8s.io/v1 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"
**注:**Kubernetes RBAC ロールが付与されたユーザーは、verbs セクションのすべてのアクションを実行できます。
-
次のコマンドを実行して RBAC ロールを作成します。
$ kubectl apply -f role.yaml
-
Kubernetes ロールバインディングを作成します。次のコードを新しい YAML ファイル (rolebinding.yaml など) にコピーします。
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 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 ユーザーを作成する必要はありません。
-
次のコマンドを実行して RBAC ロールバインディングを作成します。
$ kubectl apply -f rolebinding.yaml
aws-auth ConfigMAP を使用して IAM ロールを RBAC ロールおよびグループにマッピングします。
次のコマンドを実行して、yourIAMRoleName IAM ロールを k8s-test-user Kubernetes ユーザーに関連付けます。
$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user
**注:**yourClusterName、yourAccountID、yourIAMRoleName は、ご自身の値に置き換えてください。
名前空間へのアクセスをテストする
- 次のコマンドを実行して、test 名前空間へのアクセスをテストします。
**注:**上記のコマンドは、作成した k8s-test-role RBAC ロールを使用するジョブを作成します。$ kubectl create job hello -n test --image=busybox -- echo "Hello World"
- 次のコマンドを実行して、test 名前空間のポッドとジョブを確認します。
$ kubectl get job -n testNAME 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
関連するコンテンツ
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前