S3のアクセス制御を理解するためのロードマップ

# 記事の目的
S3のアクセス制限を理解するためのロードマップをまとめます！

各機能についてわかりやすい記事などはたくさんあるのですが、全体像を掴める感じのものがなかったため作成しました。
機能が多くてややこしいS3のアクセス制御を理解するために、何をどの順で理解していけばいいかというところに焦点を当てています。各機能の説明については他の良記事にお任せするスタイルですm(_ _)m

# 想定対象読者
- AWS初心者
- S3のアクセス制御を体系的に理解したい方
- S3のアクセス制御がややこしくて頭を抱えている人(<-私)

# ロードマップ

```
===================================================================================
= 1. 全体像を掴む(SGのアクセス制御に関連する機能が何か把握する)
===================================================================================

S3のアクセス制御の手法いろいろありますよね。まずは「何があるのか？」、「それで何ができるのか？」を把握しましょう。



===================================================================================
= 2. 各機能について理解する
===================================================================================

全体像を掴んだ後は、各機能について以下の観点で理解しましょう。
- 「何ができるのか？」
- 「どういった用途で使われるのか？」
- 「各機能の違いは？」



===================================================================================
= 3. 複数の機能を使用したケースについて理解する
===================================================================================

S3では複数の機能を用いてアクセス制御を行う機会が多くあります。
複数の機能が適用された場合、どのような挙動になるのか理解しておきましょう。




===================================================================================
= 4. ポリシー(IAMポリシー/バケットポリシー)を深く理解する
===================================================================================

IAMポリシーとバケットポリシーはJSON形式で定義します。
複雑で柔軟な定義ができる分、理解するのは一苦労します。
理解して使用できるポリシーパターンを徐々に増やして、幅広いアクセス制御を実現できるようにしましょう。




```

# 前提知識

基本的なことなので、わかる人はスキップしましょう♪

## S3バケット

ファイルを格納するオブジェクトストレージ

## オブジェクト

S3バケットに格納されるファイル

# 1. 全体像を掴む

S3のアクセス制御に関連する機能は以下の４つになります。

|No|機能|概要|
|:--:|:---|:---|
|1|ACL|簡単に設定できるが、その分柔軟なアクセス制御はできない。オブジェクトにも適用することが可能|
|2|バケットポリシー|設定は複雑だが、柔軟なアクセス制御が可能。|
|3|IAM|S3への操作権限をIAMユーザー/グループに対して付与する|
|4|パブリックブロックアクセス|バケットがパブリックに公開されることを防止するというシンプルな制御機能|

まずは、この４つについて理解しておけばOKということを意識しておきましょう。

# 2. 各機能について理解する

## 2-1. ACL

`ACLは無効化が推奨されています。`

### 利用シーン

一番古くから存在しているアクセス制御機能であり、簡単に設定できる分大雑把な制御しかできないため、以下のケース以外ではあまり利用されないです。

- バケットの所有者とオブジェクトの所有者が異なっている場合に、オブジェクトに対してアクセス制御を施したい
- 簡易的にアクセス制御を施したい
- S3アクセスログを格納するS3バケットへアクセス制御を施したい

### 概要

- バケットポリシーに比べて簡単に設定できるが、その分柔軟なアクセス制御をすることはできない
- バケットだけでなく、オブジェクト単位で適用することが可能
- ユーザーはAWSアカウント単位(IAMユーザー、グループでの制御はできない)


設定は、被付与者(制御対象)に対してアクセス許可(許可する操作)を指定するだけです。

- 被付与者
    - バケット所有者 (AWS アカウント)
    - 全員 (パブリックアクセス)
    - Authenticated Users グループ (AWS アカウントを持つすべてのユーザー)
    - S3 ログ配信グループ
    - 他のAWSアカウント

- アクセス許可(制御対象のアクション)
    - FULL_CONTROL
    - READ
    - WRITE
    - READ_AC
    - WRITE_ACP

### 参考

被付与者とアクセス許可については、公式のドキュメントが一番まとまっている気がします。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/acl-overview.html

あとはこの辺の記事がわかりやすいです。

https://qiita.com/ryo0301/items/791c0a666feeea0a704c#acl-1


## 2-2. バケットポリシー

### 利用シーン

バケットに対するアクセス制御を施す時は基本的にバケットポリシーを利用します。(簡易的な制御で良い場合はACLを選ぶこともあります)

### 概要

- バケットに適用できる
- 設定が難しい分、柔軟で複雑なアクセス制御を実現できる
- ポリシードキュメントと言うJSON形式のフォーマットで設定する

ポリシードキュメントは奥が深いので、最初はググってサンプルをゲットして、それを使いましょう。

### 参考

以下の記事がわかりやすいです。

https://morizyun.github.io/infrastructure/aws-s3-bucket-policy.html

https://dev.classmethod.jp/articles/learn-aws-policy-documents-with-examples/


## 2-3. IAM

### 利用シーン

「このIAMユーザー/グループはこのS3バケットにアクセスできる(できない)ように....」というIAMユーザー/グループ視点でアクセス制御をかけたい時に利用します。

### 概要

S3の設定ではないため、S3のバケットを作成する限りでは意識しにくいところです。ただし、S3のアクセス制御に関わる大切なところです。

(S3に限れば)ActionとResourceを定義することで、S3へのアクセス制御を施すことができます。

- Action：制御対象のS3への操作(オブジェクトのアップロードや、削除など)
- Resource：制御対象のS3バケット、フォルダ、オブジェクト

### 参考

公式ドキュメントのサンプルを見るとイメージしやすいと思います。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-policies-s3.html


## 2-4. パブリックブロックアクセス

### 利用シーン

パブリックに公開することを防止したい時に有効化します。デフォルトでは有効になっているため、パブリックに公開したいバケットである場合は設定を無効化します。

### 概要

- 設定できることはシンプルで「パブリックアクセスを許可するか/否か」
- バケット単位だけでなく、AWSアカウント全体(全てのバケット)に設定することもできる。

外部に公開しないバケットは有効化しておくことが必須です。

### 参考

以下がわかりやすいかなと。

http://muessenwirwollen.hatenablog.com/entry/2019/10/19/203706


## 各機能の比較

それぞれの機能について理解したところで、まとめとして比較を記載します。

|No|機能|設定対象|設定形式|AWSアカウント単位の適用|IAMユーザー/グループ単位の適用|
|:--:|:---|:---|:---|:---:|:---:|
|1|ACL|バケット、オブジェクト|選択式|○|x|
|2|バケットポリシー|バケット|json形式|x|○|
|3|IAM|IAMユーザー/グループ|json形式|○|x|
|4|パブリックブロックアクセス|バケット、AWSアカウント(全てのバケット)|選択式|対象外|対象外|


# 3. 複数の機能を使用したケースについて理解する

複数の機能が併用された際に、一番大切になるポイントは
**「明示的な拒否が１つでも定義された場合は、アクセス制御は拒否になる」**ということです。

ACLは許可しかできないため、バケットポリシーかIAMのどちらかで拒否された対象は、問答無用で拒否されます。

以下参考にしてください。

https://dev.classmethod.jp/articles/s3-acl-wakewakame/

https://www.bioerrorlog.work/entry/s3-bucket-policy-vs-iam-policy

# 4. ポリシーを深く理解する

こちらに関しては他の記事に丸投げする形ですw

## バケットポリシー

基本的にやりたい制御方法をググって調べて、サンプルからパクる。
それを色々繰り返して行くと、自分のナレッジとして貯まるのかなと思います。

なのでサンプルをどんどん読んで、色々なパターンに触れていきましょう。

### サンプル

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html

https://qiita.com/leomaro7/items/3d77328c04322efe608e


### Tips

否定条件を複数定義したポリシーを作る際は、以下必読です。

https://dev.classmethod.jp/articles/s3-bucket-policy-multi-condition/

## IAMポリシー

IAMポリシーはS3に限ってはAction、Resourceを意識すれば、ある程度の設定はできるかと思います。
ただIAMポリシー自体に関しては、奥が深すぎるので、ここではこれ以上深入りしないですm(_ _)m

# 所感

クラメソさんのDevelopersIO、やっぱりわかりやすい

# 参考
- [アクセスコントロールリスト (ACL) の概要 (aws 開発者ガイド)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/acl-overview.html)
- [ユーザーポリシーの例 (aws 開発者ガイド)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-policies-s3.html)
- [バケットポリシーの例 (aws 開発者ガイド)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html)
- [AWS/S3のバケットポリシー入門](https://morizyun.github.io/infrastructure/aws-s3-bucket-policy.html)
- [S3バケットポリシーの具体例で学ぶAWSのPolicyドキュメント (DevelopersIO produced by Classmethod)](https://dev.classmethod.jp/articles/learn-aws-policy-documents-with-examples/)
- [S3のアクセスコントロールまとめ (Qitta)](https://qiita.com/ryo0301/items/791c0a666feeea0a704c)
- [AWS S3 運用　権限設定を逆引形式で整理してみる (cloud link)](https://aws.taf-jp.com/blog/25231)
- [S3 バケットへのアクセス制御方式の違い](https://awsjp.com/AWS/hikaku/S3_bucket_access_control.html)
- [S3のブロックパブリックアクセス設定について分かりやすく説明する (Hatena Blog)](http://muessenwirwollen.hatenablog.com/entry/2019/10/19/203706)
- [S3で誤ったデータの公開を防ぐパブリックアクセス設定機能が追加されました (DevelopersIO produced by Classmethod)](https://dev.classmethod.jp/articles/s3-block-public-access/)
- [S3バケットポリシーとIAMポリシーの関係を整理する](https://www.bioerrorlog.work/entry/s3-bucket-policy-vs-iam-policy)
- [S3 バケットポリシーいろいろ (Qitta)](https://qiita.com/leomaro7/items/3d77328c04322efe608e)
- [【AWS】S3のBucket-ACLとObject-ACLとバケットポリシーどれが強いのか？ (Qitta)](https://qiita.com/chokuzin/items/9637a6ce48c0ebb10b31)
- [複数の否定条件を使ったS3バケットポリシーを正しく理解してますか？ (DevelopersIO
produced by Classmethod)](https://dev.classmethod.jp/articles/s3-bucket-policy-multi-condition/)
- [S3のアクセスコントロールが多すぎて訳が解らないので整理してみる (DevelopersIO
produced by Classmethod)](https://dev.classmethod.jp/articles/s3-acl-wakewakame/)