Amazon EKS クラスターにアクセスするように SSO ユーザーを設定する方法を教えてください。

所要時間4分
0

AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) を使っています。しかし、Amazon Elastic Kubernetes Service (Amazon EKS) クラスターにアクセスできません。クラスターにアクセスするように SSO ユーザーを設定したいです。

解決方法

次の前提条件が満たされていることを確認してください。

注: 以下の手順では、kubectl を使用してクラスターにアクセスします。kubectl アクセスを設定すると、IAM Identity Center ユーザーとしてログインすることで Amazon EKS コンソールにクラスターリソースが表示されます。

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行時にエラーが発生する場合は、最新バージョンの AWS CLI が実行されていることを確認してください

SSO ユーザーを使用するように AWS CLI を設定する

AWS CLI コマンドを実行するときに SSO 認証を使用する AWS コマンドラインインターフェイス (AWS CLI) プロファイルを作成します。詳細については、「AWS IAM アイデンティティセンター (AWS Single Sign-On の後継) を使用するように AWS CLI を設定する」を参照してください。

以下は、自動手順を使用した AWS CLI SSO 設定の例です。

aws configure sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
SSO region [None]: us-east-1

AWS CLI はデフォルトのブラウザを開き、 IAM アイデンティティセンターアカウントのログインプロセスを開始しようとします。

Attempting to automatically open the SSO authorization page in your default browser.

AWS CLI がブラウザを開くことができない場合は、ログインプロセスを手動で開始する方法が記載された次のメッセージが表示されます。

If the browser does not open or you wish to use a different device to authorize this request, open the following URL:
https://device.sso.us-east-2.amazonaws.com/
Then enter the code:
XXXX-XXXX
The only AWS account available to you is: 123456789999
Using the account ID 123456789999
The only role available to you is: ViewOnlyAccess
Using the role name "ViewOnlyAccess"
CLI default client Region [us-east-2]:
CLI default output format [json]:
CLI profile name [ViewOnlyAccess-123456789999]: test-profile
To use this profile, specify the profile name using --profile, as shown:
aws s3 ls --profile test-profile

これで、この新しいプロファイルを使用して AWS CLI コマンドを実行できるようになりました。この設定により、SSO ユーザーは次の操作を行うことができます。

  • AWS で認証します。
  • IAM アイデンティティセンターによって作成された AWS ID および管理 (IAM) ロールを想定します。

例:

$ aws sts get-caller-identity
{
    "UserId": "AROAXMRV33N1234567890:test-user",
    "Account": "123456789999",
    "Arn": "arn:aws:sts::123456789999:assumed-role/AWSReservedSSO_ViewOnlyAccess_05a3861234567890/test-user"
}

SSO 用に作成された AWS CLI プロファイルを使用するように kubectl コンテキストを設定します

Kubectl は AWS CLI コマンドを使用します。そのため、kubectl の現在のコンテキストで新しい AWS CLI プロファイルを指定する必要があります。kubectl context を更新して新しいプロファイルを使用するには、以下のコマンドを実行します。

aws eks update-kubeconfig --name $CLUSTER-NAME --profile test-profile

このコマンドを実行すると、kubectl はプロファイル test-profile を使用してクラスター API サーバーで認証します。

パスを除外して ARN バージョンを構築する

aws-auth ConfigMap にマッピングされている IAM ロールにはパスが含まれていません。デフォルトでは、SSO ユーザーに関連付けられている IAM ロールの Amazon リソースネーム (ARN) にはパスが含まれます。

例:

arn:aws:iam::123456789999:role/aws-reserved/sso.amazonaws.com/us-east-2/AWSReservedSSO_ViewOnlyAccess_05a3861234567890

完全な ARN を aws-auth ConfigMap に追加した場合、SSO ユーザーは認証されません。SSO ユーザーを使用してクラスターにアクセスすることはできません。必ず、この ARN のバージョンをパスを含めずに構築してください。このバージョンは次の手順で使用する必要があります

例:

arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01

以下のコマンドを実行して、パスなしで IAM ロールを取得することもできます。

ssorole=$(aws sts get-caller-identity --query Arn --output text --profile test-profile | cut -d/ -f2)
account=$(aws sts get-caller-identity --query Account --output text --profile  test-profile)
echo "arn:aws:iam::$account:role/$ssorole"
arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01

ARN を aws-auth ConfigMap に追加します

SSO ユーザーが Amazon EKS クラスターにアクセスするには、SSO ユーザーに関連付けられている IAM ロールを Kubernetes RBAC 権限にマッピングする必要があります。そのためには、パスのない IAM ロール ARN を aws-auth ConfigMap に含めてください。次に、それを Kubernetes ユーザーと Kubernetes Role と RoleBinding (または ClusterRole と ClusterRoleBinding) にリンクされているグループにマッピングします。ユースケースに応じて、以下のセクションのいずれかの手順を使用してください。

クラスター全体の管理者権限を持つ SSO ユーザー

デフォルトでは、Kubernetes グループの system:masters はクラスター全体の管理者権限を提供します。このグループは ClusterRole cluster-admin と ClusterRoleBinding cluster-admin にリンクされています。そのため、新しい ClusterRole オブジェクトと ClusterBindingRole オブジェクトを作成する必要はありません。パスのない IAM ロールを system:masters グループにマッピングするだけで済みます。

これを行うには、aws-auth ConfigMap を編集します。

kubectl edit configmap aws-auth -n kube-system

次に、以下を追加します。

- groups:
  - system:masters
  rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
  username: cluster-admin

名前空間にバウンドされた読み取り権限を持つ SSO ユーザー

この場合、特定の名前空間内で読み取り権限を持つ Role と RoleBinding を作成する必要があります。次に、aws-auth ConfigMap のカスタムユーザー名またはグループ名を使用して、これらのオブジェクトを IAM ロールにリンクします。

1.    希望する名前空間の読み取り権限のみを許可する Kubernetes Role オブジェクトを作成します。

cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: $MY-NAMESPACE
  name: reader-role
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["*"]
  verbs: ["get", "watch", "list"]
EOF

注意:

  • $MY-NAMESPACE を自分の名前空間の名前に置き換えてください。
  • reader-role をカスタムユーザー名に置き換えます。

2.    Kubernetes ロール権限を read-only-groupグループにリンクする Kubernetes RoleBinding オブジェクトを作成します。

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: reader-binding
  namespace: MY-NAMESPACE
subjects:
- kind: Group
  name: read-only-group
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: reader-role
  apiGroup: rbac.authorization.k8s.io
EOF

3.    パスのない IAM ロール ARN を aws-auth ConfigMap の read-only-group グループにマッピングします。

次のコマンドを実行すると、IAM ロールを自動的にマッピングできます。

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01 \
    --group read-only-group \
    --no-duplicate-arns \
    --username read-only-user1

: $CLUSTER-NAME$REGION は、それぞれクラスターとリージョンの名前に置き換えてください。 または、IAM ロールを手動でマッピングすることもできます。これを行うには、aws-auth ConfigMap を編集します。

kubectl edit configmap aws-auth -n kube-system

次に、mapRoles セクションに以下を追加します。

- groups:
  - read-only-group
  rolearn: arn:aws:iam::123456789000:role/AWSReservedSSO_ViewOnlyAccess_05a38657af2a0a01
  username: read-only-user1

重要: IAM ロールは aws-auth ConfigMap に 1 回だけ表示する必要があります。したがって、IAM ロールを含むセクションは 1 つだけにしてください。

これで、SSO ユーザーを使用してクラスターにアクセスできるようになりました。

$ kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          24h

関連情報

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

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ