AWS CLIでのスイッチロール

8 min read読了の目安(約7300字

コンソールでのスイッチロールはよくやりますが、CLIではやったことがなかったので以下のドキュメントを参考に試してみました。
IAM ロールの切り替え (AWS CLI) - AWS Identity and Access Management

スイッチロールについて

image.png

1つのアカウントから複数のアカウントにアクセスする際に用いられる方法です。
図だと、Jumpアカウントにサインインした後に、アクセスしたいアカウントのロールに切り替えるだけで、そのアカウントに入ることができます。もちろんロールに付与する権限を変えれば特定のリソースへのアクセス権だけに絞ることも可能です。

メリットはこんなかんじです。

  • アカウント管理が楽になり、情報漏洩リスクを減らせる
  • 既存のユーザ情報をそのまま使用
  • 既存の権限ベースでの管理が可能
  • 既存と同様のポリシーの利用が可能
  • 入退社など一時的な管理が可能
  • 自動的に認証情報のローテーションが行われる

詳しくは以下をご覧ください。
20190130 AWS Black Belt Online Seminar AWS Identity and Access Management (AWS IAM) Part2

コンソールでのイメージ

コンソールでのイメージも紹介します。

まずは既存のIAMユーザー情報でサインインします。
image.png

ひとまずJump用のアカウントに入りました。
image.png

ここからスイッチロールをしていきます。
アクセスする先のアカウントでは事前にロールを作成し、Jumpアカウントのユーザーと信頼関係を結んであります。
image.png

この画面でアクセス先のアカウントIDとロールを入力することで、そのアカウントにスイッチすることができます。
image.png

スイッチ完了です。
image.png

こんなかんじでJumpアカウントに1回サインインした後は、スイッチロールするだけで別のアカウントにアクセスできます。
冒頭でも書きましたが複数アカウントだけはなく、同一アカウント内でもスイッチロールは可能です。

CLIでスイッチロール

ドキュメントの手順を参考に以下の流れでやっていきます。

  1. スイッチ先のアカウントでロールを作成する
  2. CLIでスイッチの設定をする
  3. スイッチ元ユーザーにロールを引き受けるための権限を付与する
  4. CLIでスイッチロールする

1. スイッチ先のアカウントでロールを作成する

まずはスイッチロール用のIAMロールを作成します。
スイッチ先のアカウントにサインイン、もしくはコンソールでスイッチロールして、IAMコンソールに飛びます。
image.png

IAMコンソールでロールをクリックします。
image.png

ロールの作成をクリックします。
image.png

別のAWSアカウントを選択し、スイッチ元のアカウントIDを入力して次に進みます。
image.png

ロールに付与するポリシーを選択します。今回はS3の読み取り権限のみを付与します。
image.png

タグが必要な場合は入力して次に進みます。

ロール名と説明を入力してロールの作成をクリックします。

作成されたロールです。ここのロールARNはCLIでの設定に必要なので控えておきましょう。
image.png

2. CLIでスイッチの設定をする

次にCLI側の設定です。
まずはaws configureを実行し、スイッチ元のIAMユーザを設定します。
image.png

.awsフォルダの中にあるconfigファイルを編集します。
CLIをデフォルト設定でインストールした場合、WindowsであればC:\Users\USERNAME\.aws\configがパスのはずです。
これをテキストエディタなどで開き、以下の内容を追記します。

[profile <任意の名前>]
role_arn = <作成したロールのARN>
source_profile = default

image.png

追記したら保存してCLIの設定は完了です。

※サービスによってはリージョンも設定する必要があるので、必要に応じてconfigファイルに追記してください。

[profile <任意の名前>]
role_arn = <作成したロールのARN>
source_profile = default
region = <リージョン> ←ここ 例:ap-northeast-1

3. スイッチ元ユーザーにロールを引き受けるための権限を付与する

スイッチロールのためにはもう1つ権限設定が必要です。

AWS CLI は source_profile の認証情報を使用してロールのための認証情報をリクエストします。そのため、source_profile として参照されるアイデンティティは、role_arn で指定されたロールの sts:AssumeRole アクセス権限がなければなりません。

つまり、スイッチ元のユーザーがスイッチ用のロールを引き受けるための権限が必要で、この権限をsts:AssumeRole アクセス権限と言います。こちらの権限ですが、AWSの管理ポリシーにはないため、カスタマー管理ポリシーとして作成してユーザーまたはグループにアタッチする必要があります。

まずはスイッチ元のアカウントのIAMダッシュボードでポリシーをクリックします。
image.png

ポリシーの作成をクリックします。
image.png

検索にstsと入力し、検索結果からSTSをクリックします。
image.png

書き込みからAssumeRoleを選択します。
image.png

リソースは指定を選択し、ARNの追加をクリックします。
image.png

ARNを手動でリストをクリックします。
image.png

スイッチ先で作成したロールのARNを入力して追加をクリックします。
image.png

次へ進みます。
image.png

タグが必要な場合はタグをつけて、次へ進みます。

ポリシー名と説明を入力して、ポリシーの作成をクリックします。

ポリシーを作成したら、ユーザーまたはグループにアタッチしましょう。
今回はスイッチ元のユーザーが所属するグループにアタッチします。
image.png

これでスイッチ用のロールをユーザーが引き受けられるようになりました。

4. CLIでスイッチロールする

まずは確認のため、スイッチ元のIAMユーザーでaws s3 lsでのS3のバケット一覧を取得してみます。
※S3バケットの読み取り権限がないとエラーになるので事前に権限を付与しておいてください。
image.png

続いてスイッチロールでスイッチ先のアカウントのS3のバケット一覧を取得してみます。
以下のコマンドを入力します。
aws s3 ls --profile <CLIで設定した任意の名前>
image.png

aws configureでユーザーを切り替えずにスイッチロールで別アカウントのS3のバケット一覧を取得できました。
ここでドキュメントの重要事項を確認しておきます。

IAM ユーザーのアクセス許可および引き受けるロールは、累積されません。同時に有効になるアクセス権限のセットは 1 つのみです。ロールを引き受けると、以前のユーザーまたはロールのアクセス許可が一時的に無効になり、切り替え後のロールに割り当てられたアクセス許可が有効になります。そのロールを終了すると、ユーザーアクセス権限が自動的に復元されます。

スイッチ元のユーザーの権限とスイッチ用のロールに付与されている権限が同時に付与されることはないよという内容です。スイッチロールでは一時的に権限を引き受けているだけだから、スイッチが終われば元の権限に戻ります。今回の手順で例えましょう。

例1:aws s3 ls
これはスイッチ元のユーザーに付与された権限で実行しているので、スイッチ元のアカウントのS3バケットの一覧しか取得できません。

例2:aws s3 ls --profile switch
これはスイッチ先のロールによって一時的に与えらえる権限なので、このロールを使用した時にはこのロールに付与された権限しか与えられません。元のユーザーの権限は一時的に無効になります。 なのでスイッチ先のアカウントのS3バケットの一覧しか取得できません。もう1度aws s3 lsを実行したときにはスイッチではないので元のユーザーの権限に戻ります。

まとめ

今回はAWS CLIによるスイッチロールの実装手順をご紹介しました。
改めて手順をまとめます。

  1. スイッチ先のアカウントでロールを作成する
  2. CLIでスイッチの設定をする
  3. スイッチ元ユーザーにロールを引き受けるための権限を付与する
  4. CLIでスイッチロールする

IAMユーザーは漏洩リスクからできるだけ作成しない方が安全だと言われているので、スイッチロールで不要なユーザーは作らなくても済むケースがあると思います。
今回の内容がどなたかの参考になれば幸いです。