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

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

重要

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

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

注記

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

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

ある AWS アカウント がアカウントのリソースへのアクセス許可を別の AWS アカウント に付与している状況を描いた図。
  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 を使用するので、コードを記述する必要はありません。

チュートリアルの準備をする

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

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

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

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

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

    3. IAM コンソールの [ダッシュボード]IAM ユーザーサインイン URL をメモします このアカウントのすべてのユーザーは、AWS Management Console にサインインするときにこの URL を使用する必要があります。

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

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

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

    • AWS CLI を使用する場合は、設定ファイルに AccountAadminAccountBadmin の 2 つのプロファイルを作成します。

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

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

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

    1. 2 つのアカウントの管理者ユーザー (AccountAadmin および AccountBadmin) のそれぞれの 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 コンソールでバケットを作成します。この演習では、米国東部 (バージニア北部) AWS リージョン に amzn-s3-demo-bucket という名前でバケットを作成することを前提とします。

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

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

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

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

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

  1. 次のバケットポリシーを amzn-s3-demo-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:::amzn-s3-demo-bucket" ] } ] }
  2. アカウント B (とその管理ユーザー) がオペレーションを実行できることを確認します。

    • AWS CLI を使用して検証する

      aws s3 ls s3://amzn-s3-demo-bucket --profile AccountBadmin aws s3api get-bucket-lifecycle-configuration --bucket amzn-s3-demo-bucket --profile AccountBadmin
    • AWS Tools for Windows PowerShell を使用して検証する

      get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBadmin get-s3bucketlifecycleconfiguration -BucketName amzn-s3-demo-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 ユーザーガイド」の「IAM ユーザーの作成 (コンソール)」を参照してください。

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

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

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

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }

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

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

これで、アカウント B の Dave はアカウント A が所有する amzn-s3-demo-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 によって所有される amzn-s3-demo-bucket からオブジェクトリストを取得できることを検証します。このコマンドでは、UserDave プロファイルを指定していることに注意してください。

    aws s3 ls s3://amzn-s3-demo-bucket --profile UserDave

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

    aws s3api get-bucket-lifecycle-configuration --bucket amzn-s3-demo-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 amzn-s3-demo-bucket -StoredCredentials AccountBDave

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

    get-s3bucketlifecycleconfiguration -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave

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

アクセスコントロールリスト (ACL)、バケットポリシー、またはユーザーポリシーを使用して、アクセス許可を付与できます。ただし、バケットポリシーまたはユーザーポリシーによって明示的な拒否が設定されている場合、他のアクセス許可よりも明示的な拒否が優先されます。テストのために、バケットポリシーを更新し、アカウント B の s3:ListBucket アクセス許可を明示的に拒否してみます。このポリシーでは、s3:ListBucket アクセス許可も付与されます。ただし、明示的な拒否が優先され、アカウント B またはアカウント B のユーザーは amzn-s3-demo-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:::amzn-s3-demo-bucket" ] }, { "Sid": "Deny permission", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }
  2. ここで AccountBadmin の認証情報を使用してバケットリストを取得しようとすると、アクセスは拒否されます。

    • AWS CLI を使用して、次のコマンドを実行します。

      aws s3 ls s3://amzn-s3-demo-bucket --profile AccountBadmin
    • AWS Tools for Windows PowerShell を使用して、次のコマンドを実行します。

      get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave

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

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

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

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

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

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

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