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設定のハマりどころ - 続 カッコの付け方