はじめに
以下のチュートリアルを参考にしつつ、シンプルな構成を使って AWS のクロスアカウントアクセスを試してみたメモ。
構成
下図のような構成を想定。
やりたいことをスーパーシンプル三行で説明すると…
- Account xxxx-xxxx-0001 の適切に管理されている S3 バケットに
- Account xxxx-xxxx-0002 の適切な IAM Role が付与されている EC2 から
- 出来るだけ安全にアクセスしたい(とりあえず閲覧出来れば OK)
チュートリアル
Account xxxx-xxxx-0001 の設定
IAM Role
以下の Trust relationships を適用して IAM Role の role-01 を作成する。
$ cat role-01.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::xxxxxxxx0002:role/role-02" }, "Action": "sts:AssumeRole" } ] } $ aws \ --profile ${Account xxxx-xxxx-0001 の PROFILE} \ iam create-role \ --role-name role-01 \ --assume-role-policy-document file://role-01.json \ --query Role.Arn \ --output text
IAM Role に付与するポリシー
role-01 に付与するポリシーは、以下のように S3 バケットのオブジェクトを取得できるだけのポリシー AmazonS3ReadOnlyAccess を付与する。
$ cat policy-01.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "*" } ] } $ aws \ --profile ${Account xxxx-xxxx-0001 の PROFILE} \ iam put-role-policy \ --role-name role-01 \ --policy-name policy-01 \ --policy-document file://policy-01.json
ここはアクセスさせたい対象に応じて設定すれば良いと思う。
Account xxxx-xxxx-0002 の設定
IAM Role
以下の Trust relationships を適用して IAM Role の role-02 を作成する。
$ cat role-02.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } $ aws \ --profile ${Account xxxx-xxxx-0002 の PROFILE} \ iam create-role \ --role-name role-02 \ --assume-role-policy-document file://role-02.json \ --query Role.Arn \ --output text
IAM Role に付与するポリシー
arn:aws:iam::xxxxxxxx0001:role/role-01
に対して AssumeRole
出来るポリシーを付与する。
$ cat policy-02.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::xxxxxxxx0001:role/role-01" } ] } $ aws \ --profile ${Account xxxx-xxxx-0002 の PROFILE} \ iam put-role-policy \ --role-name role-02 \ --policy-name policy-02 \ --policy-document file://policy-02.json
Instance Profile
$ aws \ --profile cloudpack-kappa \ iam create-instance-profile \ --instance-profile-name role-02 $ aws \ --profile cloudpack-kappa \ iam add-role-to-instance-profile \ --instance-profile-name role-02 \ --role-name role-02
最終的にこんな感じ?
こんな感じで図に書くとわかり易い。個人的に。
動作確認
STS に AssumeRole して一時的に認証情報を取得するスクリプト
Account xxxx-xxxx-0002 の EC2 から Account xxxx-xxxx-0001 の S3 バケットにアクセスする為には STS(AWS Security Token Service) に AssumeRole
して一時的に認証情報を取得する必要があるので、以下のような AWS SDK for Go を利用したツールを使って認証情報を取得するツールを噛まして S3 バケットにアクセスしてみる。
Account xxxx-xxxx-0002 の EC2 で以下のように実行する。
./oreno-assume -role_arn arn:aws:iam::xxxxxxxx0001:role/role-01 -command "aws s3 ls s3://foobar/"
Access Denied
oreno-assume
を利用していない場合には、以下のように Access Denied
となる。
$ aws s3 ls s3://foobar/ An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
アクセス OK
Assume Role
してからアクセスすると…以下のようにアクセス出来る。
./oreno-assume -role_arn arn:aws:iam::xxxxxxxx0001:role/role-01 -command "aws s3 ls s3://foobar/" PRE logs/ 2014-07-01 01:29:52 0 404.html 2014-12-05 01:14:23 37 Hello.txt 2014-12-04 23:52:22 87 hello.html 2014-07-01 01:29:52 0 index.html
終わり
クロスアカウントアクセスのポイント
- 信頼する AWS アカウント又は IAM Role 及び IAM User をプリンシパルした IAM Role を作る(チュートリアル中の role-01 を指す)
- ↑で作成した IAM Role にアクセスさせたいリソースへのポリシーを付与する(チュートリアル中の policy-01 を指す)
- 信頼されている AWS アカウント又は IAM Role(チュートリアル中の role-02 のこと)には role-01 に対する Assume Role 権限が付与されたポリシーをアタッチする(チュートリアル中の policy-02 を指す)
ちゃんと用語を理解しきれていないので誤りがあるかもしれないが…思ったりよりも簡単だった。
参考
そして、俺の夏が
はじまる。