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

如何配置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权限评估遵循「先允许、后拒绝,拒绝优先」的规则,此策略的逻辑为:

  1. 先通过第一个Allow语句,开放所有主体的s3:GetObject权限(基础允许)
  2. 再通过第二个Deny语句,拒绝同时满足以下两个条件的请求:
    • 请求来源IP不在指定的74.X.X.X/32范围内
    • 请求未携带有效AWS签名(即不是预签名URL)

完全匹配你的需求:

  • 指定IP范围内:无论直接访问(无签名)还是使用预签名URL,都不会触发Deny,允许访问
  • 不在指定IP范围内:只有携带有效签名的预签名URL请求能绕过Deny,允许访问;无签名的直接访问会被拒绝

关键注意事项

  • 资源范围只需指定对象级别(arn:aws:s3:::mybucket/*),无需包含桶本身,因为s3:GetObject是针对对象的操作
  • 预签名URL生成时使用的IAM用户/角色,必须本身拥有s3:GetObject权限(桶策略的允许是基础,预签名的签名验证依赖于此)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:41