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

