目的
- s3のブロックパブリックアクセスとアクセスコントロールリスト(ACL)、バケットポリシー(Policy)の関連性がややこしくてイマイチピンとこない
- s3のドキュメントがカオス
- なので把握も兼ねて、実際のユースケースを元にセキュリティ的にダメなパターンと、どんな設定でできるのかを試す
-
ユースケース
- awscliでサーバ等から画像をS3へアップロードさせて、S3のオブジェクトURL( https://[バケット名].s3-ap-northeast-1.amazonaws.com/[オブジェクト名] )でパブリックから画像を閲覧させたい場合
- = パブリックからファイルアップロードや削除はできないが、パブリックからファイル閲覧できる という確認をダメパターンも含めて実際に試す
前提条件
s3リージョン:ap-northeast-1
パブリックからファイルアップロードされてしまうことの確認(ダメパターン)
パターンA
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
オフ
且つ - ACL -> パブリックアクセス -> グループ Everyone -> オブジェクトの書き込み
はい
(他は-
) 且つ Policy
何も記述しない
-
アップロードされてしまう事を確認
- 確認用HTML
<html>
<body>
<form action="https://[バケット名].s3-ap-northeast-1.amazonaws.com/" method="post" enctype="multipart/form-data" >
<input type="hidden" name="key" value="uploads/[アップロードファイル名]">
<input type="file" name="file"> <br>
<input type="submit" value="送信">
</form>
</body>
</html>
- Webページアクセスし、ファイルアップロード マネコンからアプロードしたファイルを確認
パターンB
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
オフ
且つ - ACL -> パブリックアクセス -> グループ Everyone -> オブジェクトの書き込み
-
(他も-
) 且つ - Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::[バケット名]/*"
}
]
}
ポイントはPutObject
- アップロードされてしまう事を確認
- HTMLは上記同様
- Webページアクセスし、ファイルアップロード
- マネコンからアプロードしたファイルを確認
結論
-
パブリックからファイルをアップロードされてしまう設定(ダメパターン)
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
オフ
且つ - ACL、ポリシーどちらかで書き込み/PutObjectが許可
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
-
パブリックからファイルアップロードされることはない設定
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
オン
- ACL -> パブリックアクセス -> グループ Everyone
-
- Policy
PutObject
を許可しない
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
アップロード(PutObject)以外にオブジェクト閲覧(GetObject)、削除(DeleteObject)の場合も同様
パブリックからファイル閲覧させる確認
パターンC
- ブロックパブリックアクセス -> パブリックアクセスをすべてブロック
オン
且つ - ACL -> パブリックアクセス -> グループ Everyone -> 全て
-
且つ Policy
何も記述しない
-
アップロードされてるオブジェクトへWebアクセス
https://[バケット名].s3-ap-northeast-1.amazonaws.com/[オブジェクト]- Access Deniedでオブジェクトが表示されない
これだとCLIからアップロードされても、閲覧できないので、、
パターンD
- ブロックパブリックアクセス -> 任意のパブリックバケットポリシーを介して、バケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする のみ
オフ
(他はオン
) 且つ - ACL -> パブリックアクセス -> グループ Everyone -> 全て
-
且つ Policy
何も記述しない
-
アップロードされてるオブジェクトへWebアクセス
https://[バケット名].s3-ap-northeast-1.amazonaws.com/[オブジェクト]- Access Deniedでオブジェクトが表示されない
これでもCLIからアップロードされても、閲覧できないので、、
パターンE
- ブロックパブリックアクセス -> 任意のパブリックバケットポリシーを介して、バケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする のみ
オフ
(他はオン
) 且つ - ACL -> パブリックアクセス -> グループ Everyone -> 全て
-
且つ - Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[バケット名]/*"
}
]
}
ポイントはGetObject
- アップロードされてるオブジェクトへWebアクセス
https://[バケット名].s3-ap-northeast-1.amazonaws.com/[オブジェクト]
- オブジェクトが表示される
念のためこの設定で、パブリックからファイルアップロードできないことも確認
結論
パブリックからファイル閲覧させつつ、アップロード/削除はさせたくない場合
パターンE
の設定でOK