複数のIAM Userがあるアカウントをスイッチ元として、クロスアカウント用IAM Roleを作る

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、虎塚です。

IAM Roleによるクロスアカウントでスイッチロールをすると、複数のAWSアカウントを利用している状況でも、手元で管理するログイン情報が増えずに済んで、便利ですね。

ところで、クロスアカウント用のIAM Roleを作成する際に、信頼関係のアクセスコントロールポリシードキュメントをデフォルト状態にしておくとよくないケースがあるので、ご紹介します。

事例

ある部署用のAWSアカウントに、複数の部員のIAM Userが存在するケースを考えてください。たとえば、開発部のAWSアカウントに、ヤマダタロウさん、サトウハナコさんが使うためのIAM Userが作成されている状態です。

ある時、特定の開発プロジェクトのために、別のAWSアカウントを新規に取得しました。このプロジェクトアカウントにも、前述の部員がそれぞれアクセスする必要があるものとします。

もしプロジェクトアカウントに各部員用のIAM Userを作成すると、ヤマダさんやサトウさんは、部署アカウント用とプロジェクトアカウント用の2つのログイン情報を管理しなければならなくなります。管理が複雑になってしまい、面倒ですね。そこで、プロジェクトアカウントには、部署アカウントをスイッチ元とする各部員用のIAM Roleを作成することにしました。

起こりうる問題

実現したい状態

プロジェクトアカウントに、ヤマダさんとサトウさんのそれぞれ専用のIAM Roleを作成します。部署アカウントにログインしたヤマダさんとサトウさんは、プロジェクトアカウントにログインしたい時、プロジェクトアカウントの自分用のIAM Roleを利用してスイッチロールします。

本来意図したとおりのクロスアカウントIAM Roleの動作

発生しうる状態

AWS Management Consoleを使用してクロスアカウント用のIAM Roleを作成した時、信頼関係のアクセスコントロールポリシードキュメントをデフォルトのままにすると、次のような事態が発生します。

意図しないクロスアカウント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) を入力します。

新しいIAM Role名の設定

[ロールタイプの選択]画面で、[クロスアカウントアクセスのロール]ラジオボタンを選択し、[所有しているAWSアカウント間のアクセスを提供します]の[選択]ボタンをクリックします。

ロールタイプの選択

スイッチ元のAWSアカウントID (123456789012) を入力します。前述の例でいうと、IAM Userが存在する部署アカウントのAWSアカウントIDになります。

スイッチ元のアカウントIDの入力

[ポリシーのアタッチ]画面で、IAM Roleに適用するポリシー (ここではPowerUserAccess) を選択します。

ポリシーのアタッチ

[確認]画面で実行する内容を確認して、[ロールの作成]ボタンをクリックします。

クロスアカウント用IAM Role作成の確認画面

以上でクロスアカウント用の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に、スイッチロール可能な権限を与えてしまっていないか、一度確認されてみてはいかがでしょうか。

それでは、また。