【AWS-SCS勉強用】S3のアクセスコントロールについてまとめてみる

5月中にAWS‐SCSを受験予定です。
練習問題を解く中で、S3の各アクセスコントロールの違いがいまいち自分の中で腹落ちしていないため整理してみようと思います。
※実務未経験のため、認識誤りなどあるかもしれませんがご了承ください。

## S3のアクセスコントロールの種類
S3に対するアクセスコントロールの種類は以下の4つ。

	・ブロックパブリックアクセス
	・アクセスコントロールリスト(ACL)
	・バケットポリシー
	・IAMポリシー

違いが分かりづらいと感じたのは「ACL」、「バケットポリシー」、「IAMポリシー」です。
以下にそれぞれの特徴をまとめてみます。

## 何に対しての設定か

|      ACL       |     バケットポリシー     |          IAMポリシー           |
| :------------: | :--------------: | :------------------------: |
| バケット<br>オブジェクト | バケット<br>(オブジェクト) | IAM ユーザ、IAMグループ、<br>IAMロール |

## 何に対してアクセス許可(拒否)を設定できるか

|             ACL             |      バケットポリシー      |          IAMポリシー          |
| :-------------------------: | :----------------: | :-----------------------: |
| AWS アカウント<br>Amazon S3 グループ | AWSアカウント<br>IAMユーザ | IAMユーザ、IAMグループ、<br>IAMロール |

## 記述形式

| ACL | バケットポリシー | IAMポリシー |
| :-: | :------: | :-----: |
| XML |   JSON   |  JSON   |

## ACLとバケットポリシー
どちらもバケットとオブジェクトに対してアクセスコントロールを行えるが、同じではない。
ACLにはバケットACLとオブジェクトACLという各リソースへそれぞれの設定があるのに対して、バケットポリシーにおけるオブジェクトのアクセスコントロールはあくまでバケットポリシーの設定の一部という扱い。Resource属性でオブジェクトを指定してアクセスコントロールを行うことができる。

## バケットポリシーとIAMポリシー
バケットポリシーはS3のバケットに対してどの対象からのアクセスを許可(拒否)するかを設定できるのに対して、IAMポリシーはアクセスする側に対して許可(拒否)を設定する。
もしどちらかのポリシーで”明示的な拒否”が設定されている場合、もう一方で許可が設定されていてもアクセスが拒否される。


## 各アクセスコントロールのユースケース 
公式ドキュメントにきちんと各コントロールの使用ガイドラインが記載されていたのですが、日本語訳を読んでも分かり辛かったため自分なりに意訳、要約してみました。

### ACL
オブジェクトごとに個別に制御する必要がない限り、現在は無効にしておくことが推奨されている。
	
■オブジェクトACLを使用するケース
・オブジェクトをバケット所有者が所有していない場合
バケット所有者とオブジェクト所有者が異なる場合、オブジェクト ACL でアクセスコントロールを行う。
バケットを所有する AWS アカウント(以降、バケット所有者)は、別のアカウントに対してオブジェクトのアップロード許可することができるが、別のアカウントがアップロードしたオブジェクトは別のアカウント(以降、オブジェクト所有者)の所有物となるため、バケット所有者はS3のオブジェクトに対してのアクセス許可を持たない。
よって、バケット所有者とオブジェクト所有者が異なる場合に、そのオブジェクトに対してアクセスを要する場合は、オブジェクト ACL を使用して許可を付与する必要がある。

・オブジェクトレベルで権限を管理する必要がある場合
各オブジェクトに対して個別のアクセスコントロールが必要になる場合、オブジェクトACLでアクセスコントロールを行う。
オブジェクト単位でのアクセスコントロールはバケットポリシーでも管理することができるが、バケットポリシーによるオブジェクトのアクセスコントロールはバケットに対するポリシーの一部という扱いになること、バケットポリシーのサイズは 20 KB に制限されていることから実用的ではないとされている。
		
・オブジェクト ACL がオブジェクトレベルのアクセス許可のみを制御する場合
バケット所有者以外のアカウントにアクセスポリシーの管理権限を設定したい場合、所有者ではないアカウントにオブジェクトACLによるアクセスコントロールを管理させることで権限範囲を最小にする。（わかりにくかったがこんな感じ？）
バケット所有者は他のアカウントに対してアクセスポリシーの管理権限を与えることができる。ただし、この状態では権限を与えられたアカウントがすべてのアクセスポリシーに対する管理権限を持ってしまう。他のアカウントに対して最小権限を設定するためには、 `READ-ACP` と `WRITE-ACP` の許可のみを他のアカウントに付与する。これにより、他のアカウントは個別のオブジェクト ACL を更新して、特定のオブジェクトのアクセス許可だけを管理できるようになる。

■バケットACLを使用するケース
・AWS のサービス Amazon CloudFront アカウントなどの特定の `awslogsdelivery` アカウントに許可を付与する場合
公式ドキュメントで唯一推奨されているケース。
CloudFrontディストリビューションでCloudFront ロギングを有効にすると、CloudFront はバケット ACL を更新して、バケットにログを書き込むための `awslogsdelivery`アカウントに対して `FULL_CONTROL` の許可を付与する。ログを保存するバケットでS3 オブジェクト所有権をバケット所有者に与えるACL を無効にすると、CloudFront はバケットにログを書き込むことができない。

### バケットポリシー
バケットを所有する AWS アカウントがアカウント内のユーザに許可を付与する場合、バケットポリシーとIAMポリシーの両方を使用することができる。ただし以下のケースのみ例外的にバケットポリシーを使用する必要がある。

・すべての Amazon S3 のアクセス許可に対してクロスアカウントのアクセス許可を管理したい場合
ACL でも他のアカウントにクロスアカウントアクセスの許可を付与することは可能である。ただし、ACL は限られた範囲でしかアクセス許可ができない。
一方、バケットポリシーとIAMポリシーのどちらも、すべての Amazon S3 の操作に対するアクセス許可の付与を付与できる。ただし、IAMポリシーは、**アカウント内のユーザのアクセス許可を管理するためのもの**である。他の AWS アカウントまたは別のアカウントのユーザへのクロスアカウントアクセスを許可するには、バケットポリシーを使用しなければならない。

### IAMポリシー
IAMポリシーとバケットポリシーのどちらでもアクセス管理はできる。どちらのポリシーを使用すべきかはユーザの置かれている状況次第である。(具体的にこの場面で使う、という内容は書かれていなかった。)

IAMポリシーでアクセス管理を実施する場合、IAMユーザにアクセスを許可するには後述する2つのアクセス許可が必要となる。

    ・自身が所属する親アカウントからのアクセス許可(※)
        親アカウントが作成したIAMポリシーをアタッチすることで許可が付与される。
    ・リソース所有者からのアクセス許可
        リソース所有者が対象のIAMユーザ、またはその親アカウントに対してバケットポリシー、バケット ACL、またはオブジェクト ACLでアクセス許可を付与する。

※は公式ドキュメントに記載されているアクセス許可方法であるが、実務では次のような方法で許可を設定することがある。(以下、実務経験者から教わった方法)
例: 不特定多数のIAMユーザが同一バケットにオブジェクトをアップロードする必要がある状況での許可設定

    1. 許可を付与するカスタムポリシーの作成。
    2. IAMグループへカスタムポリシーをアタッチ。
    3. アクセスを許可したいユーザを作成したIAMグループへ追加。


 　
以上が今回S3のアクセスコントロールについて調べた内容です。
自分の勉強用ノートのような投稿ですが、どこかの誰かのお役に立てば幸いです。

　
【参考サイト】
・公式ドキュメント
[アクセス管理の概要](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-overview.html)
[アクセスポリシーのガイドライン](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-alternatives-guidelines.html#access-control-guidelines-related-topics)
[ACL によるアクセスの管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acls.html) 
・Qiita記事
[S3のアクセスコントロールまとめ](https://qiita.com/ryo0301/items/791c0a666feeea0a704c#acl-1)
[S3のアクセス制御を理解するためのロードマップ](https://qiita.com/K5K/items/ef6a02aee760b128a25b)