S3 のオブジェクト ACL を有効化にするケースまとめ
始めに
猫とアポロチョコと Systems Manager が好きな m.hayakawa です。
現在、S3 バケットの作成時、デフォルトでは ACL 無効化が選択されております。
ACL を無効化することで、S3 へのアクセス許可に関する評価論理がシンプルになることと、現時点でオブジェクト ACL を使用するシーンが限定的なため、基本的には ACL を無効化することが推奨されます。
S3 のオブジェクトACLの無効化が推奨となったので、改めて IAM ポリシーと S3 バケットポリシーの評価論理をまとめてみた | DevelopersIO
しかしながら、S3 の ACL を有効化にするユースケースがいくつかあります。
ユースケース1. CloudFront のアクセスログを S3 に保存する場合
CloudFront のアクセスログの記録は、AWS 内部のアカウントであるawslogsdelivery
が行います。
そのため、バケット ACL でawslogsdelivery
からのアクセスを有効にする必要があります。
標準ログ (アクセスログ) の設定および使用 - Amazon CloudFront
強制を行ったバケット所有者に設定される S3 オブジェクトの所有権を使用して Amazon S3 バケットを選択してはいけません。この設定では、バケットとその中のオブジェクトの ACL が無効になり、CloudFront によるバケットへのログファイルの配信を阻止します。
あえて書きますと、ログ記録に関する設定について、CloudFront のアクセスログの記録以外は、S3 の ACL を有効化する必要はありません。私が調べた限りでは、以下のケースでは ACL が無効の設定で問題がないことを確認しました。
- VPC フローログ
- S3 サーバーアクセスログ
- CloudTrail ログ
- CloudTrail S3 API コールのログ記録
- ELB アクセスログ
- WAF の Web ACL のログ記録
ユースケース2. オブジェクトレベルで権限を管理する必要がある場合
例えば、バケット内の特定のオブジェクトのみ、特定のアカウント ID からのアクセスのみに制限したい場合などは、ACL を有効化する必要があります。
しかし、ACL が制御できるのは以下の 4 パターンのみとなります。
- AWS アカウント
- Amazon S3 の事前定義済みのグループ
- Authenticated Users グループ(すべての AWS アカウントを示します)
- All Users グループ(AWSアカウントに関わらず当該の S3 オブジェクトの URL を知る世界中の誰でもアクセスが可能)
- Log Delivery グループ(S3 のサーバーアクセスログの記録を行うグループであり、AWS内部で用いるものとなります)
そのため、AWS アカウント内の IAM ユーザー/ロールごとにアクセスを制御するといった要件は適さないものとなります。
ユースケース3. AWS Backup の S3 バックアップの復元先の S3 バケットは ACL を有効化する必要がある
AWS Backup の S3 バックアップのリカバリポイントを復元する際に、復元先の S3 バケットは ACL を有効化する必要があります。注意しましょう。
宛先バケットでアクセス制御リスト (ACL) を有効にする必要があります。有効でない場合、ジョブは失敗します。AWS Backupコンソールから作成された S3 バケットは、デフォルトで ACL が無効になっています (Create new bucket オプションを使用して復元すると、ACL が有効化されたバケットが作成されることに注意してください)。
まとめ
ここまで列挙してきましたが、AWSのドキュメントでは以下のような書き方をしています。
アクセスポリシーのガイドライン - Amazon Simple Storage Service
Amazon S3 の最新のユースケースの大部分では ACL を使用する必要がなくなり、オブジェクトごとに個別にアクセスを制御する必要がある異常な状況を除き、ACL を無効にすることをお勧めします。
現状では、CloudFront のアクセスログを S3 に保存する場合、または、AWS Backup の S3 バックアップのリカバリポイントの復元先の S3 バケット以外で、特別な事情がない限りは、ACL を無効化することが望ましいと考えられます。
参考資料
Amazon S3 でオブジェクト ACL を使用するユースケース | AWS re:Post
アクセスポリシーのガイドライン - Amazon Simple Storage Service
CloudFrontのアクセスログ保存用S3バケットにはACL有効化が必要なので注意しよう | DevelopersIO