はじめに
あるIAM Roleの権限が適切かどうか/必要なAWS APIを実行できるか、意図したとおりになっているか確認するためには、通常はPolicy Simulatorを利用することになるかと思います。
IAMPolicy Simulator を使用した IAM ポリシーのテスト
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_testing-policies.html
ただ、一部のリソースベースのPolicyに対応していなかったり、実際に動作させてみないと分からないことがあります。
特に最近困ったのは、ECRのdockerリポジトリに対して、pull/push出来るかどうか直ぐに確認できなかったことです。
このような場合、自分のIAM Userアカウントから対象のIAM RoleをAssumeRoleすることにより、少し簡単に確認することが可能です。
手順概要
- 対象となるIAM RoleのTrust Relationshipsに、自分自身のIAM Entity(User/Role)を追加する
- CLIからAssumeRoleし、temporary credentialsを環境変数にセットする
- 実行できるか確認したいAWS APIを実行する
- Trust Relationshipsから、自分自身のIAM Entity(User/Role)をはずす
動作確認環境・構成
- AWSアカウントID: 999999999999
- Region: ap-northeast-1
- IAM User: test-user(AssumeRoleする権限はあるものとします。)
- IAM Role: test-role (CodeBuild用のRoleとします)
IAM RoleのTrush Relationships
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "codebuild.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
手順詳細
1. 対象となるIAM RoleのTrust Relationshipsに、自分自身のIAM Entity(User/Role)を追加する
AWS Management Consoleから、対象のRoleのTrust Relationshipsを編集します。
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles/test-role?section=trust
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "codebuild.amazonaws.com",
"AWS": "arn:aws:iam::999999999999:user/test-user"
},
"Action": "sts:AssumeRole"
}
]
}
2. CLIからAssumeRoleし、temporary credentialsを環境変数にセットする
aws configureを実行するか環境変数等で、test-userのAccessKey/SecretAccessKeyが利用されるように設定します。
自分自身のIAM User権限でAWS APIが実行されることを確認します。
$ aws sts get-caller-identity
{
"Account": "999999999999",
"UserId": "AIDAXXXXXXXXXXXXXXXXX",
"Arn": "arn:aws:iam::999999999999:user/test-user"
}
AWS CLIからAssumeRoelを実行します。
$ aws sts assume-role --role-arn "arn:aws:iam::999999999999:role/test-role" --role-session-name "you-can-put-any-string"
{
"AssumedRoleUser": {
"AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:you-can-put-any-string",
"Arn": "arn:aws:sts::999999999999:assumed-role/test-role/you-can-put-any-string"
},
"Credentials": {
"SecretAccessKey": "0hq4**********************************",
"SessionToken": "FQoD************************************************************************************************************************************************************************************************************",
"Expiration": "2018-06-08T12:34:56Z",
"AccessKeyId": "ASIAXXXXXXXXXXXXXXXX"
}
}
取得したtemporary credentialsを、下記のように環境変数にセットします。
$ export AWS_ACCESS_KEY_ID="ASIAXXXXXXXXXXXXXXXX"
$ export AWS_SECRET_ACCESS_KEY="0hq4**********************************"
$ export AWS_SESSION_TOKEN="FQoD************************************************************************************************************************************************************************************************************"
3. 実行できるか確認したいAWS APIを実行する
AWS CLIから、確認したいAWS APIを実行します。
今回は、ECR上のDocker Imageをpull出来るかどうかを確認します。
### Docker loginする
$ $(aws ecr get-login --no-include-email --region ap-northeast-1)
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
### Docker pullする
$ docker pull 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/test-docker:latest
4. Trust Relationshipsから、自分自身のIAM Entity(User/Role)をはずす
AWS Management Consoleから、対象のRoleのTrust Relationshipsを編集し、変更前の状態に戻します。
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles/test-role?section=trust