IAMのクロスアカウントアクセスがもやっとしていたので、ドキュメントに沿って試してみました。
##シナリオ
AWSアカウントAのAmazon S3バケットにAWSアカウントBのIAMユーザーからアクセスしてみる、というシナリオです。IAMロールを使用したクロスアカウントアクセスとリソースベースのポリシーを使用したクロスアカウントアクセスをそれぞれ試してみます。
##IAMロールを使用したクロスアカウントアクセス
###準備
- テスト用に2つのアカウントを準備
・アカウントA(アカウントIDを控えておく)
・アカウントB(アカウントIDを控えておく)
- テスト用にバケットを準備
・アカウントA内にバケット(samplexxxx)を作成
- テスト用にIAMユーザーとIAMグループを準備
・アカウントB内にIAMユーザー(User01),グループ(Developers)を作成
・IAMユーザーのアクセスポリシーは指定なし
・グループのアクセスポリシーはPowerUserAccessを指定
###ロールの作成
アカウントAで、アカウントAのsamplexxxxバケットへアクセス可能なロールを作成
Role Name : UpdateApp
Select Role Type : Role for Cross-Account Access-Provide access between AWS
account ID : アカウントBのID
Custom Policy : 以下を指定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::samplexxxx"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::samplexxxx/*"
}
]
}
###IAMグループのアクセスポリシーを変更
アカウントBのDevelopersグループへ、アカウントAのUpdateAPPロールが取得(AssumeRole)できるよう以下のポリシーを追加
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::アカウントAのID:role/UpdateAPP"
}
}
###アカウントBのIAMユーザーUser01からアカウントAのsamplexxxxバケットへアクセス
Amazon CLIを使用してさくっと確認してみる
$ export AWS_ACCESS_KEY_ID=User1のアクセスキーID
$ export AWS_SECRET_ACCESS_KEY=User1のシークレットアクセスキー
$ aws sts assume-role --role-arn arn:aws:iam::アカウントAのID:role/UpdateApp --role-session-name session1(←任意)
{
"AssumedRoleUser": {
"AssumedRoleId": "xxxxxxxxxxxx:session1",
"Arn": "arn:aws:sts::アカウントAのID:assumed-role/UpdateApp/session1"
},
"Credentials": {
"SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Expiration": "2015-01-12T10:10:31Z",
"AccessKeyId": "xxxxxxxxxxxxxxxxx"
}
}
↑assume-roleで一時的なアクセス情報が取得される(AccessKeyId,SecretAccessKey,SessionToken)
$ export AWS_ACCESS_KEY_ID=assume-roleで取得されたAccessKeyIdを指定
$ export AWS_SECRET_ACCESS_KEY=assume-roleで取得されたSecretAccessKeyを指定
$ export AWS_SECURITY_TOKEN=assume-roleで取得されたSessionTokenを指定
$ aws s3 ls s3://samplexxxx
2015-01-12 09:04:39 142164 event.jpg
↑アカウントAのsamplexxxxバケット内のファイルにアクセスできている
###Switch Role機能を使ってアカウントBのIAMユーザーUser01からアカウントAのsamplexxxxバケットへアクセス
AWS management consoleからSwitch Role機能により別アカウントへアクセスできるという機能があるので、そちらも試してみます。
1.アカウントBのIAMユーザーUser01でログインし、[User01@accountID]-[Switch Role]を選択
2.アカウントAのアカウントIDおよびRole名(UpdateApp)とDisplay Name(任意)を入力
ロールを切りかえた場合、このマネジメントコンソール上ではロールで許可されている操作しかできません。今回はアカウントAのsamplexxxxバケットのみ操作できるという状態になります。この機能相当便利なのでは。
##リソースベースのポリシーを使用したクロスアカウントアクセス
###準備
- テスト用に2つのアカウントを準備
・アカウントA
・アカウントB(アカウントIDを控えておく)
- テスト用にバケットを準備
・アカウントA内にバケット(samplexxxx2)を作成
- テスト用にIAMユーザーとIAMグループを準備
・アカウントB内にIAMユーザー(User02),グループ(Testers)を作成
・IAMユーザーのアクセスポリシーは指定なし
・グループのアクセスポリシーはPowerUserAccessを指定
###バケットポリシーを設定
アカウントAのsamplexxxx2バケットへ以下バケットポリシー(samplexxxx2へのアクセス権限をアカウントBに付与)を設定
{
"Version": "2012-10-17",
"Statement": {
"Sid": "AccountBAccess1",
"Effect": "Allow",
"Principal": {"AWS": "アカウントBのID"},
"Action": "s3:\*",
"Resource": [
"arn:aws:s3:::samplexxxx2",
"arn:aws:s3:::samplexxxx2/*"
]
}
}
###IAMグループのアクセスポリシーを変更
アカウントBのIAMグループへアカウントAのsamplexxxx2バケット内をList*できるよう以下のポリシーを追加
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:List*",
"Resource": [
"arn:aws:s3:::samplexxxx2",
"arn:aws:s3:::samplexxxx2/*"
]
},
{
"Effect": "Deny",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::samplexxxx2/*"
}
]
}
↑ここで指定されているsamplexxxx2はアカウントAのバケット
アカウントBに許可されているのはS3に対する全操作権限だが、グループの権限としてはList*のみに制限
###アカウントBのIAMユーザーUser02からアカウントAのsamplexxxx2バケットへアクセス
Amazon CLIを使用してさくっと確認してみる
$ export AWS_ACCESS_KEY_ID=User02のアクセスキーID
$ export AWS_SECRET_ACCESS_KEY=User02のシークレットアクセスキー
$ aws s3 ls s3://samplexxxx2/
2015-01-12 10:20:18 142164 event2.jpg
↑アカウントAのsamplexxxxバケット内のファイルにアクセスできている
以上です。
うむ。ドキュメントどおりなので当然なのですが、IAMが思いどおり動くと嬉しいかぎり。そしてCLI便利ですね。