メニュー
Amazon Simple Storage Service
開発者ガイド (API Version 2006-03-01)

例 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 など)を定義するアクセスポリシー。ポリシーで指定できるアクセス許可のリストについては、「ポリシーでのアクセス許可の指定」を参照してください。

信頼ポリシーで指定された 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 アカウント 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 と呼ぶことにします。

      1. https://aws.amazon.com/s3/ にアクセスし、[Create an AWS Account] をクリックします。

      2. 画面上の指示に従ってください。

        アカウントがアクティブになり、使用可能な状態になったら、AWS から E メールで通知が届きます。

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

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

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

      • IAM コンソールの [Dashboard] で、[IAM User Sign-In URL] の内容を書き留めます。このアカウントのユーザーは、この URL を使用して AWS マネジメントコンソール にサインインします。詳細については、『IAM ユーザーガイド』の「 ユーザーが アカウントにサインインする方法」を参照してください。

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

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

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

    1. https://aws.amazon.com/ にアクセスし、[My Account/Console] ドロップダウンメニューの [Security Credentials] を選択します。

    2. 適切なアカウント認証情報を使用して、サインインします。

    3. [Account Identifiers] をクリックし、[AWS Account ID] と [Canonical User ID] の内容を書き留めます。

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

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

      注記

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

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

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

      Copy
      arn:aws:iam::AccountB-ID:user/AccountBadmin
  4. 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 Management Console にサインイン

アカウント A の IAM ユーザーのサインイン URL を使用し、AccountAadmin ユーザーとして初めて AWS マネジメントコンソール にサインインします。このユーザーはバケットを作成し、ポリシーをアタッチします。

ステップ 1.2: バケットの作成とバケットポリシーのアタッチ

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

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

    手順については、「S3 バケットを作成する方法」(Amazon Simple Storage Service コンソールユーザーガイド) を参照してください。

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

    examplebucketAccountB-ID、および CanonicalUserId-of-AWSaccountA-BucketOwner の値はご自分の値に置き換えて、ポリシーを更新してください。

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

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

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 オペレーションのみを実行できます。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::examplebucket/*" } ] }
    5. [Create Policy] をクリックします。

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

  2. 左側のナビゲーションペインで [Roles] をクリックし、[Create New Role] をクリックします。

  3. ロール名として「examplerole」を入力し、[Next Step] を選択します。

  4. [Select Role Type] で [Role for Cross-Account Access] を選択し、[Provide access between AWS accounts you own] の横にある [Select] ボタンをクリックします。

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

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

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

  7. 作成した access-accountA-bucket ポリシーの横にあるチェックボックスをオンにして、[Next Step] をクリックします。

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

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

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

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

  10. [Trust Relationships] タブを選択します。

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

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

    Copy
    { "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 が所有する examplebucket には、他のアカウントが所有するオブジェクトをアップロードする必要があります。このステップでは、アカウント B の管理者は、コマンドラインツールを使用してオブジェクトをアップロードします。

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

    Copy
    aws s3api put-object --bucket examplebucket --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 が実行できるアクション(特に examplebucket のオブジェクトを取得すること)を制限します。

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

  1. アカウント C の IAM ユーザーのサインイン URL を使用し、AccountCadmin ユーザーとして初めて AWS マネジメントコンソール にサインインします。

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

    手順については、『IAM ユーザーガイド』の「IAM ユーザーの作成 (AWS マネジメントコンソール)」を参照してください。

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

  4. アカウント A の examplerole ロールで sts:AssumeRole アクセス権限を 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 を指定して、ポリシーを更新する必要があります。

      Copy
      { "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 の設定ファイルに保存します。

    Copy
    [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 値を更新する必要があります。

    Copy
    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 設定ファイルに保存します。

    Copy
    [profile TempCred] aws_access_key_id = temp-access-key-ID aws_secret_access_key = temp-secret-access-key aws_security_token = security-token region = us-west-2
  3. コマンドプロンプトで、一時的な認証情報を使用して次の AWS CLI コマンドを実行し、オブジェクトにアクセスします。たとえば、コマンドで head-object API を指定すると、HappyFace.jpg オブジェクトのオブジェクトメタデータが取得されます。

    Copy
    aws s3api get-object --bucket examplebucket --key HappyFace.jpg SaveFileAs.jpg --profile TempCred

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

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

    Copy
    aws s3api get-object-acl --bucket examplebucket --key HappyFace.jpg --profile TempCred

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

手順 4: クリーンアップ

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

    1. アカウント A の認証情報を使用して AWS マネジメントコンソール(AWS マネジメントコンソール)にサインインし、次の操作を行います。

      • Amazon S3 コンソールで、examplebucket にアタッチされているバケットポリシーを削除します。バケットの [Properties] で、[Permissions] セクションのポリシーを削除します。

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

      • IAM コンソールで、アカウント A で作成した examplerole を削除します。

      • IAM コンソールで、AccountAadmin ユーザーを削除します。

  2. アカウント B の認証情報を使用して AWS マネジメントコンソール(AWS マネジメントコンソール)にサインインします。IAM コンソールで、ユーザー AccountBadmin を削除します。

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

関連リソース