You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3存储桶仅允许通过VPC终端节点公网访问的配置问题

问题诊断

你当前的桶策略逻辑完全搞反了:

  • 第一条Allow语句给了所有用户(Principal: "*")访问权限,这直接导致公网请求能绕过后续规则
  • 第二条Deny语句的Condition是StringEquals: aws:sourceVpce,意思是当请求来自指定VPCE时,拒绝账户root用户的访问,这和你要实现的「仅允许VPCE访问」目标完全相悖
正确的桶策略配置

要实现「仅允许通过指定VPC终端节点访问S3桶」,正确的策略逻辑是:先放行来自指定VPCE的请求,再兜底拒绝所有非VPCE来源的请求。替换成如下策略(记得替换变量):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "${media_storage_bucket_arn}",
                "${media_storage_bucket_arn}/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "${vpc_endpoint}"
                }
            }
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "${media_storage_bucket_arn}",
                "${media_storage_bucket_arn}/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "${vpc_endpoint}"
                }
            }
        }
    ]
}
关键说明
  • 第一条Allow:仅允许来自指定VPCE的请求执行操作,精准限定访问来源
  • 第二条Deny:兜底拒绝所有非VPCE来源的请求,彻底阻断公网直接访问
  • 保留Principal: "*"是为了让私有子网的EC2能通过对象URL正常访问(只要EC2的IAM权限允许,且请求走VPCE)
额外检查项
  • 确认VPC终端节点是网关型端点(S3专用),且已关联到EC2所在的私有子网
  • 确认EC2所在子网的路由表已添加指向S3网关端点的路由(目标为S3前缀列表,下一跳为VPCE ID)
  • 确保EC2实例的IAM角色/用户拥有s3:GetObject和s3:ListBucket的权限(桶策略与IAM权限为逻辑与关系,二者需同时满足)

内容的提问来源于stack exchange,提问作者Tegue Morrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:42:05