目次
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"
}
}
}
関連の記事