允许从特定 VPC 或控制台访问 S3 Bucket
Allow S3 Bucket access from either specific VPC or console
我将一些应用程序配置存储在 S3 存储桶(api 密钥)的文件中。我将 S3 存储桶配置为仅允许通过特定 VPC 端点进行访问,它将密钥绑定到特定环境,并防止例如在暂存或测试环境中意外使用了生产密钥。
然而偶尔我需要修改这些密钥,这很痛苦。目前存储桶策略阻止控制台访问,所以我必须删除存储桶策略,更新文件,然后替换策略。
我如何才能允许从控制台、特定 VPC 端点进行访问,而不是从其他地方访问?
当前政策,我已经尝试并失败了:
{
"Version": "2012-10-17",
"Id": "Policy12345",
"Statement": [
{
"Sid": "Principal-Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-id:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-keys-staging",
"arn:aws:s3:::my-keys-staging/*"
]
},
{
"Sid": "Access-to-specific-VPCE-only",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-keys-staging",
"arn:aws:s3:::my-keys-staging/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-vpceid"
}
}
}
]
}
如评论中所述,无法覆盖显式 Deny
。通过包含绑定到特定 VPC 的 Deny
,您不能添加任何其他 Allow
元素来抵消该 Deny
语句。
选项 1
一种选择是将您的 "deny if not from VPC abc" 语句更改为 "allow if from VPC abc"。这将允许您向策略中添加额外的 Allow
语句,以允许您从其他地方访问存储桶。
但是,在执行此操作时有两个非常重要的注意事项:
- 任何通过 IAM 策略具有 "generic" S3 访问权限的用户都可以访问存储桶,并且
- 来自所述 VPC 的任何 role/user 都将被允许进入您的存储桶。
因此,通过将 Deny
更改为 Allow
,您将不再有存储桶级别的 VPC 限制。
这可能符合也可能不符合您组织的安全要求。
选项 2
相反,您可以修改现有的 Deny
以添加适用于 AND 情况的附加条件:
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-vpceid",
"aws:username": "your-username"
}
}
如果出现以下情况,此类条件将拒绝请求:
- 请求不是来自您的神奇 VPC,并且
- 请求不是来自您的用户名
因此,您应该能够维持对 VPC 请求的限制,但您的用户登录将被允许从任何地方访问存储桶。
注意这样做会打开安全漏洞。您应该确保将用户名限制为 (a) 没有分配任何访问密钥,并且 (b) 启用了 MFA。
我将一些应用程序配置存储在 S3 存储桶(api 密钥)的文件中。我将 S3 存储桶配置为仅允许通过特定 VPC 端点进行访问,它将密钥绑定到特定环境,并防止例如在暂存或测试环境中意外使用了生产密钥。
然而偶尔我需要修改这些密钥,这很痛苦。目前存储桶策略阻止控制台访问,所以我必须删除存储桶策略,更新文件,然后替换策略。
我如何才能允许从控制台、特定 VPC 端点进行访问,而不是从其他地方访问?
当前政策,我已经尝试并失败了:
{
"Version": "2012-10-17",
"Id": "Policy12345",
"Statement": [
{
"Sid": "Principal-Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-id:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-keys-staging",
"arn:aws:s3:::my-keys-staging/*"
]
},
{
"Sid": "Access-to-specific-VPCE-only",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-keys-staging",
"arn:aws:s3:::my-keys-staging/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-vpceid"
}
}
}
]
}
如评论中所述,无法覆盖显式 Deny
。通过包含绑定到特定 VPC 的 Deny
,您不能添加任何其他 Allow
元素来抵消该 Deny
语句。
选项 1
一种选择是将您的 "deny if not from VPC abc" 语句更改为 "allow if from VPC abc"。这将允许您向策略中添加额外的 Allow
语句,以允许您从其他地方访问存储桶。
但是,在执行此操作时有两个非常重要的注意事项:
- 任何通过 IAM 策略具有 "generic" S3 访问权限的用户都可以访问存储桶,并且
- 来自所述 VPC 的任何 role/user 都将被允许进入您的存储桶。
因此,通过将 Deny
更改为 Allow
,您将不再有存储桶级别的 VPC 限制。
这可能符合也可能不符合您组织的安全要求。
选项 2
相反,您可以修改现有的 Deny
以添加适用于 AND 情况的附加条件:
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-vpceid",
"aws:username": "your-username"
}
}
如果出现以下情况,此类条件将拒绝请求:
- 请求不是来自您的神奇 VPC,并且
- 请求不是来自您的用户名
因此,您应该能够维持对 VPC 请求的限制,但您的用户登录将被允许从任何地方访问存储桶。
注意这样做会打开安全漏洞。您应该确保将用户名限制为 (a) 没有分配任何访问密钥,并且 (b) 启用了 MFA。