Amazon EKS クラスターで IAM ユーザーの名前空間全体でアクセス許可を管理する方法を教えてください。

最終更新日: 2020 年 2 月 6 日

名前空間全体で Amazon Elastic Kubernetes Service (Amazon EKS) クラスターのユーザーアクセス許可を管理したいです。

簡単な説明

Amazon EKS クラスターの名前空間全体でユーザーのアクセス許可を管理するには、次の手順を実行する必要があります。

  1. 組織のメンバーが引き受けることができる AWS Identity and Access Management (IAM) ロールを作成する
  2. クラスターの Kubernetes ロールベースのアクセスコントロール (RBAC) ロール (Role) およびロールバインディング (RoleBinding) を作成する
  3. aws-auth ConfigMap を使用して、IAM ロールを RBAC ロールおよびグループにマッピングする

注: クラスターを作成すると、クラスターを作成した IAM ユーザーまたはロールの Amazon リソースネーム (ARN) のみが aws-auth ConfigMap に追加され、system:masters アクセス許可が付与されます。つまり、クラスター作成者のみが aws-auth ConfigMap にユーザーまたはロールを追加できます。

解決方法

組織のメンバーが引き受けることができる IAM ロールを作成する

組織のメンバーに名前空間へのアクセスを許可するには、メンバーが引き受けることができる IAM ロールを作成する必要があります。

1.    IAM ユーザーにアクセス許可を委任するロールを作成します

2.    チームメンバーがステップ 1 の IAM ロールを引き受けるアクセス許可があることを確認するには、AWS コマンドラインインターフェイス (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"
    }
}

注: yourAccessKeyIdyourSecretAccessKeyyourSessionTokenyourAssumedRoleIdyourAccountID、および yourIAMRoleName を実際の値に置き換えます。

3.    Kubernetes API にアクセスするときに常にロールを使用するように IAM ユーザーの kubectl を設定するには、次のコマンドを実行して kubeconfig ファイルを更新します。

$ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName

注: yourClusterNameyourAccountID、および 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 ファイルにコピーします。

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

8.    IAM ロール yourIAMRoleName を Kubernetes ユーザー k8s-test-user に関連付けるには、次のコマンドを実行します。

$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user

注: yourClusterNameyourAccountID、および yourIAMRoleName を実際の値に置き換えます。

名前空間へのアクセスをテストする

名前空間 test へのアクセスをテストするには、作成したユーザーの IAM ロール yourIAMRoleName を引き受け、次のコマンドを実行します。

$ kubectl get role -n test

上記のコマンドは、前に作成した RBAC ロール k8s-test-role を一覧表示します。

これで、IAM グループの一部である IAM ユーザーは、この名前空間を使用してアプリケーションをデプロイできるようになりました。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合