オブジェクトの所有権の制御とバケットの ACL の無効化。 - Amazon Simple Storage Service

オブジェクトの所有権の制御とバケットの ACL の無効化。

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

Amazon S3 の最新のユースケースの大部分では ACL を使用する必要がなくなっています。そのため、オブジェクトごとに個別にアクセスを制御する必要がある異常な状況を除き、ACL を無効にしておくことをお勧めします。ACL を無効にすると、バケット内のオブジェクトをアップロードしたユーザーに関係なく、ポリシーを使用してバケット内のすべてのオブジェクトへのアクセスをより簡単に制御できます。

オブジェクト所有権には、バケットにアップロードされるオブジェクトの所有権を制御し、ACL を無効または有効化するために使用できる 3 つの設定があります。

ACL の無効化
  • バケット所有者強制 (デフォルト) – ACL は無効になり、バケット所有者はバケット内のすべてのオブジェクトを自動的に所有し、完全に制御します。ACL は、S3 バケット内のデータに対するアクセス許可に対して影響を与えません。バケットは、ポリシーを使用してアクセスコントロールを定義します。

ACL の有効化。
  • 希望するバケット所有者 — バケット所有者は、他のアカウントが bucket-owner-full-control 既定 ACL でバケットに書き込む新しいオブジェクトを所有し、完全にコントロールできます。

  • オブジェクトライター — オブジェクトをアップロードする AWS アカウント は、そのオブジェクトを所有し、そのオブジェクトを完全にコントロールし、ACL を介して他のユーザーにそのオブジェクトへのアクセス権を付与できます。

S3 の最近のユースケースの大部分では、[バケット所有者の強制] 設定を適用して ACL を無効なままにし、必要に応じてバケットポリシーを使用して、アカウント外のユーザーとデータを共有することをお勧めします。このアプローチにより、アクセス許可の管理が簡素化されます。新しく作成されたバケットと既存のバケットの両方で ACL を無効にすることができます。新しく作成されたバケットでは、ACL はデフォルトで無効になっています。既存のバケットに既にオブジェクトが含まれている場合、ACL を無効にすると、オブジェクトとバケット ACL はアクセス評価に含まれなくなり、ポリシーに基づいてアクセスが許可または拒否されます。既存のバケットについては、ACL を無効にした後いつでも再度有効化でき、既存のバケットとオブジェクト ACL が復元されます。

ACL を無効にする前に、バケットポリシーを確認して、アカウント外のバケットへのアクセス権を付与するすべての方法をカバーすることを確認することをお勧めします。ACL を無効にすると、バケットは ACL を指定しない PUT リクエスト、またはバケット所有者のフルコントロール ACL (bucket-owner-full-control で既定の ACL またはこの ACL と同等の XML で表される形式など) を持つ PUT リクエストのみを受け入れます。バケット所有者のフルコントロール ACL をサポートする既存のアプリケーションには影響はありません。他の ACL (特定の AWS アカウント へのカスタム許可など) を含む PUT リクエストは失敗し、AccessControlListNotSupported エラーコードを含む 400 エラーを返します。

それとは対照に、[バケット所有者が推奨] で設定されているバケットは、引き続きバケットおよびオブジェクト ACL を受け入れ、遵守します。この設定では、新しいオブジェクトが bucket-owner-full-control 既定 ACL はオブジェクトライターではなく、バケット所有者によって自動的に所有されます。その他のすべての ACL 動作はそのまま残ります。すべての Amazon S3 PUT 操作に bucket-owner-full-control 既定 ACL を含めるように要求するには、この ACL を使用したオブジェクトのアップロードのみを許可するバケットポリシーを追加できます。

どのオブジェクト所有権設定がバケットに適用されているかを確認するには、Amazon S3 ストレージレンズメトリクスを使用できます。S3 ストレージレンズは、オブジェクトストレージの使用状況とアクティビティを組織全体で可視化するために使用できるクラウドストレージ分析機能です。詳細については、「Using S3 Storage Lens to find Object Ownership settings」(S3 ストレージレンズを使用してオブジェクト所有権の設定を検索する) を参照してください。

注記

Amazon S3 Express One Zone ストレージクラスをディレクトリバケットで使用する方法の詳細については、「ディレクトリバケットと S3 Express One Zone」と「ディレクトリバケットの概要」を参照してください。

オブジェクトの所有権の設定

この表は、各オブジェクト所有権設定が ACL、オブジェクト、オブジェクト所有権、およびオブジェクトアップロードに与える影響を示しています。

設定 適用先 オブジェクトの所有者への影響 ACL への影響 アップロードを受け付けました
バケット所有者強制 (デフォルト) 既存のオブジェクトと新しいオブジェクト バケット所有者はすべてのオブジェクトを所有しています。

ACL は無効になり、バケットへのアクセス権限には影響しません。ACL を設定または更新する要求は失敗します。ただし、ACL の読み取り要求はサポートされています。

バケット所有者は完全な所有権と制御を有しています。

オブジェクトライターには完全な所有権と制御がなくなりました。

バケット所有者の完全制御 ACL を使用したアップロード、または ACL を指定しないアップロード。
バケット所有者推奨。 新しいオブジェクト。 オブジェクトのアップロードが bucket-owner-full-control 既定 ACL を含む場合、バケット所有者はオブジェクトを所有しています。

他の ACL でアップロードしたオブジェクトは、書き込みアカウントによって所有されます。

ACL は更新でき、許可を付与できます。

オブジェクトのアップロードが bucket-owner-full-control 既定 ACL を含む場合、バケット所有者は完全制御アクセスであり、オブジェクトライターは完全制御アクセスではありません。

すべてアップロードします。
オブジェクトライター 新しいオブジェクト オブジェクトライターがオブジェクトを所有します。

ACL は更新でき、許可を付与できます。

オブジェクトライターは完全制御アクセスを有します。

すべてをアップロード

ACL を無効にして導入された変更

オブジェクト所有権に対して [バケット所有者の強制] 設定を適用すると、ACL は無効になり、追加のアクションを実行せずに、バケット内のすべてのオブジェクトを自動的に所有し、完全に制御できます。[バケット所有者の強制] 設定は、新しく作成されたすべてのバケットでデフォルト設定となっています。[バケット所有者の強制] 設定が適用されると、3 つの変更が表示されます。

  • すべてのバケット ACL とオブジェクト ACL が無効になり、バケット所有者としてフルアクセスが付与されます。バケットまたはオブジェクトに対して読み取り ACL リクエストを実行すると、バケット所有者にのみフルアクセスが付与されていることがわかります。

  • バケット所有者は、バケット内のすべてのオブジェクトを自動的に所有し、完全に制御できます。

  • ACL はバケットへのアクセス許可に影響を与えなくなりました。その結果、データのアクセスコントロールは、IAM ポリシー、S3 バケットポリシー、VPC エンドポイントポリシー、組織 SCP などのポリシーに基づいています。

[バケット所有者の強制] 設定を適用して ACL を無効にしたときに発生することを示した図表。

S3 バージョニングを使用する場合、バケット所有者はバケット内のすべてのオブジェクトバージョンを所有し、完全に制御できます。[バケット所有者の強制] 設定を適用しても、オブジェクトの新しいバージョンは追加されません。

新しいオブジェクトをバケットにアップロードできるのは、バケット所有者の完全制御 ACL を使用するか、ACL を指定しない場合のみです。オブジェクトのアップロードは、他の ACL を指定すると失敗します。詳細については、トラブルシューティング を参照してください。

次の AWS Command Line Interface(AWS CLI) を利用した PutObject オペレーションの例には、bucket-owner-full-control 既定 ACL が含まれるため、無効な ACL を持つバケットにオブジェクトをアップロードできます。

aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file --acl bucket-owner-full-control

以下の PutObject オペレーションは ACL を指定しないため、無効な ACL を持つバケットでも成功します。

aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file
注記

アップロード後に他の AWS アカウント が、オブジェクトにアクセスする必要がある場合は、バケットポリシーを介してそれらのアカウントに追加のアクセス許可を付与する必要があります。詳細については、チュートリアル: ポリシーを使用した Amazon S3 リソースへのアクセスの管理 を参照してください。

ACL の再有効化

[バケット所有者の強制] 設定から別のオブジェクト所有権設定にいつでも変更することで ACL を再度有効にできます。[バケット所有者の強制] 設定を適用する前に、許可管理のオブジェクト ACL を使用し、これらのオブジェクト ACL アクセス権限をバケットポリシーに移行しなかった場合は、ACL を再度有効にした後に、これらのアクセス許可が復元されます。さらに、[バケット所有者の強制] 設定が適用されている間にバケットに書き込まれたオブジェクトは、バケット所有者によって所有されます。

例えば、[バケット所有者の強制] から [オブジェクトライター] 設定に戻すと、バケット所有者として、他の AWS アカウント が以前に所有していたオブジェクトを所有できなくなり、完全に制御できなくなります。代わりに、アップロードするアカウントがこれらのオブジェクトを再び所有します。他のアカウントが所有するオブジェクトは、許可用の ACL を使用するため、これらのオブジェクトに許可を与えるためポリシーを使用できません。ただし、[バケット所有者の強制] 設定が適用されている間、バケットに書き込まれたオブジェクトは、バケット所有者として引き続き所有されます。ACL を再度有効にしても、これらのオブジェクトはオブジェクトライターによって所有されません。

AWS Management Console、AWS Command Line Interface (CLI)、REST API、または AWS SDK を使用して ACL を有効化および管理する手順については、ACL の設定 を参照してください。

ACL を無効にする前提条件

既存のバケットの ACL を無効にする前に、以下の前提条件を満たしていることを確認してください。

バケットとオブジェクト ACL を確認し、ACL アクセス権限を移行します。

ACL を無効にすると、バケットおよびオブジェクト ACL によって付与される許可がアクセスに影響しなくなります。ACL を無効にする前に、バケットとオブジェクト ACL を確認します。

バケット ACL がアカウント外の他のユーザーに読み取りまたは書き込みの許可を付与する場合は、[バケット所有者の強制] 設定を適用する前に、これらの許可をバケットポリシーに移行する必要があります。アカウントの外部で読み取りまたは書き込みアクセスを許可するバケット ACL を移行しないと、[バケット所有者の強制] 設定を適用するリクエストが失敗し、InvalidBucketAclWithObjectOwnership エラーコードを返します。

例えば、サーバーアクセスログを受信するバケットの ACL を無効にするには、S3 ログ配信グループのバケット ACL アクセス権限をバケットポリシーのログサービスプリンシパルに移行する必要があります。詳細については、「サーバーアクセスのログ記録用の S3 ログ配信グループへのアクセスを付与する」を参照してください。

オブジェクトライターがアップロードするオブジェクトを完全に制御できるようにするには、オブジェクトライターはユースケースに最適なオブジェクト所有者設定です。個々のオブジェクトレベルでアクセスを制御する場合は、バケット所有者が優先するのが最適です。これらのユースケースはまれです。

ACL を確認して ACL の許可をバケットポリシーに移行するには、ACL を無効にする前提条件。 を参照してください。

承認に ACL を必要としたリクエストを特定する

承認に ACL を必要とした Amazon S3 リクエストを特定するには、Amazon S3 サーバーアクセスログまたは AWS CloudTrail の aclRequired 値を使用します。リクエストが承認に ACL を必要としたか、ACL を指定する PUT リクエストがある場合、文字列は Yes です。ACL が不要であったか、bucket-owner-full-control の既定 ACL を設定するか、リクエストがバケットポリシーで許可されている場合、aclRequired 値の文字列は Amazon S3 サーバーアクセスログでは「-」となり、CloudTrail では存在しません。期待される aclRequired 値の詳細については、「一般的な Amazon S3 リクエストの aclRequired 値」を参照してください。

PutBucketAcl または PutObjectAcl リクエストに ACL ベースのアクセス許可を付与するヘッダーが含まれている場合は、bucket-owner-full-control 既定 ACL を除き、ACL を無効にする前にこれらのヘッダーを削除する必要があります。待機しないと、リクエストは失敗します。

承認に ACL を必要としたその他すべてのリクエストについては、これらの ACL アクセス許可をバケットポリシーに移行します。次に、バケット所有者の強制設定を有効にする前に、バケットの ACL をすべて削除します。

注記

オブジェクトの ACL は削除しないでください。削除すると、アクセス許可をオブジェクトの ACL に依存しているアプリケーションはアクセスできなくなります。

承認に ACL を必要としたリクエストがない場合は、ACL の無効化に進むことができます。リクエストの識別方法の詳細については、「Amazon S3 アクセスログを使用したリクエストの識別」と「CloudTrail を使用した Amazon S3 リクエストの識別」を参照してください。

ACL 関連の条件キーを使用するバケットポリシーを確認および更新します。

[バケット所有者の強制] 設定を適用して ACL を無効にすると、リクエストでバケット所有者の完全制御 ACL が使用されているか、ACL が指定されていない場合にのみ、新しいオブジェクトをバケットにアップロードできます。ACL を無効にする前に、ACL 関連の条件キーのバケットポリシーを確認します。

バケットポリシーが ACL 関連の条件キーを使用して、bucket-owner-full-control 既定 ACL (例えば、s3:x-amz-acl) では、バケットポリシーを更新する必要はありません。次のバケットポリシーでは、s3:x-amz-acl S3 の規定 ACL bucket-owner-full-control リクエストを必要とする PutObject を使用します。このポリシーでは、引き続きオブジェクトライターが bucket-owner-full-control 既定 ACL を指定する必要があります。ただし、ACL が無効になっているバケットは引き続きこの ACL を受け入れるため、クライアント側の変更は不要で、リクエストは引き続き成功します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with bucket owner full control", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/ExampleUser" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }

ただし、バケットポリシーで異なる ACL を必要とする ACL 関連の条件キーを使用する場合は、この条件キーを削除する必要があります。この例のバケットポリシーには、 S3 の public-read ACL を PutObject リクエストして、ACL が無効になる前に更新する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with public read access", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/ExampleUser" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "public-read" } } } ] }

オブジェクトの所有者許可

バケットのオブジェクト所有権設定を適用、更新、または削除するには、s3:PutBucketOwnershipControls 許可が必要です。バケットのオブジェクトの所有権の設定を返すには、s3:GetBucketOwnershipControls 許可が必要です。詳細については、バケットの作成時のオブジェクトの所有権の設定。 および S3 バケットのオブジェクト所有権設定の表示 を参照してください。

すべての新しいバケットの ACL を無効にします。

デフォルトでは、新しく作成されたバケットにはすべて[バケット所有者の強制] 設定が適用されており、ACL は無効になっています。ACL は無効にしておくことをお勧めします。原則として、アクセスコントロールには ACL ではなく S3 リソースベースのポリシー (バケットポリシーとアクセスポイントポリシー) または IAM ポリシーを使用することをお勧めします。ポリシーとは、よりシンプルで柔軟なアクセスコントロールのオプションです。バケットポリシーとアクセスポイントポリシーを使用すると、Amazon S3 リソースに対するすべてのリクエストに広く適用されるルールを定義できます。

レプリケーションとオブジェクトの所有権。

S3 レプリケーションを使用し、ソースバケットと宛先バケットが異なる AWS アカウント に所有されている場合、ACL を無効にして (バケット所有者にオブジェクト所有権の設定を適用して)、レプリカの所有権を宛先バケットを所有する AWS アカウント に変更できます。この設定は、s3:ObjectOwnerOverrideToBucketOwner 許可の必要なく、既存の所有者のオーバーライド動作を模倣します。[バケット所有者の強制] 設定で宛先バケットにレプリケーションされるすべてのオブジェクトは、宛先バケット所有者によって所有されます。レプリケーション設定の所有者上書きオプションの詳細については、レプリカ所有者の変更 を参照してください。

オブジェクトの所有権の設定

オブジェクト所有権の設定は、S3 コンソール、AWS CLI、AWS SDK、Amazon S3 REST API、または AWS CloudFormation を使用して適用できます。以下の REST API と AWS CLI コマンドは、オブジェクトの所有権をサポートしています。

REST API AWS CLI 説明
PutBucketOwnershipControls put-bucket-ownership-controls 既存の S3 バケットのオブジェクト所有権設定を作成または変更します。
CreateBucket create-bucket x-amz-object-ownership リクエストヘッダーを使用してバケットを作成し、オブジェクトの所有権設定を指定します。
GetBucketOwnershipControls get-bucket-ownership-controls Amazon S3 バケットのオブジェクト所有権設定を取り戻します。
DeleteBucketOwnershipControls delete-bucket-ownership-controls Amazon S3 バケットのオブジェクトの所有権の設定を削除します。

オブジェクト所有権設定の適用と操作の詳細については、以下のトピックを参照してください。