S3初心者向け『例 2 : バケット所有者がクロスアカウントのバケットのアクセス許可を付与』をやってみた

2019.08.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

大阪オフィスのちゃだいんです。

手を動かして学ぶために、公式ドキュメントのチュートリアルをやってみました。

今回も、Amazon S3です。前回の続編で、内容は以下のものです。

例 2: バケット所有者がクロスアカウントのバケットのアクセス許可を付与 - Amazon Simple Storage Service

ある AWS アカウント (たとえば、アカウント A) で、バケットやオブジェクトなど、そのリソースにアクセスするためのアクセス許可を、別の AWS アカウント (アカウント B) に付与できます。アカウント B では、そのアカウントのユーザーに、付与されたアクセス許可を委任できます。この例のシナリオでは、バケット所有者が、特定のバケットオペレーションを実行するためのクロスアカウントアクセス許可を別のアカウントに付与します。

前提条件

AWS CLIが使用できる環境で行ってます。

また、2つのアカウントはドキュメントと同様に以下のように記載します。

AWSアカウントID アカウントの呼び方 アカウントの管理者ユーザー
1111-1111-1111 アカウント A AccountAadmin
2222-2222-2222 アカウント B AccountBadmin

早速やってみた

1. S3バケットを作成する

  • まずは、AccountA側にS3バケットを作成します。

  • バケット名を190827testbucketとして、作成しました。

2. バケットポリシーを付与する

  • 作成したバケットにポリシーを付与します。

  • 明示的にAccountBからのアクセスを許可するポリシーを記載します。

  • ポリシーの内容はこちら。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Example permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:root"
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::190827testbucket"
        }
    ]
}
  • 実際にS3のコンソールにて下記にように挿入します。

3.AccountBのユーザーを作成する

  • ドキュメントの流れとは少し違いますが、ここでAccountAのバケットにアクセスする、AccountBTestAdminBTestUserBを作成します。

  • AccountBのroot権限にてIDとパスワードを使って、マネジメントコンソールにログインします。

  • IAMコンソールを開き、TestAdminBユーザーを作成します。

  • ユーザーを作成後、アクセスキーとシークレットアクセスキーをダウンロードします。(下図の例はTestUserBで行ってます)

  • これで、TestAdminBが作成できました。

  • 同様の手順でTestUserBも作成します。

4. IAMユーザーにポリシーを付与する

  • まずはTestAdminBadmin権限を付与します。

  • これはデフォルトで存在するものを使用します。

  • AdministratorAccessTestAdminBにアタッチしました。

  • 次に、TestUserBにドキュメントに記載のポリシーを付与します。

  • インラインポリシーはIAMユーザーの画面から作成することができます。

  • ポリシーの内容はこんな感じです。
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Example",
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::190827testbucket"
         ]
      }
   ]
}
  • コンソールに入れるとこんな感じです。

  • インラインポリシーですが、一応名前をつけます。

  • これで準備はできました。

5.テスト

  • まずは、AccountBTestAdminBAccountAのバケットにアクセスできるか試してみます。

  • 先ほどダウンロードしたアクセスキーとシークレットアクセスキーを、~/.aws/credentialsに書き込んでおきます。

[AccountBadmin]
aws_access_key_id = access-key-ID
aws_secret_access_key = secret-access-key

[AccountBuser]
aws_access_key_id = access-key-ID
aws_secret_access_key = secret-access-key
  • では、実際にlsコマンドを実行すると、ちゃんとバケットの中身が見れました。
$ aws s3 ls s3://190827testbucket --profile accountBadmin
2019-08-27 21:00:04    1817289 SpiceCurry.jpg
  • (記事には書いてませんがバケットにSpiceCurrry.jpgという画像をアップロードしてました。)

  • さて、TestAdminBがいけたのはよしとして、TestUserBはどうでしょう?

  • 先ほどのコマンドのprofileオプションを変えます。

$ aws s3 ls s3://190827testbucket --profile accountBuser
2019-08-27 21:00:04    1817289 SpiceCurry.jpg
  • ちゃんとTestUserBでもいけましたね。

  • ちなみにじゃあTestUserBのインラインポリシーを削除するとどうなるでしょうか?

  • ひと思いにポリシーを削除します。

  • もう一度さっきと同じコマンドを実行します。
$ aws s3 ls s3://190827testbucket --profile accountBuser

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
  • ちゃんと拒否されましたね。よってTestUserBについては、インラインポリシーにて許可されていることがわかりました。

感想

この記事を見てるだけだとピンとこないかもですが、ちゃんと異なるAWSアカウントからアクセスできたというのは、個人的には「おおっ」ってなりました。

両者のポリシーの設定だけで、簡単にクロスアカウントのアクセスを実現することができました。

誰かのお役に立てば幸いです。それではまた、大阪オフィスのちゃだいんでした。