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

为何受IAM IP限制的用户仍能生成S3预签名URL?

问题描述

我有一个AWS IAM用户,已为其附加如下策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3ActionsFromSpecificIP",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "11.22.33.44"
                }
            }
        }
    ]
}

同时我编写了一个使用boto3生成S3预签名URL的Python脚本,大致如下:

try:
    presigned_url = s3_client.generate_presigned_url(
        'get_object',
        Params={'Bucket': bucket_name, 'Key': object_key},
        ExpiresIn=expiration
    )
    print("Presigned URL:", presigned_url)
except Exception as e:
    print("Error generating presigned URL:", e)

我将该用户的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY导出为环境变量后,在非11.22.33.44的IP环境下运行脚本,发现脚本可正常生成预签名URL,但aws s3 ls命令却因IP限制被拦截,这是为什么?

原因解析
  • 生成预签名URL的权限逻辑:调用generate_presigned_url时,AWS并不会实际执行对应的S3操作(比如get_object),只是用本地持有的Access Key和Secret Key对请求参数进行签名计算。这个过程不需要向AWS服务端发起权限校验请求,因此不受IAM策略中的IP条件限制,只要密钥合法就能完成签名生成。
  • aws s3 ls的权限逻辑:执行aws s3 ls时,CLI会直接向AWS S3服务端发起请求,服务端会严格校验IAM策略中的所有条件(包括aws:SourceIp)。因为当前IP不在允许的11.22.33.44范围内,所以请求被拦截。
  • 补充说明:虽然预签名URL能正常生成,但当使用这个URL去访问S3对象时,请求的来源IP如果不在允许范围内,同样会被S3服务端拒绝——因为此时才会触发实际的对象访问权限校验,会检查策略中的IP条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:27:05