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

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

重要

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

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

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

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

注記

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

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

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

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

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

      • IAM コンソール[ダッシュボード] で、[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 コンソールでバケットを作成します。この演習では、米国東部 (バージニア北部) AWS リージョン に example-s3-bucket1 という名前でバケットを作成することを前提とします。

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

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

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

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

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

    このポリシーは、アカウント B に s3:PutObject および s3:ListBucket アクセス許可を付与します。このポリシーはまた、ユーザー Daves3: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:::example-s3-bucket1/*", "arn:aws:s3:::example-s3-bucket1" ] }, { "Sid": "Statement3", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::example-s3-bucket1/*" ] } ] }

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

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

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

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

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

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

    aws s3api put-object-acl --bucket example-s3-bucket1 --key HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBadmin
Tools for Windows PowerShell の使用
  1. Write-S3Object コマンドを使用して、オブジェクトをアップロードします。

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

    Set-S3ACL -BucketName example-s3-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 example-s3-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 example-s3-bucket1 -Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA

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

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

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

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

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

      • IAM コンソールで、[AccountAadmin] ユーザーを削除します。手順については、「IAM ユーザーガイド」の「IAM ユーザーの削除」を参照してください。

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