aws cliで別アカウントのMFA付きロールにAssumeRoleする
タイトルがややこしいですね。
図を書くのが好きなので図にしてみます。
図のように「MFAなしは許さない別アカウントのロール」にaws cliでAssumeRoleする方法を書いていきます。
MFAなしは許さない、とは以下のようなロールを指します。
セキュリティを考えて、AssumeRoleされるロールにはMFAがないと何もさせないようにすることは多いと思います。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
前提を再確認
cliで試す前に、そもそもAssumeRoleができる状態かどうかを再確認します。
【アカウント2側】信頼関係に問題がないか
アカウント2のロールの信頼関係を見て、そもそもアカウント1の特定のユーザがAssumeRoleできる状態かを確認します。
root
なら誰でもAssumeRoleできるので問題ないですね。(※ある意味問題はあります)
user
を指定しているときは、正しいARNか今一度確認しましょう。
【アカウント1側】MFAは設定済みか
AssumeRoleするユーザにはMFAが設定済みか確認します。
【アカウント1側】AssumeRole権限がついているか
ユーザや所属するグループには「アカウント2のRoleにAssumeRoleするポリシー」がアタッチされているか確認します。
こんな感じですね。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::2222222222:role/AccountTwoRole"
}
}
【アカウント1側】コンソールからスイッチロールできるか
cliに行く前にそもそもコンソール上でスイッチロールできるかを試します。
※コンソールログインをしないIAMユーザだったらこれは確認できません。
クラメソさんの記事を引用させていただきます。
cliの設定を行う
前提がクリアできていたら、早速cliでクロスアカウントのAssumeRoleを行う設定をしていきます。
aws configure
コマンドを打ち、発行したアクセスキー/シークレットキーと、リージョンとアウトプット形式を登録します。
$ aws configure
だいたい以下を打ち込む
ap-northeast-1
json
configファイルの編集
~/.aws/config
の中身を編集します。
[default]
region = ap-northeast-1
output = json
# 以下を追記
[profile account2]
role_arn = arn:aws:iam::222222222222:role/AccountTwoRole
mfa_serial = arn:aws:iam::111111111111:mfa/${your-iam-user-name}
source_profile = default
region = ap-northeast-1
編集できたら保存し、コマンドで以下を入力してAssumeRoleできているか確かめます。
※s3のlist bucket権限がある前提です…。
$ aws s3 ls
# アカウント1のバケットリストが出力される
$ aws s3 ls --profile account2
Enter MFA code for arn:aws:iam::111111111111:mfa/${your-iam-user-name}:
# アカウント2のバケットリストが出力される
おわりに
IAMユーザの発行を減らすために、AssumeRoleしか用意しないアカウントもあると思います。
そういう場合に備えて、cliでのクロスアカウントAssumeRoleは覚えておきたいですね!
なお、AssumeRoleするときに一度MFAを打ち込めば一定期間は再入力は求められません。
Discussion