はじめに
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