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

目次

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

適用範囲 設定方法 権限対象
バケットポリシー バケット全体やプレフィックス単位でまとめて制御 JSON 形式で柔軟に条件指定可能 IAM ユーザー/ロール/アカウント、条件付き指定(IP、VPCなど)
ACL バケットまたはオブジェクト個別 簡易な許可リスト方式 AWS アカウント、全員(AllUsers)、認証済みユーザー

原則は、バケットポリシーで統一します。

ACLの利用が残るケース:

バケットをまたいだ「クロスアカウントでのオブジェクト所有権」制御

静的ウェブサイトホスティングで特定オブジェクトを公開 (AllUsers: READ)

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

単位: バケットやその中のオブジェクトに対してまとめて設定

書き方: JSON形式のポリシー文(IAMポリシーと似た構文)

対象: IAMユーザー、IAMロール、AWSアカウント、特定の条件 (IPアドレス制限、VPCエンドポイント制御など)

特徴

柔軟な条件指定が可能(ConditionでIP制限、特定のVPCからのアクセスなど)

組織全体で推奨される管理方法(AWS公式も「できるだけACLよりポリシーを使え」と推奨)

明示的なDenyで強制的に拒否できる

ACL(Access Control List)とは

単位:バケットやオブジェクト個別に設定

書き方:シンプルな「誰にどの権限(READ/WRITE)」を許可するかのリスト

対象:AWSアカウント(Canonical User ID)や「全員(AllUsers)」「認証済みユーザー(AuthenticatedUsers)」など

特徴

非常にシンプル(READ/WRITE の許可程度)

細かい条件指定はできない(IP制限など不可)

古い仕組みで、現在は「特殊なケース以外は使わないのが推奨」

代表的な使い道: オブジェクト単位の公開設定(例:静的ウェブサイト公開で特定オブジェクトを全員に READ 許可)

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

以下の設定の場合、

ACL AllUsers: READ(誰でも読める設定=パブリック)
バケットポリシー EffectがDenyでNotIpAddressに特定IPの記載があるとき

Denyが最優先され、特定IP以外からのアクセスは拒否されます。

特定IPは、Denyされず、ACLがAllUsersなのでアクセスできます。

ベストプラクティスはACLを無効化(BlockPublicAccessを有効化)して、バケットポリシーのみで制御です。

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::bucket-name/*",
  "Condition": {
    "NotIpAddress": {
      "aws:SourceIp": "192.168.0.0/24"
    }
  }
}

関連の記事

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

△上に戻る