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
相关产品推荐
相关产品推荐

