如何配置AWS S3桶策略:仅允许指定IP或预签名URL获取对象
解决AWS S3桶策略:仅允许指定IP或预签名URL访问GetObject
你的核心需求是实现「指定IP直接访问/预签名URL访问二选一」的GetObject权限控制,原策略的问题在于错误使用了aws:ViaAWSService条件(该条件用于判断请求是否经AWS内部服务转发,与预签名URL无关),正确的判断依据应为aws:SignatureExists——它能识别请求是否携带有效的AWS签名(预签名URL的请求会包含此签名)。
正确的完整桶策略
{ "Version": "2012-10-17", "Id": "AllowIpOrPresignedUrl", "Statement": [ { "Sid": "AllowBaseGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mybucket/*" }, { "Sid": "DenyUnauthorizedGetObject", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mybucket/*", "Condition": { "NotIpAddress": { "aws:SourceIp": "74.X.X.X/32" }, "Bool": { "aws:SignatureExists": "false" } } } ] }
策略逻辑与效果说明
AWS权限评估遵循「先允许、后拒绝,拒绝优先」的规则,此策略的逻辑为:
- 先通过第一个
Allow语句,开放所有主体的s3:GetObject权限(基础允许) - 再通过第二个
Deny语句,拒绝同时满足以下两个条件的请求:- 请求来源IP不在指定的
74.X.X.X/32范围内 - 请求未携带有效AWS签名(即不是预签名URL)
- 请求来源IP不在指定的
完全匹配你的需求:
- 指定IP范围内:无论直接访问(无签名)还是使用预签名URL,都不会触发Deny,允许访问
- 不在指定IP范围内:只有携带有效签名的预签名URL请求能绕过Deny,允许访问;无签名的直接访问会被拒绝
关键注意事项
- 资源范围只需指定对象级别(
arn:aws:s3:::mybucket/*),无需包含桶本身,因为s3:GetObject是针对对象的操作 - 预签名URL生成时使用的IAM用户/角色,必须本身拥有
s3:GetObject权限(桶策略的允许是基础,预签名的签名验证依赖于此)
内容的提问来源于stack exchange,提问作者mb777
相关产品推荐
相关产品推荐

