AWS海外账号 如何限制特定IP地址才能访问亚马逊S3存储的内容
这类需求通常来自两种场景:其一,静态站点或文件分发只允许公司办公网段访问;其二,应用的私有下载必须绑定客户的固定出口IP,避免外泄。下面我按决策顺序,把可落地的方案、账号开通与风控、支付与成本、常见失败点逐一说清楚,重点回答实际落地过程中你会遇到的问题。
先明确决策:你要限制的是“用户来源IP”还是“服务来源IP”
- 用户来源IP:来自互联网的终端访问,比如办公网出口、客户机房公网IP。适合用 S3 桶策略按 IP 拒绝或 CloudFront+WAF 允许名单。
- 服务来源IP:你的计算实例、容器、Lambda 在 VPC 内访问 S3。此时不要用公网 IP 规则,应使用 S3 VPC Endpoint 限制,只允许通过指定 VPC 端点访问。
- 是否需要全球加速与缓存:若有跨区域用户或希望控制防爬,建议前置 CloudFront,IP限制放在 WAF;S3 只允许来自 CloudFront 的请求。
三条主线方案与落地成本
| 方案 | 如何实施 | 适用场景 | 成本与限制 |
|---|---|---|---|
| S3 桶策略直控 IP | 在桶策略用 Deny + NotIpAddress 拒绝非白名单IP |
小规模文件分发,直连 S3,不走 CDN | 0元额外服务费;移动网络、代理会导致用户IP不稳定;CloudFront下不可直接用 |
| CloudFront + WAF + S3 OAC | S3只允许来自指定 CloudFront 发行版;IP白名单在 WAF 维护 | 需要全球分发/缓存/更细粒度防护 | CloudFront与WAF有持续费用;配置复杂度中等;更可控 |
| VPC Endpoint 限制 | 桶策略仅允许 aws:sourceVpce 指定端点 |
仅VPC内服务访问,无公网用户 | 端点网关免费但走AWS内网;不能识别公网用户IP |
落地步骤:S3 桶策略按IP白名单(不经CloudFront)
适合直连 S3 的下载场景。注意:
- 显式拒绝优先于允许,建议统一用显式 Deny 拦截所有非白名单IP。
- AWS海外账号 同时覆盖对象读取与列目(GetObject 和 ListBucket)。
- 白名单写成 CIDR,IPv4 与 IPv6 分别维护。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyReadIfNotFromAllowedIPs",
"Effect": "Deny",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::your-bucket/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"203.0.113.10/32",
"198.51.100.0/24",
"2001:db8::/32"
]
}
}
},
{
"Sid": "DenyListIfNotFromAllowedIPs",
"Effect": "Deny",
"Principal": "*",
"Action": ["s3:ListBucket"],
"Resource": "arn:aws:s3:::your-bucket",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"203.0.113.10/32",
"198.51.100.0/24",
"2001:db8::/32"
]
}
}
}
]
}
实操提醒:
- 预签名URL也会被上述显式拒绝拦截,这是预期行为;如果需要少数外网临时访问,不要改桶策略,用 CloudFront 签名URL/签名Cookie控制。
- 若你的应用部署在AWS内网并通过 VPC Endpoint 访问 S3,则
aws:SourceIp不可用,需改用aws:sourceVpce条件。
落地步骤:CloudFront + WAF + S3 OAC(推荐给大多数互联网访问)
做法是把IP控制交给WAF,S3只接收来自 CloudFront 的请求,避免 S3 直接暴露给公网。
- 创建 CloudFront 分发,源站指向 S3 桶,开启 Origin Access Control(OAC)。
- 桶策略只允许指定 CloudFront 分发访问:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowOnlyCloudFrontDistribution",
"Effect": "Allow",
"Principal": { "Service": "cloudfront.amazonaws.com" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/E123ABC456"
}
}
}
]
}
- 在 AWS WAF 创建 IP 集合(IP set),维护你的白名单网段;在关联的Web ACL中添加“仅允许白名单”规则,其余默认阻断。
- 按需使用 CloudFront 的签名URL/签名Cookie,为临时访问增加有效期与IP范围限制(签名策略支持 IpAddress 条件)。
实操提醒:
- 用户真实IP只在WAF层可见,S3端只看到 CloudFront 的源站IP,别在桶策略里写
aws:SourceIp针对用户IP,否则会全部被拒绝。 - 移动办公用户IP不稳定时,用签名URL的短有效期 + 账号登录控制代替严格的IP白名单。
落地步骤:VPC Endpoint 约束(只给VPC内服务)
如果你只允许自家VPC里的服务访问S3,直接锁死到端点最干净:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFromSpecificVPCE",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject","s3:ListBucket"],
"Resource": ["arn:aws:s3:::your-bucket","arn:aws:s3:::your-bucket/*"],
"Condition": { "StringEquals": { "aws:sourceVpce": "vpce-0abc123def456" } }
},
{
"Sid": "DenyOthers",
"Effect": "Deny",
"Principal": "*",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::your-bucket","arn:aws:s3:::your-bucket/*"],
"Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-0abc123def456" } }
}
]
}
AWS海外账号 这是服务来源控制,不解决公网用户IP问题。但对内网合规非常实用。
账号购买与开通:国际站与中国区的关键差异
- AWS海外账号 AWS国际站:使用国际信用卡注册,邮箱验证、手机验证、短信或语音回拨。开通后即可创建 S3 与 CloudFront。
- AWS中国(北京/宁夏):账号与控制台独立运营,需企业或个人实名认证,网站托管若面向公众还涉及备案。S3与CloudFront在中国区可用,但费用与合规不同。
- 如果你的访问主体在中国境内且需要固定IP白名单,建议明确选择区域:在中国区部署可以减少跨境网络波动,但支付与合规流程更繁琐;国际站更灵活,但跨境网络与监管需评估。
实名认证与风控审核注意事项
- 国际站新账号常见风控:支付卡BIN所在国家与注册地址不一致、注册IP频繁变动、同设备短期内开多个账号。可能触发额外验证或临时限制。
- 中国区必须完成实名,企业需提供统一社会信用代码、法人信息;个人需身份证信息。资料不一致会导致服务不可用或延迟。
- 从风控角度,S3大规模公共拒绝(频繁403)不会直接触发账号风控,但若伴随异常带宽与跨区访问,可能被标记异常使用,建议开启访问日志并留存审计。
支付方式、充值与续费
- 国际站:按量计费,无需充值;支持信用卡、账单发票(需申请并通过资信评估)、预付费代金券(通过合作伙伴获取)。CloudFront与WAF按用量扣费。
- 中国区:支持国内银行卡与发票结算,月度账单及充值方式不同,企业采购通常走合同与对公付款。
- IP控制本身不收费,但使用 CloudFront/WAF 会产生固定与用量费用,建议预留月度预算,避免账单波动。
成本对比与测算思路
- S3直连 + 桶策略:只产生 S3 存储与请求费用(GET 量、数据外传)。适合下载量不高、地区集中。
- CloudFront + WAF:额外产生 CDN 流量与请求费用、WAF规则与请求费用。若跨区域访问量大,整体单次下载成本可能反而下降(CDN缓存减少源站外传),但有固定的WAF开销。
- 内部访问(VPC Endpoint):无公网外传费,数据走内网;若有跨账户访问需评估架构复杂度与运维成本。
- 测算方法:取近30日实际访问量(GB与请求数),分别估算 S3 外传与 CloudFront/WAF 费用;将 IP白名单命中率作为变量,降低被拒流量对成本的影响。
使用限制与风险提示
- 用户在代理或零信任网关后,其公网IP可能变化,严格白名单会导致误拒。对外客户建议采用 CloudFront 签名URL/短时Token 与账号绑定,IP仅作为辅助。
- IPv6越来越普及,若你的用户网络启用IPv6但白名单仅有IPv4,会出现穿透访问。务必同时维护 IPv4/IPv6 白名单。
- 在CloudFront场景下,把IP限制写进S3桶策略是错误做法,必须在WAF解决。
常见失败原因与排查
- 桶策略写成“Allow + IpAddress”,但存在其他允许路径,外部仍能访问。建议统一使用显式“Deny + NotIpAddress”。
- 忘记为
ListBucket单独写资源arn:aws:s3:::bucket,导致目录列举异常。 - AWS海外账号 在使用 VPC Endpoint 时还依赖
aws:SourceIp条件,导致内网访问被拒。此时应改用aws:sourceVpce。 - CloudFront前置后,桶策略仍按用户IP限制,结果所有请求被拒。应改为仅允许来自CloudFront的请求,并把IP限制放进WAF。
- IPv6未纳入白名单,双栈网络用户被拒。检查客户端是否走IPv6路径。
- 误填私网网段到白名单(如 10.0.0.0/8),对公网访问无效。白名单必须是公网出口IP。
不同地区的落地差异
- 中国区合规:若你把S3当静态网站源站且面向公众,需要备案;限定IP后仍属对外服务,合规照样适用。
- 跨境访问:国内用户访问国际站S3,IP限制有效但网络质量不稳定;CloudFront在国内节点有限,若面向大陆用户可考虑中国区CloudFront与备案流程。
- 客户出口IP动态变化:部分运营商会更换公网IP段,建议约定定期同步白名单或改用账号鉴权策略。
实际案例:从“直连S3+IP白名单”迁移到“CloudFront+WAF”
AWS海外账号 一家教育客户最初用S3桶策略限制两处校区出口IP,访问量在晚高峰出现大量403与带宽峰值。排查发现:
- 学生在家访问,运营商出口IP不在白名单;移动网络频繁变更IP。
- 直连S3导致跨区域外传成本居高不下。
AWS海外账号 调整方案:
- 前置CloudFront并启用OAC;S3只接受来自指定分发。
- WAF维护校区IP白名单,外部临时访问使用签名URL,有效期2小时。
- 把大文件做分片并设置合理缓存策略,削峰。
结果:403显著下降,峰值外传成本降低;管理侧把“某用户必须在校内访问”的要求转为签名URL+登录态控制,IP仅辅助。
FAQ
- 预签名URL能否绑定IP?S3预签名本身不支持按用户IP限制,配合桶策略的显式Deny可以达到目的,但对移动用户体验差。CloudFront签名URL支持IP限制条件,更灵活。
- 是否可以只限制某前缀(文件夹)的IP?可以,桶策略的 Resource 设为
arn:aws:s3:::bucket/prefix/*,按前缀分段控制。 - 公司有多地办公,如何管理白名单?用WAF的IP set集中管理,变更无需改桶策略;或使用基础设施即代码(CloudFormation/Terraform)版本化白名单。
- 能否记录被拒的IP?开启 CloudFront/WAF 日志或 S3 访问日志,可审计来源IP与拒绝原因。
决策建议
- 小规模、直连下载:S3桶策略显式Deny + 白名单,控制简单,0额外服务费。
- 面对互联网用户且需更强控制:CloudFront+WAF+OAC,把IP限制前移,S3仅接收来自分发的请求。
- 仅内部服务:VPC Endpoint约束,比公网IP白名单更稳更可控。
- 国际站 vs 中国区:若面向大陆用户且有备案能力,优先中国区;否则国际站更快开通,但要考虑跨境网络与支付。

