S3 ストレージのバケットへのアクセス制御方式の違いに関して説明します。
すべて実験結果より記載しています(2018年10月)。仕様変更あるかもしれません。参考程度にしてください。セキュリティに関わることなので、実際にはご自身でマニュアル等を確認してください。
基本的な動作は以下の通りです。
・デフォルトは拒否。ここから許可を加えていく。
・明示的に拒否するとアクセス不可となる。
バケットACL は以下のように手軽に設定が可能です。(XML)
比較は以下の表の通りとなります。
比較表 | IAM ポリシー(ユーザポリシー) | バケットポリシー | バケットACL(Access Control List) |
概要 | ・JSONベースのアクセスポリシー言語を使用。 ・AWSリソースに対するアクセス権 ・IAM ユーザやグループに対してバケットやオブジェクトにアクセス権限を付加する。(ここばバケットポリシーと大きく異なる点。ユーザやグループごとに細かい制御が可能) | ・JSONベースのアクセスポリシー言語を使用。S3への高度なアクセス制御。 ・バケットごとにIAMユーザやグループのアクセス権。他のAWS アカウントを指定することが可能。 ・フォルダにアクセス権を付けただけではオブジェクト(ファイル)は適用されない。オブジェクトへのアクセス許可も必要。逆にフォルダにアクセス権がなくてもオブジェクトにアクセス権があればアクセス可能(2018/10確認) | 【注意】Public でEveryoneにアクセスを与えると世界中からアクセス可能になる可能性が高いです。注意してください。 ・バケット及び個々のオブジェクトへのアクセス権の設定。基本的なアクセス権。 ・「AWSアカウント」「パブリックアクセス」「S3ログ配信グループ」に対して「オブジェクトの一覧」「オブジェクトの書き込み」「バケットのアクセス権限の読み取り」「バケットのアクセス権限の書き込み」が可能。 ・他のAWSアカウントへの許可も可能。 ・許可のみであり拒否はなし。 |
どんなときに | 個々のユーザやグループに対して詳細に設定したい場合。 | バケット単位で設定したい場合。 | 手軽にアクセス権を設定したい場合。 |
サンプル | ポリシージェネレーターで生成が可能。以下はサンプル。 { "Version": "2012-10-17", "Statement": [ { "Sid": "<SidID>", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:HeadBucket" ], "Resource": "*" } ] } | ポリシージェネレーターで生成が可能。以下はサンプル。 { "Version": "2012-10-17", "Id": "<ポリシーID>", "Statement": [ { "Sid": "<SidID>", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<アカウント名>:root" }, "Action": "s3:*", "Resource": "arn:aws:s3:::<バケット名>/*" } ] } | - |
備考1 | パケットポリシーもACLもない状態でも、IAMユーザに「Powe User Access」ポリシーをアタッチしたらアクセス可能となった。 | 「Action does not apply to any resource(s) in statement」が表示される場合があります。 ポリシーでアクションを許可しましたが、対象のリソースではそのアクションは含まれない場合に表示されると思います。(要するに意味のないポリシー) | 「オブジェクトは、オブジェクト ACL により、依然としてパブリックアクセス可能である場合があります」と表示される場合があります。 バケットでアクセスを制限しても、個々のオブジェクトでPublic へアクセス許可している可能性がるので注意してくださいという意味と思われる。 |
備考2 | - | 「このバケットにはパブリックアクセス権限があります このバケットに対するパブリックアクセスを指定しています。S3 バケットに対しては、どのような種類のパブリックアクセスも許可しないことを強くお勧めします。」 と表示される場合があります。以下のPrincipalで発生しました。匿名アクセスを許可となるようです。 "Principal": { "AWS": "*" } | - |
備考3 | バケット内のオブジェクトにも許可を与える場合は以下のような* を使用する。 "Resource": "arn:aws:s3:::<バケット名>/*" | ||
AWSアカウントレベル | × | 〇 | 〇 |
IAM ユーザレベル | 〇 | 〇 | × |
その他 "Query String Autehntication" というものがあります。署名付きURLです。特定のURLに対して、一定期間のみアクセス権を与えます。コンシューマ向けなどユーザを作成することができなく、かつ一回のみアクセスさせる場合など活用します。
関連リンク:
暗号化キーであるSSE-S3、SSE-KMS、SSE-Cの違いとは
AWS のストレージサービスの違いに関して | EFS,EBS,S3,Amazon Glacier
S3 へアクセスする4種類の方法 2018年度版
S3 エンドポイントとアクセスポイントの違い
AWS まぎわらしい用語一覧へ戻る