はじめに

AWSを利用するにあたり、IAMユーザーやIAM Roleの権限管理は非常に重要となります。
aws-vaultを使用して中央管理アカウントに存在するIAMユーザーからMFA認証を突破し、他アカウントにAssumeRole後、コマンド実行できるように設定します。

イメージ

手順

アカウントA、アカウントBにIAM Roleを作成

アカウントA、アカウントBそれぞれのアカウントでIAM Roleを作成します。
AWSアカウント > 別のアカウントを選択し、アカウントIDに中央管理アカウントのAWS アカウントIDを入力します。
MFAが必要のチェックボックスにもチェックを入れます。

任意のポリシーをアタッチ後、ロールの作成が完了したらARNを控えておきます。
ここではReadOnlyAccessとしています。

※IAM Roleの信頼されたエンティティを以下のように設定することでAssumeRoleさせるユーザーを制限できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "<AssumeRoleさせるIAMユーザーのARN>"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}

アカウントAにIAM Roleの作成が完了後、アカウントBにも同様の手順で作成します。

中央管理アカウントにIAMユーザーを作成

アカウントA、アカウントBにAssumeRoleするIAMユーザーを中央管理アカウントに作成します。
マネジメントコンソールにはアクセスしないのでチェックは外します。

IAMユーザー作成後、アクセスキー、MFAを設定します。

MFA設定後に表示される識別子を控えておきます。

作成したIAMユーザーにアカウントA、アカウントBにAssumeRole可能な権限を与えるため、以下IAM Policyを作成、アタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "<アカウントAに作成したIAM RoleのARN>",
                "<アカウントBに作成したIAM RoleのARN>"
            ]
        }
    ]
}

aws-vaultをインストール

MACではbrew caskにてインストールします。

$ brew install --cask aws-vault

以下コマンドにてインストールされているかどうか確認できます。

$ aws-vault --version

認証情報の追加

aws-vaultを使用して以下コマンドで中央管理アカウントに作成したIAMユーザーのアクセスキー、シークレットアクセスキーを設定します。

$ aws-vault add central-account
Enter Access Key ID: XXXXXXXXXXXXXXXXXXXX
Enter Secret Access Key:
Added credentials to profile "central-account" in vault

$ aws-vault ls
Profile                  Credentials              Sessions
=======                  ===========              ========
central-account          central-account      

実行後、~/.aws/configを確認すると以下が追記されています。

[profile central-account]

~/.aws/configの編集

~/.aws/configを以下のように編集します。
role_arnとmfa_serialには前の手順で控えたものを記載します。

[profile central-account]
source_profile=central-account
region=ap-northeast-1 #任意のリージョンに設定
output=json
mfa_serial=arn:aws:iam::111111111111:mfa/central-account-user

[profile account-a]
include_profile=central-account
role_arn=arn:aws:iam::222222222222:role/account-a-assume-role

[profile account-b]
include_profile=central-account
role_arn=arn:aws:iam::333333333333:role/account-b-assume-role

コマンド実行

アカウントAにAWS CLIのコマンドを実行してみます。
実行するとMFAが聞かれるので入力します。

$ aws-vault exec account-a -- aws s3 ls
Enter MFA code for arn:aws:iam::111111111111:mfa/central-account-user:<mfaコード>

MFA入力後、キーチェーンのパスワード入力を求められるので任意のパスワードを入力し、設定します。
ここで入力したパスワードはセッション最大時間が切れると求められるので控えておきましょう。

AWS CLIだけではなく、Terraformの実行も可能です。

$ aws-vault exec account-a -- terraform plan