ConfigMap を使用して Kubernetes へのアクセスを IAM ユーザーに許可する - Amazon EKS

このページの改善にご協力ください

本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[GitHub でこのページの編集] を選択します。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。

ConfigMap を使用して Kubernetes へのアクセスを IAM ユーザーに許可する

重要

aws-auth ConfigMap は廃止されました。Kubernetes API へのアクセスを管理する際は、アクセスエントリを使用することをお勧めします。

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

Amazon EKS クラスターに IAM プリンシパルを追加する

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

注記

Kubernetes ロールベースのアクセスコントロール (RBAC) の設定の詳細については、Kubernetes ドキュメントの「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 という名前のクラスター用に設定されています。このユーザーがクラスターを作成したユーザーである場合は、すでにそのクラスターにアクセスできます。クラスターを作成したユーザーでない場合は、以降の手順を実行して、他の IAM プリンシパルのクラスターへのアクセスを有効にする必要があります。IAM のベストプラクティスでは、ユーザーではなくロールに許可を付与することが推奨されています。次のコマンドを使用すると、現在クラスターへのアクセスが可能な、他のプリンシパルを確認できます。

    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 ドキュメント の「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.191.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 --username admin --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. ユーザーのマッピングを追加します。IAM のベストプラクティスでは、ユーザーではなくロールに許可を付与することが推奨されています。my-user をユーザー名に置き換えます。eks-console-dashboard-restricted-access-group を Kubernetes RoleBinding または ClusterRoleBinding オブジェクトで指定されたグループの名前に置き換えます。111122223333 をアカウント ID に置き換えます。my-user を任意の名前に置き換えることができます。

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user --username 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/admin my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-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-auth   ConfigMap をクラスターに適用する の手順を使用してストック ConfigMap を適用します。

    2. IAM プリンシパルを ConfigMap に追加します。IAM グループは 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 ユーザーを追加するには: 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-auth   ConfigMap をクラスターに適用する

マネージド型ノードグループを作成するとき、または 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 https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. aws-auth-cm.yaml ファイルで、ノードに関連付けられている IAM ロールの Amazon リソースネーム (ARN) に rolearn を設定します。これを行うには、テキストエディタを使用するか、my-node-instance-role を置き換えて次のコマンドを実行します。

      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml

      このファイルの他の行は変更しないでください。

      重要

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

      ノードグループの 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

    Ctrl+C を入力して、シェルプロンプトに戻ります。