选择 API Gateway 授权方

开发者的 AWS 安全实践

Rahul Singh

Technical Product Manager

先于您的代码检查

调用方在到达您的代码前先经过 API Gateway 授权方,若被拒则返回 401。

通过:请求到达您的代码

失败:401 未授权,您的代码不运行

开发者的 AWS 安全实践

由谁来检查

三种可选授权方
  1. IAM 认证(AWS_IAM):AWS 校验签名

一列从 AWS 代查到您自查的纵向栈。仅第一张填充:IAM 认证,AWS 校验签名。

开发者的 AWS 安全实践

由谁来检查

三种可选授权方
  1. IAM 认证(AWS_IAM):AWS 校验签名
  2. Cognito 授权方(COGNITO_USER_POOLS):AWS 验证令牌
    • 签名、iss、aud、exp

同样的纵向栈,已填两张:IAM 认证(AWS 校验签名)与 Cognito 授权方(AWS 验证令牌)。

开发者的 AWS 安全实践

由谁来检查

三种可选授权方
  1. IAM 认证(AWS_IAM):AWS 校验签名
  2. Cognito 授权方(COGNITO_USER_POOLS):AWS 验证令牌
    • 签名、iss、aud、exp
  3. Lambda 授权方:您的函数返回允许或拒绝
    • 适用于非 Cognito 的令牌

三种授权方从 AWS 代查到您自查排序:IAM(AWS 校验签名)、Cognito 授权方(AWS 验证令牌)、Lambda 授权方(您编写检查)。

开发者的 AWS 安全实践

为调用方匹配入口

 

调用方决定

 

  • 内部服务:已持有 AWS 凭证

三行映射中的第一行:内部服务对应 IAM 认证。

开发者的 AWS 安全实践

为调用方匹配入口

 

调用方决定

 

  • 内部服务:已持有 AWS 凭证
  • 应用用户:携带 Cognito 令牌

三行映射中的两行:内部服务→IAM 认证,应用用户→Cognito 授权方。

开发者的 AWS 安全实践

为调用方匹配入口

 

调用方决定

 

  • 内部服务:已持有 AWS 凭证
  • 应用用户:携带 Cognito 令牌
  • 合作方应用:自带授权逻辑

三类调用方各匹配所需授权方:内部服务→IAM 认证,应用用户→Cognito 授权方,合作方应用→Lambda 授权方。

开发者的 AWS 安全实践

注意 API 类型

REST API

  • 支持三种授权方,另有资源策略
  • API 密钥、按客户端限流、请求校验、WAF

REST API 对比卡勾选了 IAM 认证、Cognito 用户池授权方、Lambda 授权方和资源策略。旁边的 HTTP API 卡尚未填充。

开发者的 AWS 安全实践

注意 API 类型

REST API

  • 支持三种授权方,另有资源策略
  • API 密钥、按客户端限流、请求校验、WAF

 

HTTP API

  • JWT 授权方,支持任意 OIDC 发行方
  • 无资源策略;更便宜更快

两张卡对比各 API 类型支持的授权方:REST API 追加资源策略,HTTP API 用 JWT 授权方替代 Cognito 授权方,且无资源策略。

开发者的 AWS 安全实践

授权方会"记住"

缓存以节省时间

  • 第一次调用:运行授权方
  • 后续调用:读取缓存结果

首次调用运行授权方并将允许写入带生存时间的缓存,后续调用直接读缓存,不再运行授权方。

开发者的 AWS 安全实践

授权方会"记住"

缓存以节省时间

  • 第一次调用:运行授权方
  • 后续调用:读取缓存结果

 

缓存 TTL

  • authorizerResultTtlInSeconds:默认 300s,最大 3600s
  • 设为 0 可禁用缓存

首次调用运行授权方并将允许写入带生存时间的缓存,后续调用直接读缓存,不再运行授权方。

开发者的 AWS 安全实践

缓存的允许可能"超期"

双轨时间线。权限轨在撤销点变为已撤销,而下方缓存允许轨在该点后仍显示允许,撤销后的窗口被加阴影。

您撤销的瞬间

  • 权限:立即撤销
  • 缓存允许:仍在放行
开发者的 AWS 安全实践

缓存的允许可能"超期"

同样的双轨时间线,撤销点与 TTL 到期之间的窗口被加阴影并标注仍允许:权限已撤销,但缓存允许仍授予访问。

中间这段窗口

  • 权限消失,缓存未获知
  • 访问持续到 TTL 过期
开发者的 AWS 安全实践

缓存的允许可能"超期"

同样时间线,在阴影窗口上有箭头,说明更短 TTL 会更早到期并缩短撤销后仍可访问的时段。

收紧该窗口

  • 需快速撤销时用短 TTL
  • 最敏感路由将 TTL 设为 0
开发者的 AWS 安全实践

有个调用方绕过前门

第三方进入您的账户内

  • 扮演您创建的角色
  • 您交付该角色的 ARN

监控供应商位于上方两个客户框与您角色之下之间。您的框将角色 ARN 交给供应商,供应商来扮演您的角色。第二个客户框已灰显,尚未参与。

开发者的 AWS 安全实践

有个调用方绕过前门

第三方进入您的账户内

  • 扮演您创建的角色
  • 您交付该角色的 ARN

角色 ARN 不是秘密

"困惑副官"问题

第二个客户框现在以红色激活,并把您的角色 ARN 当作自己的。自供应商向您角色有两条箭头,每个客户一次调用,二者无从区分。

开发者的 AWS 安全实践

有个调用方绕过前门

第三方进入您的账户内

  • 扮演您创建的角色
  • 您交付该角色的 ARN

角色 ARN 不是秘密

"困惑副官"问题

修复:sts:ExternalId

  • 供应商为每位客户生成一个
  • 您的信任策略要求匹配

您的角色现在要求 external ID 等于 12345。携带 12345 的调用到达角色,携带 99999 的调用在到达前被红叉拦下。

开发者的 AWS 安全实践

让我们一起练习吧!

开发者的 AWS 安全实践

Preparing Video For Download...