Amazon Web Services ブログ
AWS SSO を用いた Amazon EKS への迅速なシングルサインオン
訳注:2022年7月に、AWS Single Sign-On は AWS IAM Identity Center に変更されました。
この記事は A quick path to Amazon EKS single sign-on using AWS SSO (記事公開日: 2022 年 6 月 14 日) を翻訳したものです。
Software as a Service (SaaS) とクラウドの導入が急速に進む中、アイデンティティは新しいセキュリティの境界になっています。AWS Identity and Access Management (IAM) と Kubernetes role-based access control (RBAC) は、強力な最小権限のセキュリティ体制を構築するツールを提供します。Single sign-on (SSO) は中央のアイデンティティプロバイダー (IdP) とのフェデレーションをおこない、ユーザーと SecOps チームが単一の認証情報を管理できるようにすることで、セキュリティを改善します。従業員や契約社員が組織から抜ける際、管理者は単一のアカウントを無効化することで、すべてのシステムとアプリケーションへのアクセスを削除することができます。これにより、定期的なコンプライアンス監査をシンプルにすることができます。
このブログでは、Amazon Elastic Kubernetes Service (Amazon EKS) クラスター上で稼働する Kubernetes リソースにアクセスするためのシングルサインオンを実装する、迅速かつ直接的な手順を紹介します。AWS Single Sign-On (AWS SSO) を Kubernetes RBAC と組み合わせて使用することで、AWS Command Line Interface (AWS CLI) と他のKubernetes CLI ツールを使用したアクセスを管理します。以下のステップに従うと、AWS のベストプラクティスに基づき迅速に立ち上げることができます。また特定のニーズに応じてカスタマイズすることができます。SSO と IdP フェデレーションについて具体的に説明する良いリファレンスがあるので、特定のユースケースや課題を深く掘り下げるために、この記事の最後でそれらのリファレンスを紹介しています。
前提条件
- AWS アカウント
- AWS アカウントに関連付けられたメールアドレスへのアクセス
- コマンドラインシェルと以下のツール群
- aws cli v2 – 管理者レベルのアクセスキー認証情報で構成
- eksctl – EKS クラスター管理ユーティリティ
- kubectl – Kubernetes 管理 CLI ユーティリティ
- jq – JSON クエリユーティリティ
斜体の行 はコードブロックなのでコピーして AWS CLI シェルに入力できます。
作成するもの
- AWS Organizations ルートアカウント
- AWS Organizations メンバーアカウント
- 多要素認証 (MFA) に Twilio Authy を使用した AWS SSO
- Amazon EKS クラスターと2ノードのマネージドノードグループ
Security contexts マトリクス
セットアッププロセスの中で異なるコンポーネントに対してコマンドを発行するために、これらのアイデンティティを切り替えます。
名前 | タイプ | 実行方法 | 目的 |
AWS AdministratorAccess | IAM ユーザー | aws configure default profile | Org ロールを引き受け、Org アカウントを作成する |
EKSClusterAdminAccess/eksadmin | SSO ユーザー/ロール | aws cli で profile を指定する | Creator ロールを引き受け、EKS クラスターを管理する |
OrganizationAccountAccessRole | IAM ロール | ロールを引き受けたあと、アクセスキーを変数に設定する | EKSClusterCreator ポリシーおよびロールを作成する |
EKSClusterCreator | IAM ロール | ロールを引き受けたあと、アクセスキーを変数に設定する | EKS クラスターを作成し、IAM/k8s をマッピングする |
ClusterAdmin | Kubernetes ロール | SSO ロールを aws-auth にマッピングする | Kubernetes クラスターを管理する |
AWS Organizations と AWS SSO
AWS 環境の管理者として AWS Organizations を有効化し、EKS クラスターをホストするメンバーアカウントを作成します。次に AWS SSO を有効化し、組織の役割と責任に沿ったユーザーとグループを作成します。
AWS Organizations を有効化する
AWS SSO は複数の AWS アカウントを管理するための無料サービスである AWS Organizations を必要とします。AWS Organizations を使用すると、AWS SSO は単一のログインポータルを介して組織内のすべてのアカウントへの認証・認可を提供することができます。AWS Organizations は、中央集権的なセキュリティガードレール・クロスアカウントでのアクセス管理・リソース共有・組織をまたいだ課金を通じて、管理とセキュリティを簡素化することができます。
AWS Organizations は AWS CLI コマンドを一度使用してデプロイすることができます。コマンドを発行したアカウントは、AWS Organizations のルートアカウントになります。AWS のユーザーまたはロールは AdministratorAccess AWS管理ポリシー がアタッチされている必要があります。
注意:AWS Organizations のルートアカウントは組織全体にまたがった管理者特権を持ち、クロスアカウントのセキュリティ、財務的なタスクのために予約する必要があります。ルートアカウントでアプリケーションのワークロードを実行することは避けてください。
組織に所属していない既存のアカウントで、新しい組織を作成する
aws organizations create-organization
AWS Organizations をプロビジョニングするには数分かかります。
プロビジョニング状況を確認する
aws organizations describe-organization
AWS Organizations のプロビジョニングが完了したら、元のアカウントのメールアドレスにメールでの確認要求が届きます。そのメールを開き Verify your email address ボタンを押します。このステップでは、追加の AWS アカウントを新しい組織に作成・招待することができます。
EKS クラスターをホストする新しいメンバーアカウントをプロビジョニングします。以下のコマンドの “youralias” と “yourdomain” を置き換えて一意の名前を準備し、ご自身のメールドメインでメールアドレスを作成します (メールプロバイダーがサポートしている場合、既存のメールエイリアスに “+” と一意の文字列を追加することで、同じメールボックスで受信する一意のメールエイリアスを複数作成することができます) 。${RANDOM} 変数はランダムな5桁の数字を生成します。新しいアカウントをプロビジョニングする間に、AWS SSO の有効化を継続することができます。
EKS クラスターをホストするメンバーアカウントを作成する
AWS SSO を有効化する
AWS マネジメントコンソールから Services ドロップダウンを使用するか、検索バーから “SSO” と入力し、AWS SSO を開きます。Enable AWS SSO を押します。
初期セットアップが完了したら AWS SSO の設定ページに戻ります。 AWS SSO ログインポータルがすでにプロビジョニングされていることに注意してくだい。親ドメインの “awsapps.com” に独自のホスト名を追加することで、URL をさらにカスタマイズすることができます。さしあたっては “User portal URL” を SSO ダッシュボードからコピーしてテキストエディタに貼り付けておくと、あとのステップで使用できます。
AWS SSO は組み込みの ID ストア、または AWS Managed Microsoft AD や SAML 2.0 準拠の外部 IdP などの独自 IdP を使用するオプションを提供することで、迅速に立ち上げることができます。ここでは AWS SSO の ID ストアを使用します。ID ソースは要件の変化に応じて後で変更することができます。
AWS SSO で ID を作成する前に、セキュリティキーとモバイル認証アプリの両方をサポートする多要素認証をオンにしておきます。
MFAを有効化する方法:
- Settings を押し Multi-factor authentication セクションの Configure を押します。
- Users should be promoted for MFA section の下部の Every time they sign in (always-on) を選択します。
- Users can authenticate with these MFA types の下部の Authenticator apps が選択されていることを確認します。
- 最後に If a user does not yet have a registered MFA device セクションの Require them to register an MFA device at sign in を選択します。
- Save Changes を押します。
AWS SSO ユーザ設定
EKS クラスター管理者のためのグループを作成し、グループをメンバーアカウント EKS-Account-… に関連付けます。そして権限を付与し、新しいユーザーをグループに追加します。AWS SSO でグループを使用するとロールベースでのアクセス制御 (RBAC) がシンプルになります。以下のステップでは、主要な AWS リソースへの読み取り専用権限、EKS クラスターへのフルアクセス、クラスターを作成するために使用する特別なロールを引き受けることができる最小権限の IAM ポリシーを作成します。
1) Groups を選択し Create group を押します。“EKS_Cluster_Admins” と入力し Create を押します。
2) AWS アカウントを選択し EKS-Account-… から Assign Users を押します。Groups タブを選択し EKS_Cluster_Admins を選択し Next: Permission sets. を押します。
3) Create new permission set を押すと、新しいブラウザのタブが開きます。
4) Create new permission set ウィンドウで、Create a custom permission set を押し、Next: Details. を押します。
- Create a custom permission set ウィンドウでは、“EKSClusterAdminAccess“ というアクセス権限セットを作成します。
- このアクセス権限セットが関連付けられた SSO ユーザーを EKS コンソールにリダイレクトするために、Relay state “https://console.thinkwithwp.com/eks” を入力します(オプション)。
- Attach AWS managed policies と Create a custom permissions policy の両方を選択します。
- “ViewOnlyAccess” AWS 管理ポリシーを検索し、選択します。
- 以下の JSON コードブロックを、Create a custom permissions policy ウィンドウに貼り付けます(次のスクリーンショットのように)。
- Next: Tags、Next: Review、Create の順に押します。
5) Select permission sets ウィンドウに戻り、更新ボタンを押します。新しい EKSClusterAdminAccess アクセス権限セットを選択し、Finish を押します。アカウントの設定が完了したら、Proceed to AWS Accounts を押します。
6) Users 、Add User と押します。そして “eksadmins” と入力します。
- Password セクションでは、Send an email to the user… を選択し、メールアドレスを入力・確認し、名字・名前・表示名を入力します。
- Next: Groups を押し、EKS_Cluster_Admins と Add User を選択します。
- ユーザー名は大文字と小文字が区別されることに注意してください。
Invitation to join AWS Single Sign-On メッセージを受信したら、Accept Invitation ボタンを押し、New user sign up ウィンドウを表示します。
新しいパスワードを入力・確認します。パスワードの長さと複雑さの要求が右側に表示され、これらの要求を満たすようガイダンスが提供されます。Set new password を押すと、AWS SSO のサインインページにリダイレクトされます。
注意:既に AWS SSO のセッションがある場合、続ける前にサインアウトしていることを確認してください。
新しい認証情報でサインインすると、多要素認証のセットアップを促されます。ここでは Twilio Authy を使用しますが、AWS SSO は Yubikey といった有名な物理セキュリティキーや、Google Authenticator といったスマートフォンの認証アプリをサポートしています。スマートフォンで希望の認証アプリを開くか、インストールします。SSO サインインページの MFA 設定に戻り Authenticator app を選択し、Next を選択し、Show QR Code を選択してください。QR コードを読み取り、アプリから数字を入力すると、新しいユーザーのセットアップが完了します。
Done を選択すると、先ほど EKS_Cluster_Admins グループを紐付けた “EKS-Account-…” アカウントを含む、 SSO アカウントを選択するページにリダイレクトされます。そのアカウントを展開し、EKSClusterAdminAccess ロールを選択すると、AWS マネジメントコンソールの EKS サービスページに遷移します。
ここまでで、わずか2行のコードで組織を作成し、アカウントを追加しました。次に AWS SSO をセットアップし、グループを作成し、そのグループを新しいアカウントに割り当て、グループの役割に関連付いた最小権限のアクセス権限セットを設定しました。最後に、新しいユーザーをグループに追加し、MFA をセットアップし、そのユーザーで SSO にサインインしました。もし AWS Managed Active Directory や Okta のようなサードパーティの IdP を利用したい場合は、それらの ID プロバイダーを AWS SSOと連携させ、“eksadmins” のような AWS SSO ユーザーを作成するかわりに、それらのプロバイダーのユーザー ID を使ってください。他のステップは全て同じです。
EKS へ SSO アクセスする CLI を設定する
AWS CLI で SSO を簡単に使用するために、AWS SSO は AWS 構成プロファイルと統合された aws sso login コマンドを提供します。それをセットアップするためには、最新の AWS CLI がインストールされ設定されたコマンドラインターミナルを開きます。
SSO という名前のプロファイルを自動生成する
aws configure sso
次の値を指定してください。
sso_start_url
– 先ほど SSO 管理ダッシュボード からコピーした “User portal URL”sso_region
– SSO が最初にデプロイされ、現在管理されているリージョン
ブラウザで認可をリクエストする画面を開いたら Allow を押し、CLI に戻ります。CLI に戻ると、アカウント・ロール・コマンド発行用のデフォルトリージョン・出力形式を選択するよう案内されます。ブラウザに SSO ユーザー “eksadmin” の認証済 AWS SSO セッションがあるとすると、そのユーザーに紐付けられたアカウントとロールのみが表示されます。
プロファイル名を作成する場合、そのプロファイルで CLI コマンドを発行するために --profile {profile_name}
を含める必要があるため、将来参照するために覚えやすい名前を選びます。この例ではプロファイルに “EKSClusterAdminAccess-EKSAccount1” と名付けています。
SSO 設定セッションは、次のサンプル出力のようになります。
SSO プロファイル を作成すると、今後は aws sso login
コマンドを使うことで、認証情報の入力を促すブラウザのウィンドウが開かれるようになります。先に進む前に、現在のアイデンティティを確認してください。
次のように表示されるはずです。
新しいアカウントで EKS クラスターを作成し、AWS SSO アイデンティティを Kubernetes ClusterRole に関連付ける前に、新しい EKS クラスターの作成のために特別な IAM ロールを作成します (セキュリティとシンプルさのトレードオフとして、このロールはクラスター作成に直接関連する限られた AWS サービス群のすべてのアクションを許可します。より厳しい最小権限シナリオの場合は、AWS IAM Access Analyzer などのサービスを使用して、実際の CloudTrail アクセスログに基づいてロールを作成する ことができます) 。
EKSClusterCreator IAM ロールを作成する
EKS クラスターを作成すると、使用するユーザーまたはロールは、クラスターの管理者権限を継承します。この ID プリンシパルは、クラスターのクラスター管理者権限を保持し、セキュアに保たれる必要があります。クラスターを作成したロールを分離して安全に保ちながら、日々の運用タスクを委任するための追加のロールを作成することがベストプラクティスです。もしプリンシパルの名前を忘れた場合、AWS サポートによって期間限定で取得または変更することができますし、ユーザー名やロール名を覚えていれば、IAM プリンシパルを再生成することができます。
以下の CLI コードスニペットでは、アカウント ID と SSO ロール名が現在の SSO セッションから抽出され、新しい EKSClusterCreate ロールを引き受けるために AWS SSO グループへのアクセスを許可するために使用されています。eksctl コマンドラインツールを使って新しい EKS クラスターを作成するために、このロールを使用します。
クラスター作成ポリシーを作成するために現在のロールとアカウントを取得する
クラスターを作成する IAM ロールの信頼ポリシーのための JSON ファイルを作成する
注意:us-east-1 以外のリージョンで SSO を設定している場合は “sso.amazonaws.com” のあとにリージョンを追加してください。例えば us-east-2 であれば “…/sso.amazonaws.com/us-east-2/…” となります。
クラスター作成用ポリシーを作成するための JSON ファイルを作成する
クラスター作成用のロールは全ての EKS クラスターリソースを作成するための権限を必要としますが、それらの権限は AdministratorAccess ポリシー権限の一部でしかありません。分かりやすくするために、クラスター作成に関係する AWS サービスのみ全ての API アクションを許可するポリシーを作成します。
EKS アカウント内に IAM ポリシーとロールを作成するために、AWS Organizations メンバーアカウントに作成されている OrganizationAccountAccessRole を一時的に引き受けます。この AWS Organizations の機能は、カスタマイズ可能な組織をまたぐ一元的な管理者権限アクセスを提供します。
EKSClusterCreator ロールを作成するために、 OrganizationAccountAccessRole を引き受ける
aws sts get-caller-identity
を実行すると、 OrganizationalAccountAccessRole を引き受けたことを確認できます。先ほどのスクリプトはそのロールを引き受け、 AWS_ACCESS_KEY_ID 変数を変更あるいは削除するか AWS 構成プロファイルを指定するまでデフォルトの AWS CLI 認証情報を設定する環境変数を作成します。
クラスター作成ロールを作成し、ポリシーをアタッチする
ロールを引き受け、新しい一時クレデンシャルを適用する
EKSClusterCreator ロールを作成したので、CLI からそのロールを引き受け、環境変数をリセットし、EKS クラスターを作成する準備ができました。作成したら eksctl
ユーティリティを使って、新しいEKS クラスターへの権限をEKSClusterAdminnAccess ロールに与えます。
EKS クラスターを作成する
新しい VPC の中に、EKS クラスターとマネージドノードグループをデフォルトの設定で作成する
eksctl create cluster
注意:デフォルトでは、EKS はアクティブな kubeconfig ファイルをアップデートします。以下の KUBECONFIG 環境変数を設定することで、別の kubeconfig ファイルを指定できます。
そうすることで既存の kubeconfig ファイルが保持され、 eksctl create cluster が終了した時に新しい kubeconfig ファイルが作成されます。
クラスターの作成には約15〜20分必要です。待っている間に、裏側で何が起きているのかを確認し追加のオプションについて学ぶために eksctl のドキュメント を読んでください。クラスターと関連するインフラストラクチャを構築するために、eksctl は AWS CloudFormation を使用します。クラスター作成が完了したら、クラスター名をメモしておき次のセッションに進みます。
Kubernetes RBAC と IAM フェデレーション
EKS は、WebHook トークン認証・サービスアカウントトークン・OIDC 認証など、クラスターへのアクセスコントロールのための様々な方法を提供しています。AWS CLI バージョン 2.x 以降は kubectl
コマンドの認証のために Bearer トークンが透過的に生成されます。kube-apiserver はトークン署名を検証するための Webhook 認証を使用し、認証のためのトークンを AWS Security Token Service (AWS STS) に転送します。認証されたら kube-apiserver は全ての EKS クラスターにデフォルトで作成される aws-auth ConfigMap 内での IAM とKubernetes RBAC のマッピングを期待します。既に引き受けている EKSClsuterCreator ロールを使用して、EKSClusterAdminAccess ロールに EKS クラスターの管理権限を委任します。まず Kubernetes のデフォルトの cluster-admin ロールを使って AWS SSO の EKSClusterAdminAccess ロールにアクセス権を付与します。もしこの演習で使っているリージョンに EKS クラスターが1つしかない場合は、以下のコードブロックを入力します。そうでなければ eksctl
によるクラスター作成処理の最終行に表示されているクラスター名を使用して export cluster={cluster-name}
コマンドで “cluster” 変数を手動設定するか、CLI コマンドで aws eks list-clusters
を実行します。
EKSClusterAdminAccess ロールの aws-auth アイデンティティマッピングを作成する
Kubernetes RBAC と IAM のマッピングを EKS クラスター内の aws-auth
ConfigMap を参照することで確認する
出力は以下のようになります。
eksctl create iamidentitymapping
コマンドを実行することで、SSO のアクセス権限セット “EKSClusterAdminAccess” を Kubernetes デフォルトの cluster-admin
ロールにマッピングしました。もう1つの system:node:{{EC2PrivateDNSName}}
は、EKS ノードグループのインスタンスプロファイルのロール eksctl-fabulous-wardrobe-16446157-NodeInstanceRole-L7A7NXU3DSJS
にマッピングされており、クラスタ内部で各ノードの kubeletに system:bootstrappers
と system:nodes
の権限を付与します。このノードグループのマッピングは、新しいノードグループが作成されるたびに作成されます。aws-auth
ConfigMap の中に EKSClusterCreator ロールが書かれていないことに注意してください。この ID プリンシパルはクラスターの存続のためのクラスター管理者権限を保持し EKS Security Best Practice Guide に従って安全に保つ必要があります。
kubectl は、クラスター・リージョン・アイデンティティ・ kubectl の認証方法を定義するためのエントリを必要とします。以下のように、EKSClusterAdminAccess ロールの設定を生成することができます。
EKSClusterAdminAccess ロールを使い始めるために kubeconfig を作成する
注意:もし “No cluster found for name” エラーを受け取ったら --region {cluster region}
を上のコードブロックの {cluster region}
に追加してください。
EKSクラスターにテストで接続してみましょう。Worker Nodeがリストで表示されます。
kubectl get nodes
EKS クラスター管理者用の AWS SSO ロールがネイティブの Kubernetes cluster-admin
ロールにマッピングされました。eksctl
の IAM アイデンティティマッピングを用いて、aws-auth
ConfigMap に対して、 新しい AWS SSO アクセス権限セットにマッピングされた最小権限のロール(Kubernetes namespace レベルのスコープ) あるいは クラスター全体にまたがる clusterroles
を追加で作成することが可能です。
結論
本ブログでは、組織と AWS SSO の設定する手順を説明してきました。EKS クラスター用の新しいアカウントに関連するユーザー・グループ・ロール (アクセス権限セットとも呼ばれる) を作成しました。また EKS クラスターを作成する特別なロールを作成し、AWS SSO ロールと Kubernetes ネイティブの RBAC cluster-admin
ロールをマッピングしました。AWS SSO の設定を除いて、他の全てのタスクは AWS CLI を使うことで完了し、Infrastructure as Code なインフラの一例となりました。
関連するブログ・ドキュメント
- Using Kubernetes Role-based Access Control Authorization
- Manage AWS Single Sign-on identity source
- Enabling IAM user and role access to your cluster
- Authenticating users for your cluster from an OpenID Connect identity provider
翻訳はプロフェッショナルサービスの後藤が担当しました。原文はこちらです。