クラスターへの IAM ユーザーおよびロールアクセスを有効にする - Amazon EKS

クラスターへの IAM ユーザーおよびロールアクセスを有効にする

AWS Identity and Access Management (IAM) を使用してクラスターにアクセスします。エンティティは、Amazon EKS コントロールプレーンで実行される Kubernetes の AWS IAM オーセンティケーター によって有効になります。オーセンティケーターは、その設定情報を aws-auth ConfigMap から取得します。すべての aws-auth ConfigMap 設定については、GitHub の [Full Configuration Format]」(完全な設定形式) を参照してください。

IAM ユーザーまたはロールを Amazon EKS クラスターに追加する

Amazon EKS クラスターを作成すると、このクラスターを作成した AWS Identity and Access Management (IAM) エンティティユーザーまたはロール (フェデレーティッドユーザーなど) は、Amazon EKS コントロールプレーンのクラスターロールベースアクセスコントロール (RBAC) 設定で、system:masters アクセス許可が自動的に付与されます。この IAM エンティティは表示可能な設定の中には表示されません。したがって、どの IAM エンティティが最初にクラスターを作成したのかを追跡する必要があります。追加の AWS ユーザーまたはロールがクラスターと対話できるようにするには、Kubernetes 内の aws-auth ConfigMap を編集し、 aws-auth ConfigMap で指定した group の名前を使用して、Kubernetes rolebinding または clusterrolebinding を作成する必要があります。

注記

さまざまな IAM アイデンティティの詳細については、IAM ユーザーガイドの「アイデンティティ (ユーザー、グループ、ロール)」を参照してください。Kubernetes のロールベースアクセスコントロール (RBAC) 設定の詳細については、[Using RBAC Authorization] (RBAC 認証の使用) を参照してください。

IAM ユーザーまたはロールを Amazon EKS クラスターに追加するには

  1. クラスターへのアクセスに kubectl が使用している認証情報を判別します。使用中のコンピュータ上で、次のコマンドを使用して、kubectl が使用する認証情報を判別できます。デフォルトのパスを使用しない場合は、~/.kube/configkubeconfig ファイルへのパスに置き換えます。

    cat ~/.kube/config

    出力例を次に示します。

    ... contexts: - context: cluster: my-cluster.region-code.eksctl.io user: admin@my-cluster.region-code.eksctl.io name: admin@my-cluster.region-code.eksctl.io current-context: admin@my-cluster.region-code.eksctl.io ...

    前述の出力例では、admin という名前のユーザーの認証情報が my-cluster という名前のクラスター用に設定されています。このユーザーがクラスターを作成したユーザーである場合は、すでにそのクラスターにアクセスできます。クラスターを作成したユーザーでない場合は、以降の手順を実行して、他のユーザーのクラスターへのアクセスを有効にする必要があります。次のコマンドを使用すると、現在クラスターへのアクセスが可能な、他のロールまたはユーザーを確認できます。

    kubectl describe -n kube-system configmap/aws-auth

    出力例を次に示します。

    Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-node-role username: system:node:{{EC2PrivateDNSName}} BinaryData ==== Events: <none>

    前の例は、デフォルトの aws-auth ConfigMap です。ノードインスタンスのロールだけがクラスターにアクセスできます。

  2. IAM ユーザーまたはロールをマップできる既存の Kubernetes rolesrolebindings または clusterrolesclusterrolebindings があることを確認してください。これらのリソースの詳細については、「Kubernetes ドキュメント」の [Using RBAC Authorization] (RBAC 認証の使用) を参照してください。

    1. 既存の Kubernetes roles または clusterroles を表示します。Rolesnamespace にスコープされますが、clusterroles はクラスターにスコープされます。

      kubectl get roles -A
      kubectl get clusterroles
    2. 前の出力で返された role または clusterrole の詳細を表示します。クラスター内で IAM ユーザーに必要となるパーミッション (rules) があることを確認します

      role-name を、前のコマンド出力で返された role の名前に置き換えます。kube-systemrole の名前空間に置き換えます。

      kubectl describe role role-name -n kube-system

      cluster-role-name を、前のコマンド出力で返された clusterrole の名前に置き換えます。

      kubectl describe clusterrole cluster-role-name
    3. 既存の Kubernetes rolebindings または clusterrolebindings を表示します。Rolebindingsnamespace にスコープされますが、clusterrolebindings はクラスターにスコープされます。

      kubectl get rolebindings -A
      kubectl get clusterrolebindings
    4. rolebinding または clusterrolebinding の詳細を表示して、前のステップで roleRef としてリストされた role または clusterrole、そして subjects にリストされたグループ名があることを確認します。

      role-binding-name を、前のコマンド出力で返された rolebinding の名前に置き換えます。kube-systemrolebindingnamespace に置き換えます。

      kubectl describe rolebinding role-binding-name -n kube-system

      出力例を次に示します。

      apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: eks-console-dashboard-restricted-access-role-binding namespace: default subjects: - kind: Group name: eks-console-dashboard-restricted-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eks-console-dashboard-restricted-access-role apiGroup: rbac.authorization.k8s.io

      cluster-role-binding-name を、前のコマンド出力で返された clusterrolebinding の名前に置き換えます。

      kubectl describe clusterrolebinding cluster-role-binding-name

      出力例を次に示します。

      apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks-console-dashboard-full-access-binding subjects: - kind: Group name: eks-console-dashboard-full-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: eks-console-dashboard-full-access-clusterrole apiGroup: rbac.authorization.k8s.io
  3. aws-auth ConfigMap を編集します。eksctl のようなツールにより ConfigMap を更新することができます。あるいは、手動で編集しての更新も可能です。

    重要

    ConfigMap の編集には、eksctl や、その他のツールを使用することをお勧めします。使用できる他のツールについては、Amazon EKS ベストプラクティスガイドの「ツールを使用して aws-authConfigMap を変更する」を参照してください。aws-auth ConfigMap の形式が不適切な場合、クラスターへのアクセスが失われる場合があります。

    eksctl

    前提条件

    デバイスまたは AWS CloudShell にインストールされている eksctl コマンドラインツールのバージョン 0.117.0 以降。eksctl をインストールまたは更新するには、「eksctl のインストールまたは更新」を参照してください。

    1. ConfigMap に現在のマッピングを表示します。my-cluster を自分のクラスター名に置き換えます。region-code をクラスターのある AWS リージョン に置き換えます。

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      出力例を次に示します。

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
    2. ロールのマッピングを追加します。my-role をロール名前で置き換えます。eks-console-dashboard-full-access-group を Kubernetes rolebinding または clusterrolebinding で指定されたグループの名前に置き換えます。111122223333 をアカウントID に置き換えます。

      eksctl create iamidentitymapping \ --cluster my-cluster \ --region=region-code \ --arn arn:aws:iam::111122223333:role/my-role \ --group eks-console-dashboard-full-access-group \ --no-duplicate-arns
      重要

      ロールの ARN には、role/my-team/developers/my-role などのパスを含めることはできません。ロールの ARN は、arn:aws:iam::111122223333:role/my-role のような形式にする必要があります。この例では、my-team/developers/ の部分を削除する必要があります。

      出力例を次に示します。

      ... 2022-05-09 14:51:20 [ℹ] adding identity "arn:aws:iam::111122223333:role/my-role" to auth ConfigMap
    3. ユーザーのマッピングを追加します。my-user をユーザー名に置き換えます。eks-console-dashboard-restricted-access-group を Kubernetes rolebinding または clusterrolebinding で指定されたグループの名前に置き換えます。111122223333 をアカウントの ID に置き換えます。

      eksctl create iamidentitymapping \ --cluster my-cluster \ --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user \ --group eks-console-dashboard-restricted-access-group \ --no-duplicate-arns

      出力例を次に示します。

      ... 2022-05-09 14:53:48 [ℹ] adding identity "arn:aws:iam::111122223333:user/my-user" to auth ConfigMap
    4. ConfigMap のマッピングを再度表示します。

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      出力例を次に示します。

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes arn:aws:iam::111122223333:role/my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-user eks-console-dashboard-restricted-access-group
    Edit ConfigMap manually
    1. 編集する ConfigMap を開きます。

      kubectl edit -n kube-system configmap/aws-auth
      注記

      Error from server (NotFound): configmaps "aws-auth" not found」というエラーが表示された場合は、aws-authConfigMap をクラスターに適用する の手順を使用してストック ConfigMap を適用します。

    2. IAM ユーザー、ロール、または AWS アカウントを ConfigMap に追加します。IAM グループを ConfigMap に追加することはできません。

      • IAM ロールを (たとえば、フェデレーティッドユーザーに) 追加するにはConfigMapmapRoles セクションの data の下にロールの詳細を追加します。ファイルに存在しない場合は、このセクションを追加します。各エントリは、次のパラメータをサポートしています。

        • rolearn: 追加する IAM ロールの ARN。この値にパスを含めることはできません。例えば、arn:aws:iam::111122223333:role/my-team/developers/role-name のような ARN を指定することはできません。ARN は、arn:aws:iam::111122223333:role/role-name のようにする必要があります。

        • ユーザー名: IAM ロールにマッピングする Kubernetes 内のユーザー名。

        • グループ: ロールをマップするグループまたは Kubernetes グループのリスト。グループには、デフォルトグループか、clusterrolebinding または rolebinding で指定されたグループを使用します。詳細については、「Kubernetes ドキュメント」の「デフォルトのロールとロールのバインディング」を参照してください。

      • IAM ユーザーを追加するには: ConfigMapmapUsers セクション (data の下) にユーザーの詳細を追加します。ファイルに存在しない場合は、このセクションを追加します。各エントリは、次のパラメータをサポートしています。

        • userarn: 追加する IAM ユーザーの ARN。

        • ユーザー名: IAM ユーザーにマッピングする Kubernetes 内のユーザー名。

        • グループ: ユーザーをマップするグループまたは Kubernetes グループのリスト。グループには、デフォルトグループか、clusterrolebinding または rolebinding で指定されたグループを使用します。詳細については、「Kubernetes ドキュメント」の「デフォルトのロールとロールのバインディング」を参照してください。

      例えば、次の YAML ブロックには次が含まれます。

      • ノードがそれ自体をクラスター、およびすべてのクラスターですべての Kubernetes リソースを表示することが可能な Kubernetes グループにマッピングされた my-console-viewer-role IAM ロールに登録できるように、IAM ノードインスタンスを Kubernetes グループにマッピングする mapRoles セクション。my-console-viewer-role IAM ロールに必要な IAM と Kubernetes グループのアクセス許可のリストについては、「必要なアクセス許可」を参照してください。

      • system:masters Kubernetes グループ、および特定の名前空間で Kubernetes リソースを表示することが可能な、Kubernetes グループにマッピングされた他の AWS アカウントからの my-user ユーザーに、デフォルトの AWS アカウントからの admin IAM ユーザーをマッピングする mapUsers セクション。my-user IAM ユーザーに必要な IAM と Kubernetes グループのアクセス許可のリストについては、「必要なアクセス許可」を参照してください。

      必要に応じて行を追加または削除し、すべて example values を、実際の値で置き換えます。

      # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-role username: system:node:{{EC2PrivateDNSName}} - groups: - eks-console-dashboard-full-access-group rolearn: arn:aws:iam::111122223333:role/my-console-viewer-role username: my-console-viewer-role mapUsers: | - groups: - system:masters userarn: arn:aws:iam::111122223333:user/admin username: admin - groups: - eks-console-dashboard-restricted-access-group userarn: arn:aws:iam::444455556666:user/my-user username: my-user
    3. ファイルを保存し、テキストエディタを終了します。

aws-authConfigMap をクラスターに適用する

マネージド型ノードグループを作成するとき、または aws-auth を使用してノードグループを作成するときに、ConfigMap eksctl が自動的に作成され、クラスターに適用されます。これはノードをクラスターに追加するために当初作成されたものですが、この ConfigMap を使用して、ロールベースアクセスコントロール (RBAC) アクセスを IAM ユーザーとロールに追加することもできます。セルフマネージド型ノードを起動しておらず、クラスターに aws-auth ConfigMap を適用していない場合は、次の手順に従って適用できます。

aws-authConfigMap をクラスターに適用するには

  1. aws-auth ConfigMap が適用済みであるかどうかを確認します。

    kubectl describe configmap -n kube-system aws-auth

    Error from server (NotFound): configmaps "aws-auth" not found」というエラーが表示された場合は、以下のステップを実行してストック ConfigMap を適用します。

  2. AWS オーセンティケーター設定マップをダウンロード、編集、適用します。

    1. 設定マップをダウンロードします。

      curl -o aws-auth-cm.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. テキストエディタで ファイルを開きます。<ARN of instance role (not instance profile)> をノードに関連付けられている IAM ロールの Amazon Resource Name (ARN) に置き換え、ファイルを保存します。このファイルの他の行は変更しないでください。

      重要

      ロールの ARN には、role/my-team/developers/my-role などのパスを含めることはできません。ロールの ARN は、arn:aws:iam::111122223333:role/my-role のような形式にする必要があります。この例では、my-team/developers/ を削除する必要があります。

      apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes

      ノードグループの AWS CloudFormation スタック出力を検査し、次の値を探すことができます。

      • InstanceRoleARNeksctl で作成されたノードグループ用

      • NodeInstanceRole – AWS Management Console で、Amazon EKS で発行された AWS CloudFormation テンプレートで作成されたノードグループ用

    3. 設定を適用します。このコマンドが完了するまで数分かかることがあります。

      kubectl apply -f aws-auth-cm.yaml
      注記

      認証またはリソースタイプのエラーが発生した場合は、トラブルシューティングトピックの「許可されていないか、アクセスが拒否されました (kubectl)」を参照してください。

  3. ノードのステータスを監視し、Ready ステータスになるまで待機します。

    kubectl get nodes --watch