允许从特定 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 语句,以允许您从其他地方访问存储桶。

但是,在执行此操作时有两个非常重要的注意事项:

  1. 任何通过 IAM 策略具有 "generic" S3 访问权限的用户都可以访问存储桶,并且
  2. 来自所述 VPC 的任何 role/user 都将被允许进入您的存储桶。

因此,通过将 Deny 更改为 Allow,您将不再有存储桶级别的 VPC 限制。

这可能符合也可能不符合您组织的安全要求。

选项 2

相反,您可以修改现有的 Deny 以添加适用于 AND 情况的附加条件:

"Condition": {
  "StringNotEquals": {
    "aws:sourceVpce": "vpce-vpceid",
    "aws:username": "your-username"
  }
}

如果出现以下情况,此类条件将拒绝请求:

  1. 请求不是来自您的神奇 VPC,并且
  2. 请求不是来自您的用户名

因此,您应该能够维持对 VPC 请求的限制,但您的用户登录将被允许从任何地方访问存储桶

注意这样做会打开安全漏洞。您应该确保将用户名限制为 (a) 没有分配任何访问密钥,并且 (b) 启用了 MFA。