Amazon S3 バケットでパブリックに (匿名で) 所有されているオブジェクトの所有権を変更する方法を教えてください。

最終更新日: 2021 年 7 月 23 日

Amazon Simple Storage Service (Amazon S3) バケットには、パブリック (匿名) 所有権を持つオブジェクトがあります。AWS アカウントがオブジェクトを所有するようにオブジェクトの所有権を変更する方法を教えてください。

簡単な説明

デフォルトでは、Amazon S3 のオブジェクトの所有者はオブジェクトをアップロードした ID です。つまり、バケットへのパブリック書き込みアクセスを許可する場合、パブリック (匿名) ユーザーがアップロードしたオブジェクトの所有者はパブリックということになります。セキュリティの問題を防ぐには、バケットへのパブリックアクセスをブロックすることがベストプラクティスです

匿名ユーザーがすでにオブジェクトをバケットにアップロード済みで、そのオブジェクトの所有権を変更する場合は、オブジェクトの ACL を変更します。オブジェクトの ACL を変更して、バケット所有者 (AWS アカウント) にオブジェクトのフルコントロールを付与します。

注: Amazon S3 のオブジェクトの所有権を使用して、別の AWS アカウントによってアップロードされたオブジェクトの所有権を制御することもできます

解決方法

オブジェクトの所有権をバケットを所有する AWS アカウントに変更するには、次の手順に従います。

1.    オブジェクト ACL を追加するには、AWS コマンドラインインターフェイス (AWS CLI) を使用して put-object-acl コマンドを実行します。バケット所有者にオブジェクトのコントロールを付与する ACL を追加するには、-acl オプションを bucket-owner-full-control 値とともに含めます。次に、-no-sign-request オプションを含めて、リクエストに匿名の認証情報を使用します。必要なオプションを含む完全な put-object-acl コマンドは、次のようになります。

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key awsexampleobject  --acl bucket-owner-full-control   --no-sign-request

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

2.    所有権の変更を適用するには、オブジェクトをそれ自体にコピーする必要があります。これを行うには、次のような cp コマンドを実行します。

aws s3 cp s3://DOC-EXAMPLE-BUCKET/awsexampleobject  s3://DOC-EXAMPLE-BUCKET/awsexampleobject --storage-class STANDARD

注: サンプルコマンドの --storage-class 値を、お客様のユースケースに適用できるストレージクラスに変更してください。さらに、オブジェクトに必要な他の cp コマンドオプションを含めるようにしてください。

3.    所有権の変更を確認するには、次のように get-object-acl コマンドを実行します。

aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key awsexampleobject

コマンドは、次のようなオブジェクトの所有者を表示する出力を返します。

{
    "Owner": {
        "DisplayName": "jane",
        "ID": "75050348ef85628a0977bexamplebdbc3062ce76f35cb463345ae65c2608d099"
    },
    "Grants": [
        {
            "Grantee": {
                "DisplayName": "jane",
                "ID": "75050348ef85628a0977bexamplebdbc3062ce76f35cb463345ae65c2608d099",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }]}

4.    バケットでバージョニングが有効になっている場合は、ステップ 2 で cp コマンドから生成されたオブジェクトの以前のバージョンも削除する必要があります。以前のオブジェクトバージョンには、パブリック (匿名) 所有権があります。このオブジェクトバージョンを削除するには、まずバケットで list-object-versions コマンドを実行します。結果をフィルタリングしてパブリック所有権を持つオブジェクトを表示するには、コマンドの --prefix オプションを含めます。

aws s3api list-object-versions --bucket DOC-EXAMPLE-BUCKET --prefix example.txt

コマンド出力から、パブリック所有権を持つオブジェクトバージョンのバージョン ID をコピーします。その後、削除するバージョン ID について delete-object コマンドを実行します。

aws s3api delete-object --bucket DOC-EXAMPLE-BUCKET --key example.txt --version-id 'example.d6tjAKF1iObKbEnNQkIMPjj'

警告: バージョン ID がパブリック所有権を持つオブジェクトバージョンのバージョン ID であることを確認してください。オブジェクトバージョンを削除した場合は取得できません。