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

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

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

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

オブジェクト所有権には、バケットにアップロードされるオブジェクトの所有権を制御し、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 リクエスト、または bucket-owner-full-control XML で表されるこの ACL の既定 ACL または同等の形式などのバケット所有者の完全制御 ACL を持つ PUT リクエストのみを受け入れます。バケット所有者の完全制御 ACL をサポートする既存のアプリケーションには影響はありません。他の ACL (例えば、特定 AWS アカウント のへのカスタム許可) を含む PUT 要求は失敗し、400 エラーコードとともに AccessControlListNotSupported エラーを返します。

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

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

この表は、各オブジェクト所有権設定が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 を指定すると失敗します。詳細については、トラブルシューティング を参照してください。

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

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key key-name --body path-to-file --acl bucket-owner-full-control

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

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key key-name --body path-to-file
注記

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

ACL の再有効化

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

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

ACL を無効にする前提条件

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

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

ACL を無効にすると、バケットおよびオブジェクト ACL によって付与される許可がアクセスに影響しなくなります。ACL を無効にする前に、バケットとオブジェクト ACL を確認します。バケット ACL がアカウント外の他のユーザーに読み取りまたは書き込みの許可を付与する場合は、バケット所有者強制設定を適用する前に、これらの許可をバケットポリシーに移行する必要があります。アカウントの外部で読み取りまたは書き込みアクセスを許可するバケット ACL を移行しないと、バケット所有者強制設定を適用するリクエストが失敗し、InvalidBucketAclWithObjectOwnership エラーコードを戻します。

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

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

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

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:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "public-read" } } } ] }

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

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

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

IAM ポリシーまたは 組織 ポリシーを使用して、ACL を無効にしてすべての新しいバケットを作成するように要求できます。IAM ポリシーまたは組織ポリシーの s3:x-amz-object-ownership 条件キーを使用して、新しく作成されたすべてのバケットで、バケット所有者がオブジェクト所有権の強制設定を要求します。バケット所有者強制設定を要求することで、アカウントまたは組織内のすべての新しいバケットに対して ACL が無効になっていることを確認します。詳細については、すべての新しいバケットの ACL を無効にします (バケット所有者の強制) を参照してください。

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

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

オブジェクト所有権にデフォルトのオブジェクトライター設定を使用するか、宛先バケットにバケット所有者優先設定を適用する場合、Amazon S3 レプリケーション所有者上書きオプションを使用して、レプリケートされたオブジェクトの所有権を宛先バケット所有者に移転できます。

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

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 バケットのオブジェクトの所有権の設定を削除します。

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