🪣

2023年4月28日以降Amazon S3のデフォルトObjectOwnershipがBucketOwnerEnforcedに変更

2023/06/02に公開

2023年4月28日以降Amazon S3の新しいデフォルトセキュリティ設定の変更が完了

DevelopersIO BASECAMP参加者の加藤です。

2023年4月28日「Amazon S3 は新規バケットすべてに 2 つのセキュリティベストプラクティスをデフォルトで適用開始」となりました。

私が観測出来た範囲に限定していますが、影響について書いていきます!


過去に作成したテンプレートを利用してS3を作成してみるとエラーが発生

過去に作成したS3バケットリソースを含むテンプレートを実行してみた所、以下のようなエラーが発生しリソースが「CREATE FAILED」となりました。

「ObjectOwnershipのBucketOwnerEnforcedの設定で、BucketにACLを設定することはできません。」
Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting.

この時点で作成したS3バケットのプロパティですが、ログ用バケットを想定していた為、以下を明示的に指定しています。

作成したリソースの問題部分
      AccessControl: LogDeliveryWrite

一方で、エラー文から読み取れるもう一つの要素である、「オブジェクトのオーナーシップ」に関わる設定は明示的に指定していない(=デフォルト)の状態でした。

以下、Bucket OwnershipControls > Bucket OwnershipControlsRuleと辿ると、現在許可される値は以下3つのようです。



また「オブジェクトの所有権の制御とバケットの ACL の無効化」の説明では、



と、3つの値の意味する所について説明がありました。


作成済みのS3バケットの「オブジェクト所有者」を確認

今度は実際に作成されているバケットの「アクセス許可 > オブジェクト所有者」をそれぞれ確認してみたいと思います。

2023年6月2日現在デフォルト(ACL 無効 (推奨))で作成したバケット

ドキュメントの説明通りでした。(↓この部分)


2023年6月2日現在(ACL 有効)で作成したバケット


2022年以前に作成されたバケット

一点補足をすると、最後の「2022年以前に作成されたバケット」は「cf-templates-xxxxxxxxxxxxx-ap-northeast-1」であり、私が手動で作成したものではなくCloudFormationテンプレートを選択リージョンで初めて実行した際に自動作成されるバケットです。

その為、実はデフォルトの値は別にあるが、AWS側が明示的に「オブジェクトライター」を指定して作成されたバケットである、という可能性を考え、

2023年6月現在、未利用リージョン(大阪)で新たにCloudFormationでテンプレートを実行し、作成された同バケットを確認した所「バケット所有者強制」でした。懸念していたような事はなかったという結果と考えます。

以上から、2023年の変更前は「オブジェクトライター」がデフォルトのバケット作成時の値だったのではないかと判断しました。(間違っているとご指摘をいただいた場合はすぐに修正反映いたします。)


問題のエラーの発生原因(現時点での理解)

2022年4月28日日変更以前にOwnershipControlsを明示的に設定しなかった場合の実際の値
      AccessControl: LogDeliveryWrite
      OwnershipControls:
        Rules:
          - ObjectOwnership: ObjectWriter

対して、

2022年4月28日日変更以降にOwnershipControlsを明示的に設定しなかった場合の実際の値
      AccessControl: LogDeliveryWrite
      OwnershipControls:
        Rules:
          - ObjectOwnership: BucketOwnerEnforced

と設定した事となり、これに対して

「ObjectOwnershipのBucketOwnerEnforcedの設定で、BucketにACLを設定することはできません。」

というエラーを発していた という事のようです。


対処

今度は明示的にOwnershipControlsをObjectWriterに指定
      AccessControl: LogDeliveryWrite
      OwnershipControls:
        Rules:
          - ObjectOwnership: ObjectWriter

これで元々意図していたのと同じになり、無事エラーは起きずリソースは作成されました!(やったね!)


考えてみると

今回の話題ですが、特にCloudFront用にログバケットを指定した時などはACLが有効でないとS3のAccessControlをPrivateなどにする対応ではCLoudFrontリソースがCREATED FAILEDを起こしスタック作成がコケてしまいます。(ここは確認出来ていませんが、そんな事をするとそもそもログ保存されないかもしれませんが。)
https://dev.classmethod.jp/articles/cloudfront-access-log-dont-choose-no-acl-s3-bucket/

なので、結果「AccessControl: LogDeliveryWriteを設定する場合は明示的にObjectWriterを指定する」というのが正解かと思いますが、

考えてみると「そもそものAccessControlのそれぞれの許容値の意味をきちんと把握していないな。」(なんなら「ログ用のバケット=LogDeliveryWriteなんだな。」)位に思っていましたが、

ちゃんと勉強すべきと感じました。

という事で見つけた、一番わかりやすかった記事は以下になります。
https://dev.classmethod.jp/articles/how-cfn-s3-acl-is-shown-on-the-management-console/

上記記事は忘れる度にアクセスしそうな気がします。


終わりに

以上でした。

認識間違いの部分や、「もっとこうした方がいいよ」等あれば確認後、適宜修正・補足反映しますので是非ご指摘いただければ幸いです。

お読みいただき有難うございました。


参考にしたページ

https://stackoverflow.com/questions/76097031/aws-s3-bucket-cannot-have-acls-set-with-objectownerships-bucketownerenforced-s
https://github.com/aws/aws-cdk/issues/25288

(他にもこんなエラーが観測されているようです。)
https://dev.classmethod.jp/articles/s3-acl-error-from-202304/

デベキャン

Discussion