vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

AWS 多段スイッチロール(ロールの連鎖) でマネジメントコンソールへログイン

年の瀬の 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 が必要です。