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

如何限制S3 Bucket仅允许特定客户端IP上传?权限拒绝问题排查

问题分析与解决方案

问题根源

你的S3桶策略通过NotIpAddress拒绝了所有非指定IP(203.0.113.45/32)的请求,但日志中显示PUT请求来自AWS内部IP(15.236.X.X),这是因为上传对象触发的Lambda函数在执行时会向S3发起请求——Lambda运行在AWS基础设施中,其请求源IP属于AWS服务IP范围,因此被桶策略拒绝,最终导致AccessDenied错误。

解决方案

要实现「仅允许特定客户端IP上传,同时允许Lambda访问桶内对象」的需求,需调整桶策略区分客户端直接请求与Lambda服务请求,以下是两种可行方案:

方案1:添加Lambda执行角色的允许规则

直接为Lambda执行角色添加权限,绕过IP限制,同时保留对非指定IP客户端的拒绝规则:

{
    "Version": "2012-10-17",
    "Id": "my_policy_id",
    "Statement": [
        {
            "Sid": "AllowSpecificClientIP",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::testbucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "203.0.113.45/32"
                }
            }
        },
        {
            "Sid": "AllowLambdaExecutionRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[你的AWS账户ID]:role/[Lambda执行角色ARN]"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::testbucket/*"
        },
        {
            "Sid": "DenyNonAllowedRequests",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::testbucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "203.0.113.45/32"
                },
                "NotPrincipal": {
                    "AWS": "arn:aws:iam::[你的AWS账户ID]:role/[Lambda执行角色ARN]"
                }
            }
        }
    ]
}

方案2:使用aws:ViaAWSService条件区分请求类型

利用AWS提供的aws:ViaAWSService条件键,精准识别直接来自客户端的请求(aws:ViaAWSService: false)和AWS服务发起的请求(如Lambda),再分别配置权限:

{
    "Version": "2012-10-17",
    "Id": "my_policy_id",
    "Statement": [
        {
            "Sid": "AllowDirectClientRequest",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::testbucket/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "203.0.113.45/32"
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                }
            }
        },
        {
            "Sid": "AllowLambdaAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[你的AWS账户ID]:role/[Lambda执行角色ARN]"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::testbucket/*"
        },
        {
            "Sid": "DenyAllUnallowedRequests",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::testbucket/*"
        }
    ]
}

额外检查项

  • 若日志中的PUT请求是你自己的客户端上传请求而非Lambda发起,需确认是否启用了S3 Transfer Acceleration:启用后上传请求会经过AWS边缘节点,源IP会显示为AWS服务IP,此时需关闭Transfer Acceleration,或把AWS边缘节点的IP范围加入允许列表。
  • 若你通过VPC端点访问S3,需将VPC的私有IP范围加入aws:SourceIp,或使用aws:SourceVpc条件键限制仅允许指定VPC的请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:23:22