为何受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
相关产品推荐
相关产品推荐

