S3バケットポリシーとIAMポリシーの関係を整理する

S3バケットポリシーとIAMポリシーの関係を、同一アカウント・クロスアカウントそれぞれにおいて整理します。


はじめに

S3に対するアクセス権限の制御方法としては、アクセス元のIAMポリシーとアクセス先のバケットポリシーのふたつが挙げられます。

f:id:BioErrorLog:20201122113644p:plain
S3に対するアクセス権限の制御

IAMポリシーとバケットポリシーのどちらで制御すればよいのか、はたまた両方で制御する必要があるのか、油断してると忘れそうになります。

今回は、このIAMポリシーとバケットポリシーでの制御方法の関係性について、同一アカウント内の場合とクロスアカウントの場合でそれぞれ整理します。


S3バケットポリシーとIAMポリシーの関係

結論

まず簡潔に結論を言うと、以下のようになります。

f:id:BioErrorLog:20201122182412p:plain

  • 同一アカウント内アクセス:
    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 [オブジェクトキー] [ファイル保存名]


以上の条件で、各ケースにおけるアクセス可否を検証します。


同一アカウント内アクセス

f:id:BioErrorLog:20201122145111p:plain
同一アカウント内でのS3アクセス

まずは、同一アカウント内からのS3アクセスを検証します。

IAMポリシー バケットポシリー アクセス可否
- - Access Denied
Allow - Succeed
- Allow Succeed
Allow Allow Succeed
Deny Allow Access Denied
Allow Deny Access Denied

このように、同一アカウント内では

  • S3バケットポリシーかIAMポリシーのどちらかで許可されば許可される
  • S3バケットポリシーかIAMポリシーのどちらかで拒否された場合は拒否される

という挙動になります。


クロスアカウントアクセス

f:id:BioErrorLog:20201122150640p:plain
クロスアカウントでのS3アクセス

続いて、クロスアカウントでの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ポリシーの関係は以下のようになります(再掲)。

f:id:BioErrorLog:20201122182412p:plain

  • 同一アカウント内アクセス:
    S3バケットポリシーかIAMポリシーのどちらかで許可が必要
  • クロスアカウントアクセス:
    S3バケットポリシーとIAMポリシーの両方で許可が必要
  • S3バケットポリシーかIAMポリシーのどちらかで拒否された場合は拒否される


おわりに

今回は、S3バケットポリシーとIAMポリシーの関係を整理しました。

AWSを触っていると、IAM権限周りの正確な理解がとても重要と感じています。

今回取り上げた話題は比較的シンプルな話でしたが、一つ一つ整理していくことで、権限周りの自信を深めていきたいところです。


関連記事

AWS CLIのs3 cpとs3 syncの違いをまとめました。 www.bioerrorlog.work


S3バケットに関する定番ハマりポイント:--acl bucket-owner-full-controlを後から一括付与するやり方の備忘録です。 www.bioerrorlog.work


参考

Amazon S3 がバケットオペレーションのリクエストを許可する方法 - Amazon Simple Storage Service

S3 バケット内のオブジェクトへのクロスアカウントアクセスを許可する - AWSナレッジセンター