share facebook facebook twitter menu hatena pocket slack

2017.08.02 WED

俺のチュートリアル 2017 夏 〜 チュートリアルで学ぶ IAM Role によるクロスアカウントアクセス 〜

川原 洋平

WRITTEN BY 川原 洋平

はじめに

以下のチュートリアルを参考にしつつ、シンプルな構成を使って AWS のクロスアカウントアクセスを試してみたメモ。

チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management
AWS アカウントの API アクセスを別のアカウントの AWS Identity and Access Management (IAM) ユーザーに委任する手順について説明します。(1/4)

docs.aws.amazon.com

構成

下図のような構成を想定。

やりたいことをスーパーシンプル三行で説明すると…

  • 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 バケットにアクセスしてみる。

gist.github.com

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 を指す)

ちゃんと用語を理解しきれていないので誤りがあるかもしれないが…思ったりよりも簡単だった。

参考


docs.aws.amazon.com

【そんなときどうする?】別のアカウントにセキュアにアクセスしたい! いまさらきけないSTSとは?
この記事は1年以上前に書かれたものです。内容が古い可能性がありますのでご注意ください。  こんにちは。CS課の...

blog.serverworks.co.jp

そして、俺の夏が

はじまる。

元記事はこちら

俺のチュートリアル 2017 夏 〜 チュートリアルで学ぶ IAM Role によるクロスアカウントアクセス 〜

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。