例 4: バケット所有者が所有権のないオブジェクトへのクロスアカウントアクセス許可を付与する - Amazon Simple Storage Service

例 4: バケット所有者が所有権のないオブジェクトへのクロスアカウントアクセス許可を付与する

この例のシナリオでは、バケット所有者が、オブジェクトをアップロードするためのアクセス許可を他の AWS アカウント に付与します。バケットの S3 オブジェクト所有権にバケット所有者強制設定を適用した場合、別の AWS アカウント によって書き込まれたオブジェクトを含む、バケット内のすべてのオブジェクトを所有します。これにより、バケット所有者であるお客様がオブジェクトを所有していないという問題が解決されます。次に、自分のアカウントまたは他の AWS アカウント アカウントのユーザーにアクセス許可を委任できます。S3 オブジェクト所有権のバケット所有者強制設定が有効になっていないとします。つまり、バケットは、他の AWS アカウントが所有するオブジェクトを含むことができます。

バケット所有者は、オブジェクトの所有者が誰であるかに関係なく、オブジェクトに対するクロスアカウントのアクセス許可を別のアカウントのユーザーに付与しなければならない場合があります。例えば、課金アプリケーションがユーザーとしてオブジェクトのメタデータにアクセスしなければならない場合などです。ここで、主に 2 つの問題が生じます。

  • バケット所有者には、他の AWS アカウントで作成されたオブジェクトに対する許可はありません。バケット所有者が、自分が所有していないオブジェクトに対する許可を付与するには、オブジェクトの所有者 (オブジェクトを作成した AWS アカウント) がまずバケット所有者に許可を付与する必要があります。これで、バケット所有者は、それらのアクセス許可を委任できるようになります。

  • ただし、バケット所有者は、自分のアカウントのユーザーに許可を委任することはできますが (「例 3: バケット所有者が自分の所有していないオブジェクトに対するアクセス許可を付与する」を参照)、他の AWS アカウントに許可を委任することはできません。これは、クロスアカウントの委任がサポートされていないためです。

このシナリオでは、バケット所有者はオブジェクトへの AWS Identity and Access Management アクセス許可を持つ AWS アカウント (IAM) ロールを作成でき、ロールが一時的にバケットのオブジェクトへのアクセスできる別の許可を与えます。

注記

S3 オブジェクト所有権は、Amazon S3 バケットレベルの設定で、バケットにアップロードされる新しいオブジェクト所有権を制御し、ACL を無効にするのに使用できます。デフォルトでは、オブジェクト所有権はバケット所有者の強制設定に設定され、すべての ACL は無効になります。ACL を無効にすると、バケット所有者はバケット内のすべてのオブジェクトを所有し、アクセス管理ポリシーのみを使用してデータへのアクセスを管理します。

Amazon S3 の最新のユースケースの大部分では ACL を使用する必要がなくなっています。オブジェクトごとに個別に制御する必要がある通常ではない状況を除き、ACL は無効にしておくことをお勧めします。ACL を無効にすると、誰がオブジェクトをバケットにアップロードしたかに関係なく、ポリシーを使用してバケット内のすべてのオブジェクトへのアクセスを制御できます。詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化。」を参照してください。

背景: クロスアカウントのアクセス許可と IAM ロールの使用

IAM ロールは、リソースへのアクセスを委任する、いくつかのシナリオで使用されます。なかでも、クロスアカウントアクセスは重要なシナリオです。この例では、バケット所有者 (アカウント A) は、IAM ロールを使用して、他の AWS アカウント (アカウント C) のユーザーに一時的にオブジェクトへのクロスアカウントの許可を委任します。作成された IAM ロールには、次の 2 つのポリシーがアタッチされています。

  • ロールを引き受ける別の AWS アカウントを指定する信頼ポリシー。

  • ロールを引き受けるユーザーに付与されるアクセス許可 (s3:GetObject など) を定義するアクセスポリシー。ポリシーで指定できるアクセス許可のリストについては、Amazon S3 のアクション を参照してください。

信頼ポリシーで指定された AWS アカウントは、アカウントに属するユーザーにロールを引き受ける許可を付与します。ユーザーは、以下の手順でオブジェクトにアクセスします。

  • ロールを引き受け、その応答として一時的なセキュリティ認証情報を取得します。

  • 一時的なセキュリティ認証情報を使用して、バケットのオブジェクトにアクセスします。

IAM ロールの詳細については、IAM ユーザーガイドIAM ロールを参照してください。

この手順の概要を以下に示します。

  1. アカウント A の管理者ユーザーは、バケットポリシーをアタッチし、オブジェクトをアップロードする条件付きのアクセス許可をアカウント B に付与します。

  2. アカウント A の管理者ユーザーは、IAM ロールを作成し、アカウント C との間に信頼を確立します。これで、アカウント C のユーザーはアカウント A にアクセスできるようになります。ロールにアタッチされたアクセスポリシーは、アカウント C のユーザーがアカウント A にアクセスするときに実行できる操作を制限します。

  3. アカウント B の管理者は、アカウント A が所有するバケットにオブジェクトをアップロードし、バケット所有者にフルコントロールのアクセス許可を付与します。

  4. アカウント C の管理者は、ユーザーを作成し、ロールを引き受けるためのユーザーポリシーをアタッチします。

  5. アカウント C のユーザーが初めてロールを引き受けると、一時的なセキュリティ認証情報が返されます。ユーザーは、この一時的な認証情報を使用して、バケットのオブジェクトにアクセスします。

この例では、3 つのアカウントが必要です。次の表に、これらのアカウントの呼び方とそれぞれの管理者ユーザーを示します。IAM のガイドライン (「管理者ユーザーを使用したリソースの作成とアクセス許可の付与について」を参照) に従い、このチュートリアルでは AWS アカウントのルートユーザーの認証情報を使用しません。その代わりに、各アカウントで管理者ユーザーを作成し、その認証情報を使用してリソースを作成し、アクセス許可を付与します。

AWS アカウント ID アカウントの呼び方 アカウントの管理者ユーザー

1111-1111-1111

アカウント A

AccountAadmin

2222-2222-2222

アカウント B

AccountBadmin

3333-3333-3333

アカウント C

AccountCadmin

ステップ 0: チュートリアルの準備をする

注記

テキストエディタを開いて、手順を実行しながら、いくつかの情報を書き留めることができます。特に、コンソールに接続する各アカウントのアカウント ID、正規ユーザー ID、IAM ユーザーのサインイン URL、IAM ユーザーとロールの Amazon リソースネーム (ARN) が必要になります。

  1. 前のセクションの表に示したように、3 つの AWS アカウントがあり、各アカウントに 1 人ずつ管理者ユーザーが存在することを確認します。

    1. 必要に応じて AWS アカウントにサインアップします。ここでは、それぞれのアカウントをアカウント A、アカウント B、アカウント C と呼ぶことにします。

    2. アカウント A の認証情報を使用して、IAM コンソールにサインインし、次の操作を行って管理者ユーザーを作成します。

      • ユーザー AccountAadmin を作成し、セキュリティ認証情報を記録します。ユーザーの追加の詳細については、IAM ユーザーガイドの「AWS アカウントでの IAM ユーザーの作成」を参照してください。

      • AccountAadmin にフルアクセスを許可するユーザーポリシーをアタッチして、管理者権限を付与します。手順については、IAM ユーザーガイドIAM ポリシーの管理を参照してください。

      • IAM コンソールの [ダッシュボード] で、[IAM ユーザーのサインイン URL] を記録します。このアカウントのユーザーは、この URL を使用して AWS Management Console にサインインします。詳細については、IAM ユーザーガイドユーザーがお客様のアカウントにサインインする方法 を参照してください。

    3. 前述の手順を繰り返し、アカウント B およびアカウント C の管理者ユーザーを作成します。

  2. アカウント C では、正規ユーザー ID を書き留めてください。

    アカウント A で IAM ロールを作成したら、信頼ポリシーでアカウント C のアカウント ID を指定して、ロールを引き受けるアクセス許可をアカウント C に付与します。アカウント情報は、次の手順で確認できます。

    1. AWS アカウント ID またはアカウントエイリアス、IAM ユーザー名、パスワードを使用して、Amazon S3 コンソールにサインインします。

    2. バケットの詳細を確認する Amazon S3 バケットの名前を選択します。

    3. [Permissions (アクセス許可)] タブを選択してから、[アクセスコントロールリスト] を選択します。

    4. AWS アカウント のアクセスのセッションで、アカウント 列は c1daexampleaaf850ea79cf0430f33d72579fd1611c97f7ded193374c0b163b6 のような長い識別子です。これが正規ユーザー ID です。

  3. バケットポリシーを作成するときは、次の情報が必要になります。次の値を書き留めてください。

    • アカウント A の正規ユーザー ID – アカウント A の管理者がアカウント B の管理者にオブジェクトをアップロードする条件付きのアクセス許可を付与するとき、オブジェクトに対するフルコントロールを取得するアカウント A のユーザーの正規ユーザー ID を指定します。

      注記

      正規ユーザー ID は、Amazon S3 固有の概念です。64 文字から成る、難読化されたアカウント ID です。

    • アカウント B の管理者のユーザー ARN – ユーザーの ARN は IAM コンソールで確認できます。ユーザーを選択し、[概要] タブでユーザーの ARN を確認します。

      バケットポリシーでは、オブジェクトをアップロードするアクセス許可を AccountBadmin に付与し、ARN を使用してユーザーを指定します。ARN 値の例を示します。

      arn:aws:iam::AccountB-ID:user/AccountBadmin
  4. AWS Command Line Interface (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 Management Consoleにサインインする

アカウント A で IAM ユーザーのサインイン URL を使用して、まず AccountAadmin ユーザーとして AWS Management Console にサインインします。このユーザーはバケットを作成し、ポリシーをアタッチします。

ステップ 1.2: バケットを作成してバケットポリシーをアタッチする

Amazon S3 コンソールで、次の操作を行います。

  1. バケットを作成します。この演習では、バケットの名前を DOC-EXAMPLE-BUCKET1 とします。

    手順については、バケットの作成 を参照してください。

  2. オブジェクトをアップロードする条件付きのアクセス許可をアカウント B の管理者に付与する以下のバケットポリシーをアタッチします。

    DOC-EXAMPLE-BUCKET1AccountB-IDCanonicalUserId-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:::DOC-EXAMPLE-BUCKET1/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=CanonicalUserId-of-AWSaccountA-BucketOwner" } } } ] }

ステップ 1.3: アカウント C にクロスアカウントアクセスを許可する IAM ロールをアカウント A に作成する

IAM コンソールで、ロールを引き受ける権限をアカウント C に付与する IAM ロール (「examplerole」) を作成します。このロールはアカウント A に作成する必要があるため、アカウント A の管理者としてサインインしていることを再度確認してください。

  1. ロールを作成する前に、ロールに必要なアクセス許可を定義する管理ポリシーを準備します。後の手順で、このポリシーをロールにアタッチします。

    1. 左側のナビゲーションペインで [Policies (ポリシー)] をクリックし、[Create Policy (ポリシーの作成)] をクリックします。

    2. [Create Your Own Policy (独自のポリシーを作成)] の横の [Select (選択)] をクリックします。

    3. [Policy Name (ポリシー名)] フィールドに「access-accountA-bucket 」と入力します。

    4. 以下のアクセスポリシーをコピーして、[Policy Document (ポリシードキュメント)] フィールドに貼り付けます。このアクセスポリシーは、ロールに s3:GetObject のアクセス許可を付与するため、アカウント C のユーザーがこのロールを引き受けると、s3:GetObject オペレーションのみを実行できます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" } ] }
    5. [Create Policy (ポリシーの作成)] をクリックします。

      新しいポリシーが管理ポリシーの一覧に表示されます。

  2. 左側のナビゲーションペインで [Roles (ロール)] をクリックし、[Create New Role (新しいロールの作成)] をクリックします。

  3. ロールタイプの選択クロスアカウントアクセスのロールを選択して、所有する AWS アカウント の間のアクセスの提供の隣の [選択] をクリックします。

  4. アカウント C のアカウント ID を入力します。

    このチュートリアルでは、ロールを引き受けるユーザーに多エレメント認証 (MFA) を必須とする必要がないため、このオプションは選択していない状態のままにしておきます。

  5. [Next Step (次のステップ)] をクリックし、そのロールに関連するアクセス許可を設定します。

  6. 作成した access-accountA-bucket ポリシーの横にあるボックスをオンにして、[Next Step (次のステップ)] をクリックします。

    [Review] ページが表示されます。このページで作成前のロールの設定を確認できます。このページで注意する重要な項目は、このロールを使用する必要があるユーザーに送信できるリンクです。ユーザーがこのリンクをクリックすると、[Switch Role] ページがすぐに表示されます。このページには、[Account ID] と [Role Name] がすでに設定されています。このリンクは、クロスアカウントロールの [Role Summary] ページで後で確認することもできます。

  7. ロール名として「examplerole」を入力し、[Next Step (次のステップ)] を選択します。

  8. ロールを確認したら、[Create Role (ロールの作成)] をクリックします。

    examplerole ロールがロールの一覧に表示されます。

  9. ロール名の [examplerole] をクリックします。

  10. [Trust Relationships (信頼関係)] タブを選択します。

  11. [Show policy document (ポリシードキュメントの表示)] をクリックして、表示されている信頼ポリシーが以下のポリシーと一致するか確認します。

    次の信頼ポリシーは、アカウント C との信頼を確立し、sts:AssumeRole アクションを許可します。詳細については、 API リファレンスAWS Security Token ServiceAssumeRole を参照してください。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. 作成した examplerole ロールの Amazon リソースネーム (ARN) を書き留めてください。

    後の手順で、このロールの引き受けを許可するユーザーポリシーを IAM ユーザーにアタッチしますが、ロールは ARN 値で指定します。

ステップ 2: アカウント B のタスクを実行する

アカウント A が所有するバケットの例では、他のアカウントが所有するオブジェクトが必要です。このステップでは、アカウント B の管理者は、コマンドラインツールを使用してオブジェクトをアップロードします。

  • put-object AWS CLI コマンドを使用して、オブジェクトを DOC-EXAMPLE-BUCKET1 にアップロードします。

    aws s3api put-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --body HappyFace.jpg --grant-full-control id="canonicalUserId-ofTheBucketOwner" --profile AccountBadmin

    次の点に注意してください。

    • --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 が実行できるアクション (特に DOC-EXAMPLE-BUCKET1 のオブジェクトを取得すること) を制限します。

ステップ 3.1: アカウント C でユーザーを作成し、examplerole を引き受けるアクセス許可を委任する

  1. アカウント C の IAM ユーザーのサインイン URL を使用し、AccountCadmin ユーザーとして初めて AWS Management Console にサインインします。

  2. IAM コンソールで、ユーザーの Dave を作成します。

    詳細な手順については、「IAM ユーザーガイド」の「AWS Management Console での IAM ユーザーの作成」を参照してください。

  3. Dave の認証情報を書き留めます。Dave は、examplerole ロールを引き受けるのに、これらの認証情報を必要とします。

  4. アカウント A の sts:AssumeRole ロールで examplerole アクセス許可を Dave に委任する Dave IAM ユーザー用のインラインポリシーを作成します。

    1. 左側のナビゲーションペインで、[Users (ユーザー)] をクリックします。

    2. ユーザー名の [Dave] をクリックします。

    3. ユーザー詳細ページで [Permissions (アクセス許可)] タブを選択し、[Inline Policies (インラインポリシー)] セクションを展開します。

    4. [click here (ここをクリック)] (または [Create User Policy (ユーザーポリシーの作成)]) を選択します。

    5. [Custom Policy (カスタムポリシー)] をクリックし、[Select (選択)] をクリックします。

    6. [Policy Name (ポリシー名)] フィールドにポリシーの名前を入力します。

    7. 以下のポリシーをコピーして、[Policy Document (ポリシードキュメント)] フィールドに貼り付けます。

      アカウント A の ID を指定して、ポリシーを更新する必要があります。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::AccountA-ID:role/examplerole" } ] }
    8. [Apply Policy (ポリシーの適用)] をクリックします。

  5. 新しいプロファイル 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 のバケットのオブジェクトにアクセスします。

  1. コマンドプロンプトで、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 test

    AWS Security Token Service (STS) が一時的なセキュリティ認証情報 (アクセスキー ID、シークレットアクセスキー、およびセッショントークン) を返します。

  2. 一時的なセキュリティ認証情報を 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
  3. コマンドプロンプトで、一時的な認証情報を使用して、次の AWS CLI コマンドを実行してオブジェクトにアクセスします。例えば、コマンドで head−object API を指定すると、HappyFace.jpg オブジェクトのオブジェクトメタデータが取得されます。

    aws s3api get-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg SaveFileAs.jpg --profile TempCred

    examplerole にアタッチされているアクセスポリシーでは、アクションが許可されているため、Amazon S3 はリクエストを処理します。バケットの任意のオブジェクトに対して任意のアクションを試してみましょう。

    例えば、get-object-acl のアクションを試すと、このロールではそのアクションは許可されていないため、アクセス許可が拒否されます。

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --profile TempCred

    この例では、ユーザー Dave がロールを引き受け、一時的な認証情報を使用してオブジェクトにアクセスしました。同様に、アカウント C のアプリケーションが DOC-EXAMPLE-BUCKET1 のオブジェクトにアクセスすることも可能です。アプリケーションが一時的なセキュリティ認証情報を取得すれば、アカウント C はこのアプリケーションに examplerole を引き受けるアクセス許可を委任できます。

ステップ 4: クリーンアップする

  1. テストが終了したら、次の手順でクリーンアップを行います。

    1. アカウント A の認証情報を使用して AWS Management Console (AWS Management Console) にサインインし、次の操作を行います。

      • Amazon S3 コンソールで、DOC-EXAMPLE-BUCKET1 にアタッチされているバケットポリシーを削除します。バケットの [Properties (プロパティ)] で、[Permissions (アクセス許可)] セクションのポリシーを削除します。

      • バケットをこの演習のために作成した場合は、Amazon S3 コンソールでオブジェクトを削除してから、バケットを削除します。

      • https://console.aws.amazon.com/iam/ で、アカウント A で作成した examplerole を削除します。詳細な手順については、「IAM ユーザーガイド」の「IAM ユーザーの削除」を参照してください。

      • https://console.aws.amazon.com/iam/ で、AccountAadmin ユーザーを削除します。

  2. アカウント B の認証情報を使用して IAM コンソールにサインインします。ユーザー AccountBadmin を削除します。

  3. アカウント C の認証情報を使用して IAM コンソールにサインインします。AccountCadmin とユーザー Dave を削除します。

関連リソース