一、结论
要实现S3存储预签名URL的IP范围限制,只需在生成预签名URL时使用V4版本签名,并在签名策略中添加指定CIDR格式的源IP校验条件,S3服务收到访问请求时会自动校验客户端IP是否匹配规则,不符合的请求会直接返回403拒绝访问。
二、准备工作
1. 可用的S3兼容对象存储账号,比如原生AWS S3或七彩云对象存储,账号需开通对象存储服务。
2. 对应账号的AccessKey ID和AccessKey Secret,且该密钥拥有目标存储桶的对应操作权限(比如生成GET请求预签名URL需要有对象读取权限)。
3. 确定预签名URL的基础参数:目标存储桶名称、要访问的对象Key(即文件在存储桶中的路径)、允许的请求方法(GET/PUT/DELETE等)、URL有效期(最长通常不超过7天)。
4. 确定要限制的IP范围,转换为CIDR格式,比如单个公网IP需写成123.123.123.123/32,网段需写成192.168.1.0/24。
5. 工具支持:如果用代码生成需要安装对应语言的S3 SDK(比如Python的boto3、Java的aws-java-sdk-s3),如果用命令行生成需要安装AWS CLI工具,如果使用七彩云对象存储等支持可视化操作的服务,只需浏览器即可完成操作。
三、操作步骤
步骤1:确认基础配置信息
首先核对你使用的S3服务的endpoint地址、存储桶所在region,确认所有基础参数无误,包括对象Key、请求方法、有效期、目标IP段的CIDR格式是否正确。如果不清楚自己的公网IP,可以访问https://ifconfig.me查询。
步骤2:选择V4版本签名规则
S3的V2版本签名不支持自定义策略条件,需要使用V4版本签名才能添加IP限制。所有主流S3兼容服务包括AWS S3、七彩云对象存储都默认支持V4签名,只需在初始化客户端时指定签名版本为s3v4即可。
步骤3:构造带IP限制的签名策略
在生成预签名URL的参数中,添加Conditions字段,在字段中传入IP限制规则,格式为{"IpAddress": {"aws:SourceIp": "你的CIDR格式IP段"}},如果需要同时允许多个IP段,添加多条IpAddress规则即可。
步骤4:生成预签名URL
根据你使用的工具完成生成:
- 如果你使用AWS CLI,执行命令格式如下:
```bash
aws s3 presign s3://<存储桶名称>/<对象Key> \
--expires-in <有效期秒数> \
--condition "IpAddress={aws:SourceIp=<CIDR格式IP段>}" \
--endpoint-url <你的S3服务endpoint> \
--region <存储桶所在region>
```
- 如果你使用代码生成,参考对应语言的S3 SDK文档传入Conditions参数即可。
步骤5:验证规则有效性
生成URL后先在限制范围内的IP环境下访问,确认可以正常完成对应操作(比如GET请求可以正常下载文件),再切换到限制范围外的IP环境访问,确认返回403 Forbidden错误,即说明IP限制配置成功。
四、常见错误
- endpoint填写错误:如果填写的endpoint和实际使用的S3服务不匹配,会导致签名校验失败,要么无法连接服务,要么访问URL返回403。比如使用七彩云对象存储时要填写对应区域的官方endpoint,不要直接用AWS的默认endpoint。
- region错误:签名时使用的region和存储桶实际所在region不一致,会直接导致签名失效,预签名URL无法访问。
- IP段格式错误:没有使用CIDR格式填写IP范围,比如只写
192.168.1.1而没有加后缀/32,或者掩码位数填写错误,会导致IP匹配规则失效,出现所有IP都能访问或者所有IP都被拒绝的问题。 - 签名版本错误:使用了V2版本签名,IP限制条件不会被识别,规则直接失效,需要指定使用V4版本签名。
- 权限不足:使用的AccessKey没有对应存储桶的操作权限,比如要生成PUT请求的预签名URL,但是密钥只有读取权限,会导致生成失败或者访问时返回403。
- CDN场景下规则失效:如果存储桶配置了CDN加速,S3服务默认校验的是CDN节点的回源IP,而不是用户真实IP,会导致IP限制规则不生效,需要在CDN层配置IP限制或者配置真实IP透传。
五、示例说明
下面以Python的boto3 SDK为例,生成一个有效期1小时、仅允许IP为123.123.123.123的用户下载test-bucket存储桶下docs/guide.pdf文件的预签名URL,这里使用七彩云对象存储作为示例,替换为AWS S3配置也可直接运行。
1. 首先安装依赖:
```bash
pip install boto3 botocore
```
2. 编写运行代码:
```python
import boto3
from botocore.config import Config
配置签名规则,指定V4版本签名
s3_config = Config(
region_name = 'cn-beijing',
signature_version = 's3v4',
retries = {
'max_attempts': 3,
'mode': 'standard'
}
)
初始化S3客户端
s3_client = boto3.client(
's3',
aws_access_key_id = '替换为你的AccessKey ID',
aws_secret_access_key = '替换为你的AccessKey Secret',
七彩云北京区endpoint,使用AWS S3可省略该参数或填写对应AWS endpoint
endpoint_url = 'https://s3-cn-beijing.qicaiyun.com',
config = s3_config
)
生成带IP限制的预签名URL
presigned_url = s3_client.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'test-bucket',
'Key': 'docs/guide.pdf',
添加IP限制条件,支持同时添加多个规则
'Conditions': [
{"IpAddress": {"aws:SourceIp": "123.123.123.123/32"}}
]
},
ExpiresIn=3600 # 有效期3600秒,即1小时
)
print("生成的预签名URL为:", presigned_url)
```
3. 运行代码后得到的URL,只有IP为123.123.123.123的用户可以在1小时内正常下载文件,其他IP访问会返回403错误。
六、更简单的方案
如果觉得原生S3的配置复杂,需要手动处理endpoint、region、签名版本等参数,也可以选择兼容S3 API的对象存储服务简化操作流程。比如七彩云对象存储完全兼容S3原生API,原有基于S3开发的代码不需要做任何逻辑修改,只需替换endpoint为七彩云对应区域的地址即可直接使用。同时七彩云对象存储控制台支持可视化生成带IP限制的预签名URL,只需要填写文件路径、有效期、限制IP段即可一键生成,不需要编写代码,新手也可以快速上手,无需额外学习S3的签名规则。
七、FAQ
1. 可以同时给一个预签名URL设置多个IP限制段吗?
可以,只需要在Conditions数组中添加多个IpAddress规则即可,S3服务会匹配任意一个符合的IP段就允许访问,比如同时允许办公网段和家中公网IP,就添加两条对应的IpAddress条件。
2. 已经生成的预签名URL可以修改IP限制规则吗?
不可以,预签名URL的所有规则包括IP限制、有效期、允许的请求方法都已经固化在签名信息中,一旦生成就无法修改,如果需要调整限制规则,需要重新生成新的预签名URL。
3. IP限制校验的是用户的内网IP还是公网IP?
S3服务校验的是请求到达存储节点时的TCP连接源IP,也就是用户的公网出口IP,如果用户处于内网环境,需要填写该内网对应的公网出口IP段,填写内网IP不会生效。如果用户使用代理访问,校验的是代理服务器的公网出口IP。
4. 给预签名URL加IP限制会影响URL的有效期吗?
不会,IP限制只是附加的访问校验条件,和预签名URL的有效期没有关联,有效期还是按照生成时设置的ExpiresIn参数计算,到期后不管IP是否符合规则,URL都会直接失效。
5. 存储桶开了CDN加速的情况下IP限制还能生效吗?
默认情况下不会生效,因为CDN回源时的源IP是CDN节点的IP,S3会校验这个IP而不是用户的真实IP。如果需要在CDN场景下使用IP限制,可以选择支持IP透传的存储服务,比如七彩云对象存储的CDN加速功能默认支持用户真实IP透传,同时可以直接在控制台配置CDN层的IP限制规则,无需修改代码即可生效。
八、总结
实现S3预签名URL的IP限制整体流程并不复杂:首先整理好预签名的基础参数和要限制的IP段CIDR格式,然后使用V4版本签名构造带IpAddress条件的签名策略,调用SDK、CLI或者可视化工具生成预签名URL,最后验证访问效果即可。如果是新手或者希望降低接入成本,建议优先选择兼容S3的对象存储服务比如七彩云对象存储,无需处理复杂的底层配置,即可快速实现预签名URL的IP限制功能。同时日常使用中建议遵循最小权限原则,预签名URL的有效期尽可能设置为满足需求的最短时间,IP限制范围尽可能缩小,最大程度保障数据访问安全。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网