複数のIAM Userがあるアカウントをスイッチ元として、クロスアカウント用IAM Roleを作る
こんにちは、虎塚です。
IAM Roleによるクロスアカウントでスイッチロールをすると、複数のAWSアカウントを利用している状況でも、手元で管理するログイン情報が増えずに済んで、便利ですね。
- 【新機能】IAMユーザーをManagement Consoleからクロスアカウントで色々なRoleにスイッチする事ができるようになりました。 | Developers.IO
- 【小ネタ】複数のSwitch Roleでのクロスアカウントアクセスをブラウザのブックマークで管理する | Developers.IO
ところで、クロスアカウント用のIAM Roleを作成する際に、信頼関係のアクセスコントロールポリシードキュメントをデフォルト状態にしておくとよくないケースがあるので、ご紹介します。
事例
ある部署用のAWSアカウントに、複数の部員のIAM Userが存在するケースを考えてください。たとえば、開発部のAWSアカウントに、ヤマダタロウさん、サトウハナコさんが使うためのIAM Userが作成されている状態です。
ある時、特定の開発プロジェクトのために、別のAWSアカウントを新規に取得しました。このプロジェクトアカウントにも、前述の部員がそれぞれアクセスする必要があるものとします。
もしプロジェクトアカウントに各部員用のIAM Userを作成すると、ヤマダさんやサトウさんは、部署アカウント用とプロジェクトアカウント用の2つのログイン情報を管理しなければならなくなります。管理が複雑になってしまい、面倒ですね。そこで、プロジェクトアカウントには、部署アカウントをスイッチ元とする各部員用のIAM Roleを作成することにしました。
起こりうる問題
実現したい状態
プロジェクトアカウントに、ヤマダさんとサトウさんのそれぞれ専用のIAM Roleを作成します。部署アカウントにログインしたヤマダさんとサトウさんは、プロジェクトアカウントにログインしたい時、プロジェクトアカウントの自分用のIAM Roleを利用してスイッチロールします。
発生しうる状態
AWS Management Consoleを使用してクロスアカウント用のIAM Roleを作成した時、信頼関係のアクセスコントロールポリシードキュメントをデフォルトのままにすると、次のような事態が発生します。
何が起きているのでしょうか。
信頼関係のアクセスコントロールポリシードキュメントでは、信頼するユーザ(AssumeRoleを許可するIAM User)を定義します。デフォルトでは、このユーザがrootになっているため、部署アカウントにあるすべてのIAM Userが、プロジェクトアカウントにスイッチロールできる状態になってしまいます。
クロスアカウント用IAM Roleの作成手順
上のような状態が起きないように、IAM Roleを作成する手順を記述します。今回は、AWS Management Consoleを使用します。
1. IAM Roleの作成
IAM Roleの一覧を表示して、[新しいロールの作成]ボタンをクリックします。
[ロール名の設定]画面で、新しく作成するIAM Roleの名前 (cm-yamada.taro) を入力します。
[ロールタイプの選択]画面で、[クロスアカウントアクセスのロール]ラジオボタンを選択し、[所有しているAWSアカウント間のアクセスを提供します]の[選択]ボタンをクリックします。
スイッチ元のAWSアカウントID (123456789012) を入力します。前述の例でいうと、IAM Userが存在する部署アカウントのAWSアカウントIDになります。
[ポリシーのアタッチ]画面で、IAM Roleに適用するポリシー (ここではPowerUserAccess) を選択します。
[確認]画面で実行する内容を確認して、[ロールの作成]ボタンをクリックします。
以上でクロスアカウント用のIAM Roleが作成されました。重要なのは、ここからです。
2. 信頼関係の編集
作成したIAM Roleを、IAM Role一覧から選択します。[信頼関係]タブで、[信頼関係の編集]ボタンをクリックします。
[信頼関係の編集]画面で、sts:AssumeRoleアクションを許可するPrincipalを変更します。
変更前(デフォルト状態)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }
変更後
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/cm-yamada.taro" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }
スイッチ元のAWSアカウント (123456789012) 全体ではなく、特定のIAM User (cm-yamada.taro) にだけ、AssumeRoleの権限を与えることができました。
以上です。本来の意図よりも広い範囲のIAM Userに、スイッチロール可能な権限を与えてしまっていないか、一度確認されてみてはいかがでしょうか。
それでは、また。