例 4: バケット所有者が所有権のないオブジェクトへのクロスアカウントアクセス許可を付与する
トピック
この例のシナリオでは、バケットの所有者が、オブジェクトをアップロードするためのアクセス許可を他の AWS アカウントに付与します。つまり、バケットには、他の AWS アカウントが所有するオブジェクトが含まれることになります。
バケットの所有者は、オブジェクトの所有者が誰であるかに関係なく、オブジェクトに対するクロスアカウントのアクセス許可を別のアカウントのユーザーに付与しなければならない場合があります。たとえば、課金アプリケーションがユーザーとしてオブジェクトのメタデータにアクセスしなければならない場合などです。ここで、主に 2 つの問題が生じます。
-
バケット所有者には、他の AWS アカウントで作成されたオブジェクトに対するアクセス許可はありません。バケット所有者が、自分が所有していないオブジェクトに対するアクセス許可を付与するには、オブジェクトの所有者が (オブジェクトを作成した AWS アカウント) まずバケット所有者にアクセス許可を付与しなければなりません。これで、バケット所有者は、それらのアクセス許可を委任できるようになります。
-
ただし、バケット所有者は、自分のアカウントのユーザーにアクセス許可を委任することはできますが (「例 3: バケット所有者が自分の所有していないオブジェクトに対するアクセス許可をユーザーに付与する 」を参照)、他の AWS アカウントにアクセス許可を委任することはできません。これは、クロスアカウントの委任がサポートされていないためです。
そのため、この場合は、バケット所有者はオブジェクトへのアクセス許可を持つ AWS Identity and Access Management (IAM) ロールを作成し、そのロールを一時的に引き受けるアクセス許可を他の AWS アカウントに付与します。これにより、その AWS アカウントはバケットのオブジェクトにアクセスできるようになります。
背景: クロスアカウントのアクセス許可と IAM ロールの使用
IAM ロールは、リソースへのアクセスを委任する、いくつかのシナリオで使用されます。なかでも、クロスアカウントアクセスは重要なシナリオです。この例では、バケット所有者 (アカウント A) は、IAM ロールを使用して、他の AWS アカウント (アカウント C) のユーザーに一時的にオブジェクトへのクロスアカウントのアクセス許可を委任します。作成された IAM ロールには、次の 2 つのポリシーがアタッチされています。
-
ロールを引き受ける別の AWS アカウントを指定する信頼ポリシー。
-
ロールを引き受けるユーザーに付与されるアクセス許可 (
s3:GetObject
など) を定義するアクセスポリシー。ポリシーで指定できるアクセス許可のリストについては、「Amazon S3 のアクション」を参照してください。
信頼ポリシーで指定された AWS アカウントは、アカウントに属するユーザーにロールを引き受けるアクセス許可を付与します。ユーザーは、以下の手順でオブジェクトにアクセスします。
-
ロールを引き受け、その応答として一時的なセキュリティ認証情報を取得します。
-
一時的なセキュリティ認証情報を使用して、バケットのオブジェクトにアクセスします。
IAM ロールの詳細については、IAM ユーザーガイドの「IAM ロール」を参照してください。
この手順の概要を以下に示します。

-
アカウント A の管理者ユーザーは、バケットポリシーをアタッチし、オブジェクトをアップロードする条件付きのアクセス許可をアカウント B に付与します。
-
アカウント A の管理者ユーザーは、IAM ロールを作成し、アカウント C との間に信頼を確立します。これで、アカウント C のユーザーはアカウント A にアクセスできるようになります。ロールにアタッチされたアクセスポリシーは、アカウント C のユーザーがアカウント A にアクセスするときに実行できる操作を制限します。
-
アカウント B の管理者は、アカウント A が所有するバケットにオブジェクトをアップロードし、バケット所有者にフルコントロールのアクセス許可を付与します。
-
アカウント C の管理者は、ユーザーを作成し、ロールを引き受けるためのユーザーポリシーをアタッチします。
-
アカウント C のユーザーが初めてロールを引き受けると、一時的なセキュリティ認証情報が返されます。ユーザーは、この一時的な認証情報を使用して、バケットのオブジェクトにアクセスします。
この例では、3 つのアカウントが必要です。次の表に、これらのアカウントの呼び方とそれぞれの管理者ユーザーを示します。IAM のガイドライン (「管理者ユーザーを使用したリソースの作成とアクセス許可の付与について」を参照) に基づいて、この説明ではアカウントのルート認証情報を使用しません。その代わりに、各アカウントに管理者ユーザーを作成し、その認証情報を使用してリソースを作成し、アクセス許可を付与します。
AWS アカウント ID | アカウントの呼び方 | アカウントの管理者ユーザー |
---|---|---|
|
アカウント A |
AccountAadmin |
|
アカウント B |
AccountBadmin |
|
アカウント C |
AccountCadmin |
ステップ 0: チュートリアルの準備をする
テキストエディタを開いて、手順を実行しながら、いくつかの情報を書き留めることができます。特に、アカウント ID、正規ユーザー ID、アカウントがコンソールに接続するための IAM ユーザーのサインイン URL、IAM ユーザーの Amazon リソースネーム (ARN)、およびロールの情報は後で必要になります。
-
前のセクションの表に示したように、3 つの AWS アカウントがあり、各アカウントに 1 人ずつ管理者ユーザーが存在することを確認します。
-
必要に応じて、AWS アカウントにサインアップします。ここでは、それぞれのアカウントをアカウント A、アカウント B、アカウント C と呼ぶことにします。
-
https://aws.amazon.com/s3/
に移動し、[Create an AWS Account (今すぐ無料サインアップ)] をクリックします。 -
画面上の指示に従ってください。
アカウントがアクティブになり、使用可能な状態になったら、AWS から E メールで通知が届きます。
-
-
アカウント A の認証情報を使用して、IAM コンソール
にサインインし、次の操作を行って管理者ユーザーを作成します。 -
ユーザー AccountAadmin を作成し、セキュリティ認証情報を記録します。ユーザーの追加の詳細については、IAM ユーザーガイドの「AWS アカウントでの IAM ユーザーの作成」を参照してください。
-
AccountAadmin にフルアクセスを許可するユーザーポリシーをアタッチして、管理者権限を付与します。手順については、IAM ユーザーガイドの「IAM ポリシーの管理」を参照してください。
-
IAM コンソールの [Dashboard (ダッシュボード)] で、[IAM User Sign-In URL (IAM ユーザーのサインイン URL)] の内容を書き留めます。このアカウントのユーザーは、AWS マネジメントコンソールにサインインするときにこの URL を使用する必要があります。詳細については、IAM ユーザーガイドの「IAM ユーザーが AWS アカウントにサインインする方法」を参照してください。
-
-
前述の手順を繰り返し、アカウント B およびアカウント C の管理者ユーザーを作成します。
-
-
アカウント C では、正規ユーザー ID を書き留めてください。
アカウント A で IAM ロールを作成したら、信頼ポリシーでアカウント C のアカウント ID を指定して、ロールを引き受けるアクセス許可をアカウント C に付与します。アカウント情報は、次の手順で確認できます。
-
AWS アカウント ID またはアカウントエイリアス、IAM ユーザー名、パスワードを使用して、Amazon S3 コンソール
にサインインします。 -
バケットの詳細を確認する Amazon S3 バケットの名前を選択します。
-
[Permissions (アクセス許可)] タブを選択してから、[アクセスコントロールリスト] を選択します。
-
[Access for your AWS account (AWS アカウントのアクセス権)] セクションの [Account (アカウント)] 列に、
c1daexampleaaf850ea79cf0430f33d72579fd1611c97f7ded193374c0b163b6
のような長い識別子が表示されています。これが正規ユーザー ID です。
-
-
バケットポリシーを作成するときは、次の情報が必要になります。次の値を書き留めてください。
-
アカウント A の正規ユーザー ID – アカウント A の管理者がアカウント B の管理者にオブジェクトをアップロードする条件付きのアクセス許可を付与するとき、オブジェクトに対するフルコントロールを取得するアカウント A のユーザーの正規ユーザー ID を指定します。
注記 正規ユーザー ID は、Amazon S3 固有の概念です。64 文字から成る、難読化されたアカウント ID です。
-
アカウント B の管理者のユーザー ARN – ユーザーの ARN は、IAM コンソールで確認できます。ユーザーを選択し、[Summary (概要)] タブでユーザーの ARN を確認します。
バケットポリシーでは、オブジェクトをアップロードするアクセス許可を AccountBadmin に付与し、ARN を使用してユーザーを指定します。ARN 値の例を示します。
arn:aws:iam::
AccountB-ID
:user/AccountBadmin
-
-
AWS コマンドラインインターフェイス (CLI) または AWS Tools for Windows PowerShell をセットアップします。管理者ユーザーの認証情報は以下のように保存します。
-
AWS CLI を使用する場合、設定ファイルに AccountAadmin と AccountBadmin のプロファイルを作成します。
-
AWS Tools for Windows PowerShell を使用する場合、セッションの認証情報を AccountAadmin と AccountBadmin として保存します。
手順については、「チュートリアル例のツールのセットアップ」を参照してください。
-
ステップ 1: アカウント A のタスクを実行する
この例では、アカウント A はバケットの所有者です。したがって、アカウント A のユーザー AccountAadmin は、バケットを作成し、オブジェクトをアップロードするアクセス許可をアカウント B の管理者に付与するバケットポリシーをアタッチします。次に、IAM ロールを作成して、このロールを引き受けてバケットのオブジェクトにアクセスするアクセス許可をアカウント C に付与します。
ステップ 1.1: AWS マネジメントコンソールにサインインする
アカウント A の IAM ユーザーのサインイン URL を使用して、AccountAadmin ユーザーとして初めて AWS マネジメントコンソールにサインインします。このユーザーはバケットを作成し、ポリシーをアタッチします。
ステップ 1.2: バケットを作成してバケットポリシーをアタッチする
Amazon S3 コンソールで、次の操作を行います。
-
バケットを作成します。この演習では、バケットの名前を
examplebucket
とします。手順については、Amazon Simple Storage Service コンソールユーザーガイドの「S3 バケットを作成する方法」を参照してください。
-
オブジェクトをアップロードする条件付きのアクセス許可をアカウント B の管理者に付与する以下のバケットポリシーをアタッチします。
examplebucket
、AccountB-ID
、およびCanonicalUserId-of-AWSaccountA-BucketOwner
の値はご自分の値に置き換えて、ポリシーを更新してください。{ "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountB-ID
:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1
/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID
:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1
/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=CanonicalUserId-of-AWSaccountA-BucketOwner
" } } } ] }
ステップ 1.3: アカウント C にクロスアカウントアクセスを許可する IAM ロールをアカウント A に作成する
IAM コンソールで、ロールを引き受ける権限をアカウント C に付与する IAM ロール ("examplerole") を作成します。このロールはアカウント A に作成する必要があるため、アカウント A の管理者としてサインインしていることを再度確認してください。
-
ロールを作成する前に、ロールに必要なアクセス許可を定義する管理ポリシーを準備します。後の手順で、このポリシーをロールにアタッチします。
-
左側のナビゲーションペインで [Policies (ポリシー)] をクリックし、[Create Policy (ポリシーの作成)] をクリックします。
-
[Create Your Own Policy (独自のポリシーを作成)] の横の [Select (選択)] をクリックします。
-
[Policy Name (ポリシー名)] フィールドに「
access-accountA-bucket
」と入力します。 -
以下のアクセスポリシーをコピーして、[Policy Document (ポリシードキュメント)] フィールドに貼り付けます。このアクセスポリシーは、ロールに
s3:GetObject
のアクセス許可を付与するため、アカウント C のユーザーがこのロールを引き受けると、s3:GetObject
オペレーションのみを実行できます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::
awsexamplebucket1
/*" } ] } -
[Create Policy (ポリシーの作成)] をクリックします。
新しいポリシーが管理ポリシーの一覧に表示されます。
-
-
左側のナビゲーションペインで [Roles (ロール)] をクリックし、[Create New Role (新しいロールの作成)] をクリックします。
-
[Select Role Type (ロールタイプの選択)] で [Role for Cross-Account Access (クロスアカウントアクセスのロール)] を選択し、[Provide access between AWS accounts you own (所有している AWS アカウント間のアクセスを提供します)] の横にある [Select (選択)] ボタンをクリックします。
-
アカウント C のアカウント ID を入力します。
このチュートリアルでは、ロールを引き受けるユーザーに多要素認証 (MFA) を必須とする必要がないため、このオプションは選択していない状態のままにしておきます。
-
[Next Step (次のステップ)] をクリックし、そのロールに関連するアクセス許可を設定します。
-
作成した
access-accountA-bucket
ポリシーの横にあるボックスをオンにして、[Next Step (次のステップ)] をクリックします。[Review] ページが表示されます。このページで作成前のロールの設定を確認できます。このページで注意する重要な項目は、このロールを使用する必要があるユーザーに送信できるリンクです。ユーザーがこのリンクをクリックすると、[Switch Role] ページがすぐに表示されます。このページには、[Account ID] と [Role Name] がすでに設定されています。このリンクは、クロスアカウントロールの [Role Summary] ページで後で確認することもできます。
-
ロール名として「
examplerole
」を入力し、[Next Step (次のステップ)] を選択します。 -
ロールを確認したら、[Create Role (ロールの作成)] をクリックします。
examplerole
ロールがロールの一覧に表示されます。 -
ロール名の [
examplerole
] をクリックします。 -
[Trust Relationships (信頼関係)] タブを選択します。
-
[Show policy document (ポリシードキュメントの表示)] をクリックして、表示されている信頼ポリシーが以下のポリシーと一致するか確認します。
次の信頼ポリシーは、アカウント C との信頼を確立し、
sts:AssumeRole
アクションを許可します。詳細については、AWS Security Token Service API Reference の「AssumeRole」を参照してください。{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountC-ID
:root" }, "Action": "sts:AssumeRole" } ] } -
作成した
examplerole
ロールの Amazon リソースネーム (ARN) を書き留めてください。後の手順で、このロールの引き受けを許可するユーザーポリシーを IAM ユーザーにアタッチしますが、ロールは ARN 値で指定します。
ステップ 2: アカウント B のタスクを実行する
アカウント A が所有する examplebucket には、他のアカウントが所有するオブジェクトをアップロードする必要があります。このステップでは、アカウント B の管理者は、コマンドラインツールを使用してオブジェクトをアップロードします。
-
put-object AWS CLI コマンドを使用して、オブジェクトを
examplebucket
にアップロードします。aws s3api put-object --bucket
examplebucket
--keyHappyFace.jpg
--bodyHappyFace.jpg
--grant-full-control id="canonicalUserId-ofTheBucketOwner
" --profileAccountBadmin
次の点に注意してください。
-
--Profile
パラメータは AccountBadmin のプロファイルを指定しているため、オブジェクトはアカウント B によって所有されます。 -
grant-full-control
パラメータは、バケットポリシーに従って、バケットの所有者にオブジェクトに対するフルコントロールのアクセス許可を付与します。 -
--body
パラメータは、アップロードするソースファイルを指定します。たとえば、ファイルが Windows コンピュータの C: ドライブにある場合は、「c:\HappyFace.jpg
」と指定します。
-
ステップ 3: アカウント C のタスクを実行する
これまでの手順で、アカウント A はすでに examplerole
ロールを作成し、アカウント C との信頼を確立しています。これにより、アカウント C のユーザーは、アカウント A にアクセスすることができます。このステップでは、アカウント
C の管理者がユーザー (Dave) を作成し、アカウント A から取得した sts:AssumeRole
のアクセス許可を委任します。examplerole
を引き受けた Dave は、一時的にアカウント A へのアクセス権を取得します。アカウント A がロールにアタッチしたアクセスポリシーは、アカウント A にアクセスする
Dave が実行できるアクション (特に examplebucket
のオブジェクトを取得すること) を制限します。
ステップ 3.1: アカウント C でユーザーを作成し、examplerole
を引き受けるアクセス許可を委任する
-
アカウント C の IAM ユーザーのサインイン URL を使用して、AccountCadmin ユーザーとして初めて AWS マネジメントコンソールにサインインします。
-
IAM コンソールで、ユーザー Dave を作成します。
手順については、IAM ユーザーガイドの「IAM ユーザーの作成 (コンソール)」を参照してください。
-
Dave の認証情報を書き留めます。Dave は、
examplerole
ロールを引き受けるのに、これらの認証情報を必要とします。 -
アカウント A の
sts:AssumeRole
ロールでexamplerole
アクセス許可を Dave に委任する Dave IAM ユーザー用のインラインポリシーを作成します。-
左側のナビゲーションペインで、[Users (ユーザー)] をクリックします。
-
ユーザー名の [Dave] をクリックします。
-
ユーザー詳細ページで [Permissions (アクセス許可)] タブを選択し、[Inline Policies (インラインポリシー)] セクションを展開します。
-
[click here (ここをクリック)] (または [Create User Policy (ユーザーポリシーの作成)]) を選択します。
-
[Custom Policy (カスタムポリシー)] をクリックし、[Select (選択)] をクリックします。
-
[Policy Name (ポリシー名)] フィールドにポリシーの名前を入力します。
-
以下のポリシーをコピーして、[Policy Document (ポリシードキュメント)] フィールドに貼り付けます。
アカウント A の ID を指定して、ポリシーを更新する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::
AccountA-ID
:role/examplerole" } ] } -
[Apply Policy (ポリシーの適用)] をクリックします。
-
-
新しいプロファイル AccountCDave を追加して、Dave の認証情報を AWS CLI の設定ファイルに保存します。
[profile AccountCDave] aws_access_key_id =
UserDaveAccessKeyID
aws_secret_access_key =UserDaveSecretAccessKey
region = us-west-2
ステップ 3.2: ロール (examplerole) を引き受けてオブジェクトにアクセスする
Dave は、以下の手順でアカウント A が所有するバケットのオブジェクトにアクセスできます。
-
Dave は、まず自分の認証情報を使用して、
examplerole
を引き受けます。一時的な認証情報が返されます。 -
この一時的な認証情報を使用して、アカウント A のバケットのオブジェクトにアクセスします。
-
コマンドプロンプトで、AccountCDave プロファイルを使用して、AWS CLI の
assume-role
コマンドを次のように実行します。examplerole
が定義されている部分でアカウント A の ID を指定して、コマンドの ARN 値を更新する必要があります。aws sts assume-role --role-arn arn:aws:iam::
accountA-ID
:role/examplerole --profile AccountCDave --role-session-name testAWS Security Token Service (STS) が一時的なセキュリティ認証情報 (アクセスキー ID、シークレットアクセスキー、およびセッショントークン) を返します。
-
一時的なセキュリティ認証情報を
TempCred
プロファイルの AWS CLI 設定ファイルに保存します。[profile TempCred] aws_access_key_id =
temp-access-key-ID
aws_secret_access_key =temp-secret-access-key
aws_session_token =session-token
region = us-west-2 -
コマンドプロンプトで、一時的な認証情報を使用して、次の AWS CLI コマンドを実行してオブジェクトにアクセスします。たとえば、コマンドで head-object API を指定すると、
HappyFace.jpg
オブジェクトのオブジェクトメタデータが取得されます。aws s3api get-object --bucket
examplebucket
--keyHappyFace.jpg
SaveFileAs.jpg
--profile TempCredexamplerole
にアタッチされているアクセスポリシーでは、アクションが許可されているため、Amazon S3 はリクエストを処理します。バケットの任意のオブジェクトに対して任意のアクションを試してみましょう。たとえば、
get-object-acl
のアクションを試すと、このロールではそのアクションは許可されていないため、アクセス許可が拒否されます。aws s3api get-object-acl --bucket
examplebucket
--keyHappyFace.jpg
--profile TempCredこの例では、ユーザー Dave がロールを引き受け、一時的な認証情報を使用してオブジェクトにアクセスしました。同様に、アカウント C のアプリケーションが
examplebucket
のオブジェクトにアクセスすることも可能です。アプリケーションが一時的なセキュリティ認証情報を取得すれば、アカウント C はこのアプリケーションにexamplerole
を引き受けるアクセス許可を委任できます。
ステップ 4: クリーンアップする
-
テストが終了したら、次の手順でクリーンアップを行います。
-
アカウント A の認証情報を使用して、AWS マネジメントコンソール (AWS マネジメントコンソール
) にサインインし、次の操作を行います。 -
Amazon S3 コンソールで、
examplebucket
にアタッチされているバケットポリシーを削除します。バケットの [Properties (プロパティ)] で、[Permissions (アクセス許可)] セクションのポリシーを削除します。 -
バケットをこの演習のために作成した場合は、Amazon S3 コンソールでオブジェクトを削除してから、バケットを削除します。
-
IAM コンソールで、アカウント A で作成した
examplerole
を削除します。 -
IAM コンソールで、AccountAadmin ユーザーを削除します。
-
-
-
アカウント B の認証情報を使用して、AWS マネジメントコンソール (AWS マネジメントコンソール
) にサインインします。IAM コンソールで、ユーザー AccountBadmin を削除します。 -
アカウント C の認証情報を使用して、AWS マネジメントコンソール (AWS マネジメントコンソール
) にサインインします。IAM コンソールで、ユーザー AccountCadmin とユーザー Dave を削除します。
関連リソース
-
IAM ユーザーガイドの「IAM ユーザーにアクセス権限を委任するロールの作成」
-
IAM ユーザーガイドの「IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任」
-
IAM ユーザーガイドの「IAM ポリシーの管理」