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

API Gateway:为何同时需要ALLOW和DENY资源策略?

AWS资源策略中ALLOW+DENY组合的必要性疑问

我在查阅AWS官方文档时,看到一个仅允许特定CIDR范围内IP请求的资源策略示例,它同时包含ALLOW和DENY语句。我有点困惑:资源策略是用来定义权限边界的,为什么要同时用ALLOW和DENY?只用DENY难道不行吗?

官方示例策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:region:account-id:*"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:region:account-id:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "123.4.5.6/24"
                }
            }
        }
    ]
}

难道以下两种方案不足以实现需求吗?

方案1:单条ALLOW语句带IP条件

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:region:account-id:api-id:*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["123.4.5.6/24" ]
                }
            }
        }
    ]
}

方案2:仅使用DENY语句

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:region:account-id:api-id:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": ["123.4.5.6/24" ]
                }
            }
        }
    ]
}

三种方案的差异分析

  • 方案2完全不可行:AWS权限模型的核心是默认拒绝,也就是说,没有明确ALLOW的请求都会被拒绝。仅用DENY语句只会拒绝不符合IP条件的请求,但符合条件的请求也没有对应的ALLOW语句放行,最终所有请求都会被拒绝,包括来自指定CIDR的合法请求。

  • 方案1在简单场景下可行:单条ALLOW语句带IpAddress条件,确实能实现“仅允许指定CIDR的IP调用API”的需求,但只适用于没有其他权限规则的场景。

  • 官方ALLOW+DENY组合的必要性:

    1. 优先级覆盖:DENY语句的优先级高于所有ALLOW语句。如果资源同时被其他IAM策略(比如用户/角色的权限)允许调用,方案1的ALLOW条件会被IAM的ALLOW覆盖,导致非指定IP也能访问;而官方的DENY语句会强制拒绝不符合IP的请求,不管其他IAM权限如何设置。
    2. 权限逻辑清晰:“先全局ALLOW所有调用,再用DENY拦截不符合条件的请求”的写法,在复杂权限场景下更直观,后续添加其他例外规则(比如允许另一个CIDR、特定IAM角色)时,更容易调整和维护。
    3. 避免默认拒绝的意外:有些AWS服务的资源策略需要明确ALLOW作为基础,再用DENY做精准拦截,能避免因默认拒绝导致的合法请求被误拒的情况。

内容的提问来源于stack exchange,提问作者Frederick Scott Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:05:19