目次
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以外からのアクセスは拒否されます。
関連の記事
