AWS S3のバケットポリシーとACLの違い

目次

S3のバケットポリシーとACLの違いのまとめ

どちらもS3のアクセス制御を定義するものです。

形式 粒度 主な用途
バケットポリシー JSONポリシー
柔軟性:高い
細かく制御可能 バケット全体のセキュリティ統制
ACL 定義済みの権限セット
柔軟性:低い
粗い制御 特定のファイルのみを公開する場合など

バケットポリシーの使用が推奨されています。

バケットポリシー(Bucket Policy)とは

バケットポリシーとは、S3バケットに対してJSON形式でアクセス権限を細かく定義する仕組みです。

 

できること

  • 特定のIAMロール・ユーザー・アカウントに絞ったアクセス制御
  • 特定のIPアドレス・VPCからのみ許可
  • 特定のアクション(GetObject, PutObject等)単位で制御
  • Conditionによる細かい条件指定
  • 明示的なDenyで強制的に拒否できる

ACL(Access Control List)とは

ACLとは、定義済みの権限グループを使ってアクセスを制御する仕組みです。

 

特徴

  • 設定はバケットまたは、その中のオブジェクト(ファイル)一つひとつに付与できます。
  • 「読み取り許可」「書き込み許可」といった大まかな権限しか設定できません。(IP制限など不可、拒否(Deny)は不可能)
  • 現在はACL無効化が推奨設定となっています。特別な理由がない限り使わない。

 

ACLはファイルごとに設定がバラバラになる可能性があり、意図しない公開設定(情報漏洩)に気づきにくいリスクがあります。

バケットポリシーなら、一つの場所でバケット全体のルールを一元管理できます。

現在のAWSベストプラクティス

  • オブジェクト所有権を「バケット所有者の強制」に設定
  • ACLを完全に無効化
  • アクセス制御をバケットポリシーに集約

 

クロスアカウントアップロード時の所有権問題

ACLが有効な場合の問題

アカウントBがアカウントAのバケットにアップロード
→ オブジェクトの所有者がアカウントBになる
→ アカウントAがそのオブジェクトを制御できない!

「バケット所有者の強制」を設定すると

誰がアップロードしても所有者はバケット所有者
→ 所有権が統一され管理がシンプルに

 

ACLとバケットポリシーではどちらが優先されるか

以下の設定は、ACLではAllUsersがReadで誰でも読める設定ですが、バケットポリシーではEffectにDeny(拒否)を設定しています。

この場合、どちらが優先されるかというと

ACL AllUsers: READ(誰でも読める設定=パブリック)
バケットポリシー EffectがDenyでNotIpAddressに特定IPの記載があるとき(以下のJSON参照)
{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::bucket-name/*",
  "Condition": {
    "NotIpAddress": {
      "aws:SourceIp": "192.168.0.0/24"
    }
  }
}

バケットポリシーのDenyが優先 されます。

明示的なDenyはACLのAllowを上書きします。

Deny + NotIpAddressで、特定IPからのアクセスのみ許可されます。

特定IP以外からのアクセスは拒否されます。

関連の記事

AWS IAMポリシーとS3バケットポリシーの関係

△上に戻る