S3バケットポリシーとIAMポリシーの関係を、同一アカウント・クロスアカウントそれぞれにおいて整理します。
はじめに
こんにちは、@bioerrorlogです。
S3に対するアクセス権限の制御方法としては、アクセス元のIAMポリシーとアクセス先のバケットポリシーのふたつが挙げられます。
IAMポリシーとバケットポリシーのどちらで制御すればよいのか、はたまた両方で制御する必要があるのか、油断してると忘れそうになります。
今回は、このIAMポリシーとバケットポリシーでの制御方法の関係性について、同一アカウント内の場合とクロスアカウントの場合でそれぞれ整理します。
S3バケットポリシーとIAMポリシーの関係
結論
まず簡潔に結論を言うと、以下のようになります。
- 同一アカウント内アクセス:
S3バケットポリシーかIAMポリシーのどちらかで許可が必要 - クロスアカウントアクセス:
S3バケットポリシーとIAMポリシーの両方で許可が必要 - S3バケットポリシーかIAMポリシーのどちらかで拒否された場合は拒否される
以降、EC2からS3にGetObjectする場合をもとに検証していきます。
検証準備
EC2に付与するIAMポリシーとして、以下のものを用意します。
- アクセス許可用
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::[ターゲットバケット名]/*" } ] }
- アクセス拒否用
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::[ターゲットバケット名]/*" } ] }
バケットポリシーとしては、以下のものを用意します。
- アクセス許可用
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[アカウントid]:role/[EC2にアタッチしたRole名]" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::[バケット名]/*" ] } ] }
- アクセス拒否用
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::[アカウントid]:role/[EC2にアタッチしたRole名]" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::[バケット名]/*" ] } ] }
EC2からGetObjectするには、以下のCLIを利用します。
aws s3api get-object --bucket [ターゲットバケット名] --key [オブジェクトキー] [ファイル保存名]
以上の条件で、各ケースにおけるアクセス可否を検証します。
同一アカウント内アクセス
まずは、同一アカウント内からのS3アクセスを検証します。
IAMポリシー | バケットポシリー | アクセス可否 |
---|---|---|
- | - | Access Denied |
Allow | - | Succeed |
- | Allow | Succeed |
Allow | Allow | Succeed |
Deny | Allow | Access Denied |
Allow | Deny | Access Denied |
このように、同一アカウント内では
- S3バケットポリシーかIAMポリシーのどちらかで許可されば許可される
- S3バケットポリシーかIAMポリシーのどちらかで拒否された場合は拒否される
という挙動になります。
クロスアカウントアクセス
続いて、クロスアカウントでのS3アクセスを検証します。
IAMポリシー | バケットポシリー | アクセス可否 |
---|---|---|
- | - | Access Denied |
Allow | - | Access Denied |
- | Allow | Access Denied |
Allow | Allow | Succeed |
Deny | Allow | Access Denied |
Allow | Deny | Access Denied |
このように、クロスアカウントでは
- S3バケットポリシーかIAMポリシーの両方で許可されば許可される
- S3バケットポリシーかIAMポリシーのどちらかで拒否された場合は拒否される
という挙動になります。
以上をまとめると、S3バケットポリシーとIAMポリシーの関係は以下のようになります(再掲)。
- 同一アカウント内アクセス:
S3バケットポリシーかIAMポリシーのどちらかで許可が必要 - クロスアカウントアクセス:
S3バケットポリシーとIAMポリシーの両方で許可が必要 - S3バケットポリシーかIAMポリシーのどちらかで拒否された場合は拒否される
おわりに
今回は、S3バケットポリシーとIAMポリシーの関係を整理しました。
AWSを触っていると、IAM権限周りの正確な理解がとても重要と感じています。
今回取り上げた話題は比較的シンプルな話でしたが、一つ一つ整理していくことで、権限周りの自信を深めていきたいところです。
[関連記事]
参考
Amazon S3 がバケットオペレーションのリクエストを承認する仕組み - Amazon Simple Storage Service