Lambda Authorizer策略无法限制Api Gateway代理资源访问问题咨询
结论
这是Lambda Authorizer对接/{proxy+}代理资源时的预期行为,核心原因是API Gateway的IAM策略资源匹配逻辑优先对齐控制台显式声明的资源节点,而非请求实际访问的后端路径。
原因说明
- 当你把所有接口直接定义在API Gateway内部(也就是你备注中正常运行的场景),平台存在
GET /a这个独立的资源节点,你返回的允许arn:aws:execute-api:*:*:*/*/GET/a的策略可以精确匹配到该节点,其余路径的资源节点没有被显式Allow,就会触发IAM的隐式拒绝逻辑,表现符合预期。 - 当你仅配置了
ANY /{proxy+}这一个代理资源节点时,所有请求都会命中这个唯一的资源节点,IAM策略评估时会优先匹配该代理节点的ARN格式:arn:aws:execute-api:<区域>:<账号ID>:<API ID>/<阶段>/*/{proxy+}。你返回的具体路径资源ARN无法匹配到代理节点的ARN模式,再结合IAM策略的评估规则,就会出现你遇到的权限和*通配符一致的问题。
解决方案
如果要在代理资源模式下实现精确路径的权限控制,推荐两种方案:
方案1:调整策略规则,使用显式Deny兜底
IAM策略评估逻辑中显式Deny优先级最高,你可以修改返回的策略,仅允许目标路径,拒绝所有其他路径:
if headerValue == 'a': return { "principalId": "somebody", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": "arn:aws:execute-api:*:*:*/*/GET/a" }, { "Action": "execute-api:Invoke", "Effect": "Deny", "NotResource": "arn:aws:execute-api:*:*:*/*/GET/a" } ] } }
方案2:直接在授权器逻辑中判断路径
你可以从Lambda Authorizer的入参event中解析methodArn字段,提取当前请求的方法和路径,不符合要求直接返回全局Deny策略,避免ARN匹配规则带来的问题:
from urllib.parse import unquote def lambda_handler(event, context): # 解析methodArn获取请求方法和路径 arn_parts = event['methodArn'].split('/') http_method = arn_parts[2] path = unquote(arn_parts[3] + '/' + '/'.join(arn_parts[4:]) if len(arn_parts) >4 else arn_parts[3]) headerValue = _get_header_value(event, 'my-header') if headerValue == 'a': if http_method == 'GET' and path == 'a': resource = "*" else: return { "principalId": "somebody", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Deny", "Resource": "*" } ] } } else: resource = "*" return { "principalId": "somebody", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": resource } ] } }
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

