ablog

不器用で落着きのない技術者のメモ

S3 アクセスポイント経由と特定のIAMロールのみのアクセスを許可するバケットポリシー

S3 アクセスポイント経由と特定のIAMロールのみのアクセスを許可するバケットポリシーをメモ。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": [
                "arn:aws:s3:::s3-bucket-name",
                "arn:aws:s3:::s3-bucket-name/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:DataAccessPointAccount": "123456789012"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:PutObject*",
                "s3:GetObject*",
                "s3:DeleteObject*"
            ],
            "Resource": [
                "arn:aws:s3:::s3-bucket-name",
                "arn:aws:s3:::s3-bucket-name/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": [
                        "AZE*********TSU:*", ★ IAM ロールのユニークID
                        "CBE*********PSZ:*" ★ IAM ロールのユニークID
                    ]
                },
                "StringNotEquals": {
                    "s3:DataAccessPointAccount": "123456789012"
                }
            }
        }
    ]
}
  • IAM ロールのユニークIDは以下のように取得する
$ aws iam get-role --role-name EC2AdminRole
{
    "Role": {
        "Path": "/",
        "RoleName": "EC2AdminRole",
        "RoleId": "ARO****************CM", ★ IAM ロールのユニークID
        "Arn": "arn:aws:iam::234567890123:role/EC2AdminRole",
        "CreateDate": "2018-09-09T03:24:34+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "Description": "Allows EC2 instances to call AWS services on your behalf.",
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {
            "LastUsedDate": "2021-07-17T08:45:05+00:00",
            "Region": "ap-northeast-1"
        }
    }
}

検証結果

  • 許可したIAMロールでマネジメントコンソールからS3バケットにファイルのアップロード/ダウンロード/削除ができることを確認
  • 許可してないIAMロールでマネジメントコンソールからS3バケットにファイルのアップロード/ダウンロード/削除ができないことを確認
  • S3 アクセスポイント経由でファイルのアップロード/ダウンロード/削除ができることを確認
[ec2-user@ip-172-32-1-222 ~]$ aws s3 cp 100mb.dat s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/ --profile profile1
upload: ./100mb.dat to s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/100mb.dat
[ec2-user@ip-172-32-1-222 ~]$ aws s3 cp s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/100mb.dat ./ --profile profile1
download: s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/100mb.dat to ./100mb.dat
[ec2-user@ip-172-32-1-222 ~]$ aws s3 ls s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/ --profile profile1
2021-09-11 00:17:24  100000000 100mb.dat
[ec2-user@ip-172-32-1-222 ~]$ aws s3 cp s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/100mb.dat s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/2.dat --profile profile1
copy: s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/100mb.dat to s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/2.dat
[ec2-user@ip-172-32-1-222 ~]$ aws s3 rm s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/2.dat --profile profile1
delete: s3://arn:aws:s3:ap-northeast-1:123456789012:accesspoint/ap-system1/system1/system2/2.dat

参考

StringNotLikeで複数条件したいなら

            "Condition": {
                "StringNotLike": {
                    "s3:prefix": [
                        "hoge/*",
                        "arege/*"
                    ]
                }
            }
S3のIAM設定のハマりどころ - 続 カッコの付け方