如何修改S3 Bucket Policy实现单文件专属IP访问控制?
解决方案:给S3特定文件设置独立IP访问权限
要实现这个需求,核心是利用S3 Bucket Policy的资源匹配优先级和条件组合——更具体的资源(比如单个文件)对应的规则会优先于桶级规则,同时通过条件过滤来区分不同文件的访问权限。下面是具体的实现步骤和完整Policy:
思路拆解
我们需要三个核心规则来达成目标:
- 保留原有IP段对除目标文件外所有内容的访问权限
- 仅允许指定IP访问目标文件
onefile.txt - 明确拒绝原有IP段访问目标文件(可选,但能更清晰地强化规则逻辑)
完整Bucket Policy
{ "Version": "2012-10-17", "Id": "mixed-ip-restriction-policy", "Statement": [ { "Sid": "AllowOriginalIPsForNonTargetFiles", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::MYBUCKET/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "1.1.1.0/20", "2.2.2.0/22" ] }, "StringNotEquals": { "s3:key": "onefile.txt" } } }, { "Sid": "AllowSpecificIPsForTargetFile", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::MYBUCKET/onefile.txt", "Condition": { "IpAddress": { "aws:SourceIp": [ "3.3.3.0/32", "4.4.4.0/32" ] } } }, { "Sid": "DenyOriginalIPsForTargetFile", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::MYBUCKET/onefile.txt", "Condition": { "IpAddress": { "aws:SourceIp": [ "1.1.1.0/20", "2.2.2.0/22" ] } } } ] }
规则详解
第一个Statement(AllowOriginalIPsForNonTargetFiles):
保留了你原来的IP段访问权限,但通过StringNotEquals条件排除了onefile.txt——也就是说,只有当访问的不是这个目标文件时,原有IP段的用户才能正常读取内容。第二个Statement(AllowSpecificIPsForTargetFile):
专门针对onefile.txt设置允许规则,仅放行3.3.3.0和4.4.4.0这两个IP(这里用/32表示单个IP,如果你实际是网段可以调整掩码)。第三个Statement(DenyOriginalIPsForTargetFile):
这是一个可选但推荐的规则,明确拒绝原有IP段访问目标文件。虽然S3默认是"隐式拒绝"(没有允许规则就会拒绝),但加上这个规则可以让权限逻辑更清晰,避免后续规则变更导致的意外权限泄漏。
验证方法
你可以通过以下方式测试规则是否生效:
- 用
1.1.1.0/20或2.2.2.0/22内的IP访问桶内其他文件(比如s3://MYBUCKET/otherfile.txt),应该能正常读取;访问onefile.txt则会被拒绝。 - 用
3.3.3.0或4.4.4.0访问onefile.txt,可以正常读取;访问其他文件会被拒绝(因为这些IP不在原有允许列表里)。 - 用其他任意IP访问任何文件,都会被拒绝。
内容的提问来源于stack exchange,提问作者spcsLrg




