例 3: バケット所有者が自分の所有していないオブジェクトに対するアクセス許可を付与する - Amazon Simple Storage Service

例 3: バケット所有者が自分の所有していないオブジェクトに対するアクセス許可を付与する

この例のシナリオでは、バケット所有者がオブジェクトへのアクセス許可を付与しますが、バケット内のオブジェクトの一部がバケット所有者によって所有されていません。この例では、バケット所有者は、自分のアカウントのユーザーにアクセス許可を付与しようとしています。

バケット所有者は、他の AWS アカウントにオブジェクトのアップロードを許可できます。デフォルトでは、バケット所有者は別の AWS アカウント によってバケットに書き込まれたオブジェクトを所有しません。オブジェクトは、S3 バケットに書き込むアカウントによって所有されています。バケット所有者がバケット内のオブジェクトを所有していない場合、オブジェクト所有者は最初にオブジェクト ACL を使用してバケット所有者に権限を付与する必要があります。その後、バケット所有者は所有していないオブジェクトに許可を付与できます。詳細については、Amazon S3 のバケットとオブジェクトの所有権 を参照してください。

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

注記

デフォルトでは、別の AWS アカウント がオブジェクトを S3 バケットにアップロードすると、そのアカウント (オブジェクトライター) がオブジェクトを所有し、そのオブジェクトにアクセスでき、ACL を介して他のユーザーにそのオブジェクトへのアクセスを許可できます。オブジェクトの所有権を使用してこのデフォルトの動作を変更し、ACL を無効にして、バケット所有者としてバケット内のすべてのオブジェクトを自動的に所有することができます。その結果、データのアクセスコントロールは、IAM ポリシー、S3 バケットポリシー、仮想プライベートクラウド (VPC) エンドポイントポリシー、AWS Organizations サービスコントロールポリシー (SCP) などのポリシーに基づいています。

Amazon S3 の最新のユースケースの大部分では ACL を使用する必要がなくなり、オブジェクトごとに個別にアクセスを制御する必要がある異常な状況を除き、ACL を無効にすることをお勧めします。オブジェクトの所有権を使用すると ACL を無効にして、アクセスコントロールに関するポリシーに依存できます。ACL を無効にすると、別の AWS アカウント によってアップロードされたオブジェクトを含むバケットを簡単に維持できます。バケット所有者は、バケット内のすべてのオブジェクトを所有し、ポリシーを使用してオブジェクトへのアクセスを管理できます。詳細については、オブジェクトの所有権の制御とバケットの ACL の無効化。 を参照してください。

この例では、バケット所有者がオブジェクト所有権のバケット所有者強制設定を適用していないと仮定します。バケット所有者は、自分のアカウントのユーザーに許可を委任します。この手順の概要を以下に示します。

  1. アカウント A の管理者ユーザーが、2 つのステートメントを持つバケットポリシーをアタッチします。

    • オブジェクトをアップロードするクロスアカウントアクセスをアカウント B に許可します。

    • 自分のアカウントのユーザーにバケット内のオブジェクトへのアクセスを許可します。

  2. アカウント B の管理者ユーザーは、アカウント A が所有するバケットにオブジェクトをアップロードします。

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

  4. アカウント A のユーザーは、所有者に関わりなくバケット内のオブジェクトにアクセスできることを確認します。

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

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

1111-1111-1111

アカウント A

AccountAadmin

2222-2222-2222

アカウント B

AccountBadmin

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

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

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

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

      1. Amazon S3 のページを開き、AWS アカウントの作成を選択します。

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

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

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

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

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

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

  2. AWS CLI または Tools for Windows PowerShell をセットアップします。管理者認証情報を必ず次のように保存してください。

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

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

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

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

アカウント A に対して、次の手順を実行します。

ステップ 1.1: コンソールにサインインする

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

ステップ 1.2: バケットとユーザーを作成し、ユーザーにアクセス許可を付与するバケットポリシーを追加する

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

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

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

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

  3. Dave の認証情報を書き留めます。

  4. Amazon S3 コンソールで、次のバケットポリシーを DOC-EXAMPLE-BUCKET1 バケットにアタッチします。手順については、Amazon S3 コンソールを使用したバケットポリシーの追加 を参照してください。バケットポリシーを追加するには、このステップに従います。アカウント ID を確認する方法については、AWS アカウント ID の検索 を参照してください。

    このポリシーは、アカウント B に s3:PutObject および s3:ListBucket アクセス許可を付与します。このポリシーはまた、ユーザー Dave に s3:GetObject アクセス許可を付与します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1" ] }, { "Sid": "Statement3", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ] } ] }

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

これでアカウント B はアカウント A のバケットに対するオペレーション実行のアクセス許可を得ましたので、管理者は次の作業を行います。

  • アカウント A のバケットにオブジェクトをアップロードします。

  • バケット所有者であるアカウント A にそのバケットへのフルコントロールをオブジェクトの ACL で付与します。

AWS CLI の使用

  1. put-object CLI コマンドを使用して、オブジェクトをアップロードします。アップロードするソースファイルは、コマンドの − -bodyパラメータで指定します。例えば、ファイルが Windows マシンの C: ドライブにある場合、c:\HappyFace.jpg のように指定します。--key パラメータは、オブジェクトのキー名を指定します。

    aws s3api put-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --body HappyFace.jpg --profile AccountBadmin
  2. バケット所有者に対するオブジェクトのフルコントロールの許可をオブジェクト ACL に追加します。正規ユーザー ID を検索する方法については、AWS アカウントの正規ユーザー ID を検索するには を参照してください。

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBadmin

Tools for Windows PowerShell の使用

  1. Write-S3Object Tools for Windows PowerShell のコマンドを使用して、オブジェクトをアップロードします。

    Write-S3Object -BucketName DOC-EXAMPLE-BUCKET1 -key HappyFace.jpg -file HappyFace.jpg -StoredCredentials AccountBadmin
  2. バケット所有者に対するオブジェクトのフルコントロールの許可をオブジェクト ACL に追加します。

    Set-S3ACL -BucketName DOC-EXAMPLE-BUCKET1 -Key HappyFace.jpg -CannedACLName "bucket-owner-full-control" -StoredCreden

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

アカウント A のユーザー Dave が、アカウント B が所有するオブジェクトにアクセスできることを確認します。

AWS CLI の使用

  1. ユーザー Dave の認証情報を AWS CLI の設定ファイルに追加して、新しいプロファイル UserDaveAccountA を作成します。詳細については、チュートリアル例のツールのセットアップ を参照してください。

    [profile UserDaveAccountA] aws_access_key_id = access-key aws_secret_access_key = secret-access-key region = us-east-1
  2. get-object CLI コマンドを実行して HappyFace.jpg をダウンロードし、ローカルに保存します。--profile パラメータを追加して、ユーザー Dave の認証情報を指定します。

    aws s3api get-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg Outputfile.jpg --profile UserDaveAccountA

Tools for Windows PowerShell の使用

  1. ユーザー Dave の AWS 認証情報を、UserDaveAccountA という名前で永続的ストアに保存します。

    Set-AWSCredentials -AccessKey UserDave-AccessKey -SecretKey UserDave-SecretAccessKey -storeas UserDaveAccountA
  2. Read-S3Object コマンドを実行して HappyFace.jpg オブジェクトをダウンロードし、ローカルに保存します。-StoredCredentials パラメータを追加して、ユーザー Dave の認証情報を指定します。

    Read-S3Object -BucketName DOC-EXAMPLE-BUCKET1 -Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA

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

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

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

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

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

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

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