年の瀬の awsume-console-plugin との出会いです。
馴れ初め
- 🤷:多段スイッチロールだとマネジメントコンソール使えなくなりますね
- 👼:awsume でできるんじゃない
- 🤷:マネジメントコンソールの仕様上できないっぽいですけど
- ...
- 🤷:できた
結論
AWSume のプラグイン awsume-console-plugin を利用する多段スイッチロールでもマネジメントコンソールへの Sign-in が行えます。
神と紹介されていますが、正にでした。
検証
スイッチロール
マネジメントコンソールと AWC CLI (など) で仕様が異なります。
AWS Management Consoleでロールを切り替えると、コンソールは常に元の認証情報を使用して切り替えを認証します。
これは、IAM ユーザー、SAML フェデレーションロール、またはウェブ ID フェデレーションロールとしてサインインする際に適用されます。
たとえば、RoleA に切り替える場合は、IAM は元のユーザーまたはフェデレーションロールの認証情報を使用して、RoleA の引き受けが許可されているかどうかを判断します。
その後、RoleA を使用中に RoleB への切り替えを試みると、AWS は引き続き RoleA の認証情報ではなく元のユーザーまたはフェデレーティッドロールの認証情報を使用して切り替えを承認します。
ロールの連鎖 — ロールの連鎖を使用することもできます。この連鎖は、ロールのアクセス許可を使用して 2 つ目のロールにアクセス許可を使用します。 コンソールでロールを切り替えるときは、ロールチェーンを使用していません。元のユーザーの権限を使用しています。
ロールの連鎖についての説明は以下になります。
ロールの連鎖は、AWS CLI または API を使用して 2 つ目のロールを引き受けるロールを使用する場合に発生します。
たとえば、RoleA には RoleB を引き受けるアクセス権があります。
User1 は AssumeRole API オペレーションの長期的なユーザー認証情報を使用して RoleA を引き受けることができます。
このオペレーションを用いて RoleA の短期的な認証情報を返します。
ロールが連鎖していれば、User1 によって RoleB が引き受けられるよう RoleA の短期的な認証情報を使用できます。
マルチアカウントでの認証
基本的な考え方は公式の図を拝借します。
最近は Idp でのフェデレーションや、AWS Organization で IAM Identity Center (旧AWS SSO) の利用が主流となっていますが、 "IAMユーザー" が "IAMロール" に置き換わるだけで基本的な考え方は同じだと思います。
パターン1: Sign-in ユーザにスイッチ許可
- "IAM User" に各AWSアカウントの IAM Role へのSwitchを許可
基本構成です。
"IAM User" で Sign-in 後に "Switch role" で、各AWSアカウントのRoleへSwitchします。
"Switch back" で元のAWSアカウントの "IAM User" に戻ります。
以下は AWS_CONFIG_FILE (~/.aws/config) の最低限の記載例です。
# AWS_CONFIG_FILE 例 [profile assume-a] source_profile = default role_arn = arn:aws:iam::XXXXXXXXXXXa:role/example-switch-role-assume-a [profile assume-b] source_profile = default role_arn = arn:aws:iam::XXXXXXXXXXXb:role/example-switch-role-assume-b [profile assume-c] source_profile = default role_arn = arn:aws:iam::XXXXXXXXXXXc:role/example-switch-role-assume-c [profile assume-d] source_profile = default role_arn = arn:aws:iam::XXXXXXXXXXXd:role/example-switch-role-assume-d
マネジメントコンソール上での Switch role 後の Switch role
前述の仕様により、マネジメントコンソールでは不可です。(図内黄色矢印)
例として "b" に Switch role 後に "c" に Switch role という操作を行った場合、 "b" から "c" でなく、 "A" の IAM User から "c" への Switch となります。 つまり、Switch back 後に再度 Switch role した事と同じ動きになります。(図内赤色矢印)
パターン2: Roleにスイッチ許可
- "IAM User" に IAM Role へのSwitchを許可し、その Role に各AWSアカウントの IAM Role へのSwitchを許可
図内黄色矢印の Switch はマネジメントコンソールでは不可です。
# AWS_CONFIG_FILE 例 [profile assume-a] source_profile = default role_arn = arn:aws:iam::XXXXXXXXXXXa:role/example-switch-role-assume-a [profile assume-b] source_profile = assume-a role_arn = arn:aws:iam::XXXXXXXXXXXb:role/example-switch-role-assume-b [profile assume-c] source_profile = assume-a role_arn = arn:aws:iam::XXXXXXXXXXXc:role/example-switch-role-assume-c [profile assume-d] source_profile = assume-a role_arn = arn:aws:iam::XXXXXXXXXXXd:role/example-switch-role-assume-d
パターン3: ロールの連鎖
- "IAM User" に IAM Role へのSwitchを許可し、Switch 後の Role へも個別にAWSアカウントの IAM Role へのSwitchを許可
この構成は殆ど目にすることは無いと思いますが、一応できるという事で多段スイッチロールを重ねてみます。 同様に、図内黄色矢印の Switch はマネジメントコンソールでは不可です。
# AWS_CONFIG_FILE 例 [profile chain-a] source_profile = default role_arn = arn:aws:iam::XXXXXXXXXXXa:role/example-switch-role-chain-a [profile chain-b] source_profile = chain-a role_arn = arn:aws:iam::XXXXXXXXXXXb:role/example-switch-role-chain-b [profile chain-c] source_profile = chain-b role_arn = arn:aws:iam::XXXXXXXXXXXc:role/example-switch-role-chain-c [profile chain-d] source_profile = chain-c role_arn = arn:aws:iam::XXXXXXXXXXXd:role/example-switch-role-chain-d
ちなみにアンチパターンでしかないと思いますが、循環(更に d から b へ Switch など)もやろうと思えばできます。
Awsume Console Plugin
本題です。
AWSume のプラグイン awsume-console-plugin を利用すると各パターンの任意の AWSアカウント、ロールでマネジメントコンソールへの Sign-in が行えます。
インストール
pipx install awsume pipx inject awsume awsume-console-plugin
Sign-in URLの発行
-c
でデフォルトブラウザで開く、 -cl
で URL 出力です。
Sign-in 後の Switch role も可能です。(図内紫色矢印)
例:パターン2 の Role(a)
$ awsume assume-a -cl [assume-a] Role credentials will expire YYYY-MM-DD hh:mm:ss https://signin.aws.amazon.com/federation?Action=login&Issuer=&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2Fconsole%2Fhome%3Fregion%3Dus-east-1&SigninToken=...
例:パターン3 の Role(a)
% awsume chain-b -cl [chain-a] Role credentials will expire YYYY-MM-DD hh:mm:ss [chain-b] Role credentials will expire YYYY-MM-DD hh:mm:ss https://signin.aws.amazon.com/federation?Action=login&Issuer=&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2Fconsole%2Fhome%3Fregion%3Dus-east-1&SigninToken=...
Sign-in 前には Sign out が必要
発行されたURLで Sing-in を行う際に既にAWSマネジメントコンソールへログインしている場合は、一度 Sign out が必要です。