如何配置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" } } } ] }
这里的核心问题有两个:
- 过度拒绝:
Effect: Deny+NotIpAddress意味着所有不在56.160.12.114/28段的IP,会被拒绝执行所有S3操作,包括你想开放的Get权限,这完全不符合你的需求。 - 缺少允许规则: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
相关产品推荐
相关产品推荐

