AWS サービスに設定する IAM ロールの権限が正しいかどうかを手元の PC 上で試したいことがあったので、IAM ユーザから IAM ロールに成り代わる方法の備忘録。sts:AssumeRole を使って IAM ユーザが IAM ロールを引き受けます。
参考ドキュメント
- AWS CLI を使用して IAM ロールを引き受けるにはどうすればよいですか? - AWS ナレッジセンター
- IAM ユーザーにアクセス許可を委任するロールの作成 - AWS Identity and Access Management
目次
- 特定の IAM ユーザが IAM ロールを引き受けることができるようにする
- AWS CLI で IAM ロールを引き受ける
- 発行されたアクセスキーを環境変数に設定する
- IAM ロールの権限で API 呼び出しができるか確認する
- IAM ロールの引き受けに 2 要素認証を必須とする
特定の IAM ユーザが IAM ロールを引き受けることができるようにする
IAM ユーザが IAM ロールを引き受けることができるように、IAM ロールの信頼関係に IAM ユーザを設定します。ほとんどの場合、すでに AWS のサービスが設定されている(今回は EC2 との信頼関係が設定されている)と思いますので、以下のように追加をします。AWS のアカウント ID と IAM ユーザ名はご自身のものに置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my-user"
},
"Action": "sts:AssumeRole"
}
]
}
AWS CLI で IAM ロールを引き受ける
以下のように実行して、現在の AWS アクセスキーが IAM ロールを引き受ける IAM ユーザであることを確認します。
aws sts get-caller-identity
{
"UserId": "AIDAXXXXXXXXXXXXXXXXX",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/my-user"
}
AWS CLI で sts assume-role
コマンドを実行します。--role-arn
はご自身の IAM ロールに置き換えてください。--role-session-name
はロールを引き受けるユーザ名にすると、CloudTrail のユーザ名のところにここで指定した名前が出てきて、誰が API を呼び出したのかすぐに分かるのでおすすめです。
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/my-role \
--role-session-name my-user \
--duration-seconds 900 \
実行結果。AWS アクセスキーなどが発行されます。このキーはExpiration
の時間まで有効です。
{
"Credentials": {
"AccessKeyId": "ASIAXXXXXXXXXXXXXXXX",
"SecretAccessKey": "CGzyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SessionToken": "IQoJxxxxxxxxxxxxxxxx",
"Expiration": "2022-09-18T03:57:12+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:my-user",
"Arn": "arn:aws:sts::123456789012:assumed-role/my-role/my-user"
}
}
発行されたアクセスキーを環境変数に設定する
さきほど発行されたアクセスキーなどを 3 つの環境変数に設定します。
export AWS_ACCESS_KEY_ID=ASIAXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=CGzyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_SESSION_TOKEN=IQoJxxxxxxxxxxxxxxxx
AWS Profile の場合は以下のコマンドを参考に。
aws configure set aws_access_key_id ASIAXXXXXXXXXXXXXXXX
aws configure set aws_secret_access_key CGzyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws configure set aws_session_token IQoJxxxxxxxxxxxxxxxx
IAM ロールの権限で API 呼び出しができるか確認する
IAM ロールを引き受けられているか確認をします。
aws sts get-caller-identity
{
"UserId": "AROAXXXXXXXXXXXXXXXXX:my-user",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/my-role/my-user"
}
その他、任意の AWS CLI コマンドを実行し、IAM ロールで設定している権限で API 呼び出しができるかどうかを確認します。
aws ec2 descrive-vpcs
IAM ロールの引き受けに 2 要素認証を必須とする
冒頭で紹介した信頼ポリシーを 2 要素認証を通過した IAM ユーザに限定するには以下のようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my-user"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
慣れないうちはここでハマりやすいので、最初は 2 要素認証無しで動作確認をするのがおすすめです。