AWS S3のアクセス制御の話

[AWS Cosole、ヘルプの説明がわかりずらかった話](https://qiita.com/cozyk100/items/0f5d342aea9b896c76c7)でAWS S3のアクセス制御のAWS Consoleの表記がわかりずらいという記事を書きましたが、実際にどのような違いがあるのかを見てみましょう。

ます、S3はバケットという単位を作る際に
* ACLによる制御
* バケットポリシーによる制御
が選べます。AWSはバケットポリシーを推奨しています。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3933333430382f37303936396237372d626563652d316261662d336162312d3332613839383633343364632e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/aead5455-a439-de8d-a7dd-6b7445ba7705.png)
ACL無効がバケットポリシーによる制御
ACL有効がACLによる制御
です。（てか、最初からそう書けばいいのに）

それらについて、「新しい」/「任意」、「ACL」/「バケットポリシー」で、2×2で4つの選択肢があります。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3933333430382f64323139336431622d653534302d353731662d663438612d3766313032393962656636372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/f29ab843-7a6c-854d-333f-9631fa917853.png)
「新しい」は新たにパブリックアクセスを許可するような設定をできないようにブロックします。
「任意の」は既にパブリックアクセスを許可するように設定されいても、それを上書きしてブロックします。

# 「新しい」、「ACL」の場合
以下のように、「新しい」、「ACL」のチェックをつけると
![Screenshot_20221118_223519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/cf1b0657-c94e-d280-0ef4-5b46d466bd4d.png)
オブジェクトのアクセス許可でACLを編集しようとすると、
![Screenshot_20221118_223954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/7a9a1d40-96c2-d26c-14e7-013378eb718a.png)
パブリックアクセスのチェックボックスがdisableになっているのがわかると思います。
逆に、「新しい」、「ACL」のチェックを外すと、パブリックアクセスのチェックボックスがenableになります。

# 「任意の」、「ACL」の場合
今度はオブジェクトのACLでパブリックアクセスが有効になっているものに対して
![Screenshot_20221118_224302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/0fc3b05f-672b-5d58-f471-62b35818a1dd.png)
「任意の」、「ACL」のチェックをつけると
![Screenshot_20221118_224440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/4d1f4c37-4aa3-860f-7711-a163ab5e7987.png)
ACLでは許可しているのに、パブリックアクセスがブロックされているのがわかると思います。
「任意の」、「ACL」のチェックを外すとパブリックアクセスが有効になります。

# 「新しい」、「バケットポリシー」の場合
今度はバケットポリシーですが、「新しい」、「バケットポリシー」にチェックを入れます。
![Screenshot_20221118_224717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/90d92c28-a20b-f35b-3241-73401a383e72.png)
バケットポリシーの場合はその下のバケットポリシーのへ週ボタンを押して、テキストボックスにjsonで入力していきます。
![Screenshot_20221118_225011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/6d71422a-6cc3-c0f5-04b5-5094742a4d6e.png)
このjsonの詳細な書き方はヘルプや、他の色々なページを参考にしていただいたいのですが、とりあえず、ここではパブリックアクセスを許可するようなjsonを書きます。このjsonの書き方が・・・一応、AWS Consoleの中で入力支援もあるのですが、Eclipseや、IntelliJのようなものを期待すると、がっかりします。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucketxxxx",
                "arn:aws:s3:::mybucketxxxx/*"
            ]
        }
    ]
}
```
この状態で保存を押すと
![Screenshot_20221118_230049.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/b429e8d0-1a35-6bc4-f879-6ce258678b9b.png)
文字通り、パブリックアクセスを許可するような設定ができないようにブロックされているのがわかります。

# 「任意の」、「バケットポリシー」の場合
今度は、「新しい」、「バケットポリシー」のチェックを一旦外して、バケットポリシーでパブリックアクセスが許可されている状態にします。その状態で、「任意の」、「バケットポリシー」のチェックをつけると、
![Screenshot_20221118_230332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933408/a0d171f6-b9f4-3dda-9570-267ccdc33396.png)
今までパブリックアクセスができていたのが、ブロックされたのがわかると思います。「任意の」、「バケットポリシー」のチェックを外すと、またパブリックアクセスが可能になります。

これで、「新しい」/「任意」、「ACL」/「バケットポリシー」の、2×2で4パターンの動きがわかったと思います。

が、ここで疑問に思ったのが、「ACL」か「バケットポリシー」かはバケット単位でどちらしか選べません。（同時には選べない）なのに、「新しい」/「任意」、「ACL」/「バケットポリシー」で4パターンの選択肢が出てくるのは変なのでは？

ACLの場合は下のふたつは意味がないし、バケットポリシーの場合は上のふたつ意味がないと思いますが、どうなんでしょうか？
# 結局、バケットポリシー、どう書けばいいねん？
ちなみに、私はS3のアクセス制御はパブリック・アクセスブロックは全部有り、バケットポリシーでこれを入れて置くのが一番簡単でわかりやすいと思いました。ここで一元管理できるし。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucketxxxx",
                "arn:aws:s3:::mybucketxxxx/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "1.2.3.4/32"
                }
            }
        }
    ]
}
```
SourceIpは光回線ならルータのWAN側のアドレスです。企業内のproxyサーバの中だとproxyサーバのWAN側のアドレスです。これだと自分（またはその企業内）だけ外からアクセスできて、他はブロックされます。
画像とかだと、各オブジェクトのオブジェクトURLのリンクをクリックしてプレビューしたい場合もあるので、こうすると便利です。

ただ、jsonだと一時的にある部分だけコメントアウトして無効化できないので・・・そこだけが不便。
バケットポリシーのjsonの入力支援もイマイチ。もうちょっとわかりやすくならないかなー。