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

例 2: バケット所有者がクロスアカウントのバケットのアクセス許可を付与する

重要

アクセス許可は、個々のユーザーではなく、IAM ロールに付与することをお勧めします。これを行う方法については、背景: クロスアカウントのアクセス許可と IAM ロールの使用を参照してください。

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

注記

また、バケットポリシーを使用して、アカウント A から直接アカウント B のユーザーにアクセス許可を付与することもできます。ただし、このユーザーには、アカウント B がアカウント A からアクセス許可を付与されていない場合でも、ユーザーが属している親アカウントであるアカウント B からのアクセス許可が必要です。このユーザーがリソース所有者と親アカウントの両方からのアクセス許可を持っている場合にのみ、ユーザーはリソースにアクセスできます。

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

  1. アカウント A の管理者ユーザーは、特定のバケットオペレーションを実行するための、クロスアカウントアクセス許可を付与するバケットポリシーをアカウント B にアタッチします。

    アカウント B の管理者ユーザーは、自動的にこのアクセス許可を継承することに注意してください。

  2. アカウント B の管理者ユーザーは、アカウント A から受け取ったアクセス許可を委任するユーザーポリシーをユーザーにアタッチします。

  3. アカウント B のユーザーは、アカウント A が所有するバケットのオブジェクトにアクセスすることにより、アクセス許可を確認します。

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

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

1111-1111-1111

アカウント A

AccountAadmin

2222-2222-2222

アカウント B

AccountBadmin

ユーザーを作成し、アクセス許可を付与するためのすべてのタスクは、AWS Management Console で実行します。このチュートリアルでは、許可を検証するために、コマンドラインツールの AWS Command Line Interface (CLI) と AWS Tools for Windows PowerShell を使用するので、コードを記述する必要はありません。

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

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

    1. 必要な場合、AWS アカウントにサインアップします。

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

      1. ユーザー AccountAadmin を作成し、セキュリティ認証情報を書き留めます。手順については、IAM ユーザーガイドの「AWS アカウントでの IAM ユーザーの作成」を参照してください。

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

    3. IAM コンソールで、[Dashboard] (ダッシュボード) の [IAM user Sign−In URL] (IAM ユーザーのサインイン URL) を書き留めます。このアカウントのすべてのユーザーは、AWS Management Console にサインインするときにこの URL を使用する必要があります。

      詳細については、IAM ユーザーガイドユーザーがお客様のアカウントにサインインする方法 を参照してください。

    4. 前述のステップを、アカウント B の認証情報を使用してもう一度実行し、管理者ユーザー AccountBadmin を作成します。

  2. AWS Command Line Interface (CLI) または AWS Tools for Windows PowerShell をセットアップします。管理者ユーザーの認証情報は以下のように保存します。

    • AWS CLI を使用する場合、設定ファイルに AccountAadmin と AccountBadmin の 2 個のプロファイルを作成します。

    • AWS Tools for Windows PowerShell を使用する場合、セッションの認証情報を AccountAadmin と AccountBadmin として保存します。

    手順については、チュートリアル例のツールのセットアップ を参照してください。

  3. プロファイルとも呼ばれる、管理者ユーザーの認証情報を保存します。入力する各コマンドで認証情報を指定する代わりにプロファイル名を使用できます。詳細については、チュートリアル例のツールのセットアップ を参照してください。

    1. 2 つのアカウントの管理者ユーザーごとに、AWS CLI の認証情報ファイルでプロファイルを追加します。

      [AccountAadmin] aws_access_key_id = access-key-ID aws_secret_access_key = secret-access-key region = us-east-1 [AccountBadmin] aws_access_key_id = access-key-ID aws_secret_access_key = secret-access-key region = us-east-1
    2. AWS Tools for Windows PowerShell を使用している場合

      set-awscredentials –AccessKey AcctA-access-key-ID –SecretKey AcctA-secret-access-key –storeas AccountAadmin set-awscredentials –AccessKey AcctB-access-key-ID –SecretKey AcctB-secret-access-key –storeas AccountBadmin

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

ステップ 1.1: AWS Management Consoleにサインインする

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

ステップ 1.2: バケットを作成する

  1. Amazon S3 コンソールでバケットを作成します。この演習では、バケットを米国東部 (バージニア北部) リージョンで DOC-EXAMPLE-BUCKET という名前で作成することを前提とします。

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

  2. サンプルオブジェクトをバケットにアップロードします。

    方法については、ステップ 2: バケットにオブジェクトをアップロードする を参照してください。

ステップ 1.3: クロスアカウントアクセス許可を付与するバケットポリシーをアカウント B にアタッチする

このバケットポリシーは、s3:GetLifecycleConfiguration および s3:ListBucket アクセス許可をアカウント B に付与します。これは、AccountAadmin のユーザーの認証情報を使用してコンソールにサインインしていることを前提としています。

  1. 次のバケットポリシーを DOC-EXAMPLE-BUCKET にアタッチします。このポリシーは、アカウント B に s3:GetLifecycleConfiguration および s3:ListBucket アクションのアクセス許可を付与します。

    手順については、Amazon S3 コンソールを使用したバケットポリシーの追加 を参照してください。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:GetLifecycleConfiguration", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ] } ] }
  2. アカウント B (とその管理ユーザー) がオペレーションを実行できることを確認します。

    • AWS CLI の使用

      aws s3 ls s3://DOC-EXAMPLE-BUCKET --profile AccountBadmin aws s3api get-bucket-lifecycle-configuration --bucket DOC-EXAMPLE-BUCKET --profile AccountBadmin
    • AWS Tools for Windows PowerShell の使用

      get-s3object -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBadmin get-s3bucketlifecycleconfiguration -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBadmin

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

次に、アカウント B の管理者はユーザー Dave を作成し、アカウント A から受け取ったアクセス許可を委任します。

ステップ 2.1: AWS Management Consoleにサインインする

アカウント B の IAM ユーザーのサインイン URL を使用し、AccountBadmin ユーザーとして AWS Management Console にサインインします。

ステップ 2.2: アカウント B でユーザー Dave を作成する

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

手順については、IAM ユーザーガイドAWS Management Consoleの IAM ユーザーの作成 () を参照してください。

ステップ 2.3: ユーザー Dave に許可を委任する

以下のポリシーを使用して、ユーザー Dave のインラインポリシーを作成します。バケット名を指定してポリシーを更新する必要があります。

これは、AccountBadmin のユーザーの認証情報を使用してコンソールにサインインしていることを前提としています。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ] } ] }

手順については、IAM ユーザーガイドIAM ポリシーの管理を参照してください。

ステップ 2.4: アクセス許可をテストする

これで、アカウント B の Dave はアカウント A が所有する DOC-EXAMPLE-BUCKET の内容をリストできます。次のいずれかの手順でアクセス許可を確認できます。

AWS CLI によるテスト
  1. AWS CLI の設定ファイルに UserDave プロファイルを追加します。設定ファイルの詳細については、チュートリアル例のツールのセットアップ を参照してください。

    [profile UserDave] aws_access_key_id = access-key aws_secret_access_key = secret-access-key region = us-east-1
  2. コマンドプロンプトで、次の AWS CLI コマンドを入力して、Dave がアカウント A によって所有される DOC-EXAMPLE-BUCKET からオブジェクトリストを取得できることを検証します。このコマンドでは、UserDave プロファイルを指定していることに注意してください。

    aws s3 ls s3://DOC-EXAMPLE-BUCKET --profile UserDave

    Dave には他のアクセス許可はありません。したがって、他のオペレーション (次の get bucket ライフサイクルの設定など) を実行しようとすると、Amazon S3 はアクセス許可の拒否を返信します。

    aws s3api get-bucket-lifecycle-configuration --bucket DOC-EXAMPLE-BUCKET --profile UserDave
AWS Tools for Windows PowerShell によるテスト
  1. Dave の認証情報を AccountBDave という名前で保存します。

    set-awscredentials -AccessKey AccessKeyID -SecretKey SecretAccessKey -storeas AccountBDave
  2. List Bucket コマンドを試してみます。

    get-s3object -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBDave

    Dave には他のアクセス許可はありません。したがって、他のオペレーション (次の get bucket ライフサイクルの設定など) を実行しようとすると、Amazon S3 はアクセス許可の拒否を返信します。

    get-s3bucketlifecycleconfiguration -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBDave

ステップ 3: (オプション) 明示的な拒否を試す

アクセス許可は、ACL、バケットポリシー、およびユーザーポリシーによって付与できます。ただし、バケットポリシーまたはユーザーポリシーによって明示的な拒否が設定されている場合、他のアクセス許可よりも明示的な拒否が優先されます。テストのために、バケットポリシーを更新し、アカウント B の s3:ListBucket アクセス許可を明示的に拒否してみます。このポリシーは、s3:ListBucket アクセス権限も付与していますが、明示的な拒否が優先され、アカウント B またはアカウント B のユーザーは DOC-EXAMPLE-BUCKET 内のオブジェクトをリストできません。

  1. アカウント A のユーザー AccountAadmin の認証情報を使用して、バケットポリシーを次のように置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:GetLifecycleConfiguration", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ] }, { "Sid": "Deny permission", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ] } ] }
  2. ここで AccountBadmin の認証情報を使用してバケットリストを取得しようとすると、アクセスは拒否されます。

    • AWS CLI の使用:

      aws s3 ls s3://DOC-EXAMPLE-BUCKET --profile AccountBadmin
    • AWS Tools for Windows PowerShell の使用:

      get-s3object -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBDave

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

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

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

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

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

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

  2. アカウント B の認証情報を使用して IAM コンソールにサインインします。ユーザー AccountBadmin を削除します。手順については、IAM ユーザーガイドIAM ユーザーの削除 を参照してください。