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

如何配置Amazon S3策略实现特定IP的Put/List权限及全局Get权限

解决S3桶策略权限配置问题

我来帮你搞定这个S3桶策略的问题——你的需求是让特定IP(56.160.12.114)拥有Put和List对象的权限,其余IP只能读取,但你当前的策略逻辑完全走反了,直接把非指定IP的所有操作都封了,包括你想开放的Get权限。

原策略的问题分析

你的原策略是这么写的:

{ "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPDeny", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "s3:*", "Resource": "arn:aws:s3:::my-wicked-awesome-bucket/*", "Condition": { "NotIpAddress": { "aws:SourceIp": "56.160.12.114/28" } } } ] }

这里的核心问题有两个:

  1. 过度拒绝:Effect: Deny + NotIpAddress 意味着所有不在56.160.12.114/28段的IP,会被拒绝执行所有S3操作,包括你想开放的Get权限,这完全不符合你的需求。
  2. 缺少允许规则:S3的权限默认是拒绝所有操作的,你没有给指定IP显式授予Put和List的权限,哪怕是指定IP也无法执行这些操作。

正确的策略配置

根据你的需求,我们需要分两步配置:先开放所有IP的Get权限,再给指定IP额外开放Put和List权限。如果担心有其他IAM权限冲突,还可以加一个Deny规则兜底。

基础版策略(无冲突场景)

这个版本适用于没有其他IAM权限干扰的情况,利用S3默认拒绝的特性,自动限制非指定IP的Put/List操作:

{
  "Id": "S3PolicyId1",
  "Statement": [
    // 允许所有IP读取桶内对象
    {
      "Sid": "AllowAllIPsGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-wicked-awesome-bucket/*"
    },
    // 仅允许指定IP执行Put和List操作
    {
      "Sid": "AllowSpecificIPPutsAndLists",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:ListBucketVersions"
      ],
      "Resource": [
        "arn:aws:s3:::my-wicked-awesome-bucket",
        "arn:aws:s3:::my-wicked-awesome-bucket/*"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "56.160.12.114/28"
        }
      }
    }
  ]
}

增强版策略(带兜底Deny)

如果你的用户可能通过IAM角色获得了额外的Put/List权限,可以加一个Deny规则确保非指定IP无法执行这些操作(Deny优先级高于Allow):

{
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "AllowAllIPsGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-wicked-awesome-bucket/*"
    },
    {
      "Sid": "AllowSpecificIPPutsAndLists",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:ListBucketVersions"
      ],
      "Resource": [
        "arn:aws:s3:::my-wicked-awesome-bucket",
        "arn:aws:s3:::my-wicked-awesome-bucket/*"
      ],
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "56.160.12.114/28"
        }
      }
    },
    // 拒绝非指定IP执行Put和List操作
    {
      "Sid": "DenyNonSpecificIPPutsAndLists",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:ListBucketVersions"
      ],
      "Resource": [
        "arn:aws:s3:::my-wicked-awesome-bucket",
        "arn:aws:s3:::my-wicked-awesome-bucket/*"
      ],
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "56.160.12.114/28"
        }
      }
    }
  ]
}

关键细节说明

  • 资源区分:List操作(比如s3:ListBucket)的资源是桶本身(arn:aws:s3:::my-wicked-awesome-bucket),而Put/Get操作的资源是桶内对象(arn:aws:s3:::my-wicked-awesome-bucket/*),所以需要同时指定这两个资源。
  • IP段注意:56.160.12.114/28是一个包含16个IP的网段(56.160.12.112-56.160.12.127),如果你只需要单个IP,应该改为56.160.12.114/32。
  • 测试验证:可以用AWS的IAM Policy Simulator来测试不同IP的权限是否符合预期,避免配置错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:41:44