s3 パブリックからファイルアップロードや削除はできないが、パブリックからファイル閲覧できるという確認をダメパターンも含めて実際に試す

# 目的

- 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
<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

```json
{
    "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

```json
{
    "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