この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、虎塚です。
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に、スイッチロール可能な権限を与えてしまっていないか、一度確認されてみてはいかがでしょうか。
それでは、また。