バケットポリシーの動き(評価論理)について、サポート回答などを踏まえて改めて理解したので以下に整理する。
目次
前提知識
バケットポリシーにおけるSid(Effect) ごとのステートメントは、ORで評価される。
ただし、denyの条件に合致した場合にはdenyが優先となる。
バケットポリシーのdenyの意味
以下のようなS3バケットポリシーを例にしてdenyの動作を確認する。
下記の場合、denyでSourceIp以外からのs3:PutObjectと、s3:GetObjectの操作を拒否している。裏を返せば、SourceIp指定のIPからのアクセスであれば、s3:PutObjectと、s3:GetObjectが利用可能。(厳密には、denyだけでなく、allowの認証情報が必要なため、別途バケットポリシーか、IAMポリシーで該当のアクションをallowする記述が必要になる。)
また、拒否されるのはs3:PutObjectと、s3:GetObjectの操作のみであるため、s3:ListBucketなど別のアクションであれば、拒否されない。下のバケットポリシーでは、testuserというIAMユーザのクレデンシャルがあれば、どこのIPからでもs3:ListBucketのみ実行可能となる。
denyを用いたバケットポリシーの例:
{
"Version": "2008-10-17",
"Id": "DenyAccessFromUnauthorizedSourceIPS",
"Statement": [
{
"Sid": "AAAAA",
"Effect": "Allow",
"Principal": {
"AWS": "arn: aws: iam:: XXXXXX:root"
},
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
],
"arn:aws:s3:::bucket_name",
"arn:aws:s3:::bucket_name/*
"Condition": {
"StringLike": {
"aws: PrincipalArn": [
"arn:aws:iam::XXXX::user/testuser",
"arn:aws:iam::XXXX::root"
]
}
}
},
{
"Sid": "BBBB",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"11.11.11.11/32"
]
}
}
}
]
}