为什么我的 S3 存储桶策略拒绝跨账户访问?
Why is my S3 bucket policy denying cross account access?
我在账户 A 中有一个 S3 存储桶。
此存储桶已使用 ACL 授权 与帐户 B 的规范 ID(具有所有权限)共享。
当存储桶策略为空时,账户 B 中的 EC2 实例能够列出账户 A 上的 S3 存储桶。
存储桶是 public,我想授予对特定 public IP 和帐户 A 上配置的特定 VPC 的访问权限。
这是存储桶策略:
{
"Version": "2012-10-17",
"Id": "S3_Bucket_Policy",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
],
"Condition": {
"StringNotLike": {
"aws:SourceVpc": "vpc_id"
},
"NotIpAddress": {
"aws:SourceIp": [
"67.100.20.15/32",
"79.190.30.2/32"
]
}
}
}
]
}
我可以从以下 IP 地址和指定的 VPC 访问 S3 存储桶,但是,我无法从账户 B 的 EC2 实例访问该存储桶。
EC2 实例具有以下分配的角色和以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
]
}
]
}
为什么我无法从账户 B 访问账户 A 中的存储桶?
您的 S3 存储桶策略中有一个明确的 Deny
语句,它覆盖了 Allow
语句,因此更改您的 Deny
语句以允许账户 B 的角色校长.
此策略评估逻辑在 AWS Identity and Access Management 中突出显示
用户指南:
在这种情况下,您将落入第一个红色方块,这将使最终决定成为 Deny
。
更改您的 StringNotEquals
以同时检查帐户 B 的 aws:PrincipalArn
角色,这样策略就不会再拒绝帐户 B 的角色:
"Condition": {
"StringNotLike": {
"aws:SourceVpc": "vpc_id",
"aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"NotIpAddress": {
"aws:SourceIp": [
"67.100.20.15/32",
"79.190.30.2/32"
]
}
}
完整的工作示例:
{
"Version": "2012-10-17",
"Id": "S3_Bucket_Policy",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
],
"Condition": {
"StringNotLike": {
"aws:SourceVpc": "vpc_id",
"aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"NotIpAddress": {
"aws:SourceIp": [
"67.100.20.15/32",
"79.190.30.2/32"
]
}
}
}
]
}
我在账户 A 中有一个 S3 存储桶。
此存储桶已使用 ACL 授权 与帐户 B 的规范 ID(具有所有权限)共享。
当存储桶策略为空时,账户 B 中的 EC2 实例能够列出账户 A 上的 S3 存储桶。
存储桶是 public,我想授予对特定 public IP 和帐户 A 上配置的特定 VPC 的访问权限。
这是存储桶策略:
{
"Version": "2012-10-17",
"Id": "S3_Bucket_Policy",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
],
"Condition": {
"StringNotLike": {
"aws:SourceVpc": "vpc_id"
},
"NotIpAddress": {
"aws:SourceIp": [
"67.100.20.15/32",
"79.190.30.2/32"
]
}
}
}
]
}
我可以从以下 IP 地址和指定的 VPC 访问 S3 存储桶,但是,我无法从账户 B 的 EC2 实例访问该存储桶。
EC2 实例具有以下分配的角色和以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
]
}
]
}
为什么我无法从账户 B 访问账户 A 中的存储桶?
您的 S3 存储桶策略中有一个明确的 Deny
语句,它覆盖了 Allow
语句,因此更改您的 Deny
语句以允许账户 B 的角色校长.
此策略评估逻辑在 AWS Identity and Access Management 中突出显示 用户指南:
在这种情况下,您将落入第一个红色方块,这将使最终决定成为 Deny
。
更改您的 StringNotEquals
以同时检查帐户 B 的 aws:PrincipalArn
角色,这样策略就不会再拒绝帐户 B 的角色:
"Condition": {
"StringNotLike": {
"aws:SourceVpc": "vpc_id",
"aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"NotIpAddress": {
"aws:SourceIp": [
"67.100.20.15/32",
"79.190.30.2/32"
]
}
}
完整的工作示例:
{
"Version": "2012-10-17",
"Id": "S3_Bucket_Policy",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket_name",
"arn:aws:s3:::s3_bucket_name/*"
],
"Condition": {
"StringNotLike": {
"aws:SourceVpc": "vpc_id",
"aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role"
},
"NotIpAddress": {
"aws:SourceIp": [
"67.100.20.15/32",
"79.190.30.2/32"
]
}
}
}
]
}