View a markdown version of this page

使用应用程序负载均衡器验证 JWT - Elastic Load Balancing

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用应用程序负载均衡器验证 JWT

您可以配置应用程序负载均衡器 (ALB) 来验证客户端为安全服务对服务 (S2S) 或机器对机器 (M2M) 通信提供的 JSON 网络令牌 (JWT)。不管 JWT 是如何发布的,负载均衡器都可以对其进行验证,无需人为干预。

ALB 将验证代币签名并要求两项强制性声明:“iss”(发行者)和 “exp”(到期)。此外,如果代币中存在,ALB还将验证 “nbf”(不是之前)和 “iat”(当时发出)索赔。您最多可以配置 10 个额外的索赔进行验证。这些索赔支持三种格式:

  • Single-string: 单个文本值

  • Space-separated 值:由空格分隔的多个值(最多 10 个值)

  • String-array: 文本值数组(最多 10 个值)

如果令牌有效,则负载均衡器将带有令牌的请求按原样转发给目标。否则,服务将拒绝该请求。

准备使用 JWT 验证

完成以下任务:

  1. 向 IdP 注册您的服务,IdP 会颁发客户端 ID 和客户端密钥。

  2. 单独调用 IdP 以请求访问服务。IdP 使用访问令牌进行响应。该令牌通常是由 IdP 签名的 JWT。

  3. 设置 JSON Web 密钥集 (JWKS) 端点。负载均衡器在您配置的已知位置获取 IdP 发布的公钥。

  4. 将 JWT 包含在请求标头中,并在每个请求中将其转发到应用程序负载均衡器。注意:仅支持 RS256 算法

JWT 验证限制

在应用程序负载均衡器中使用 JWT 验证时,JWKS(JSON Web 密钥集)端点必须满足以下要求:

  • 最大响应大小:150 KB

  • 最大密钥数:10 个密钥

如果您的身份提供商的 JWKS 响应超出其中一个限制,则应用程序负载均衡器不会将请求转发到您的后端目标。

如果您的身份提供商的 JWKS 端点超过这些限制,请考虑在应用程序代码中实现 JWT 验证,或使用密钥集较小的身份提供商。

使用控制台配置 JWT 验证

  1. 在以下位置打开亚马逊 EC2 控制台控制台https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的 Load Balancing(负载均衡)下,选择 Load Balancers(负载均衡器)。

  3. 选择您的应用程序负载均衡器,然后选择监听器选项卡。

  4. 选择 HTTPS 侦听器,然后选择管理规则

  5. 选择添加规则

  6. (可选)要为规则指定名称,请展开名称和标签,然后输入名称。要添加其他标签,请选择添加其他标签,然后输入标签键和标签值。

  7. 在 “条件” 下,定义 1-5 个条件值

  8. (可选)要添加转换,请选择添加转换,选择转换类型,然后输入要匹配的正则表达式和替换字符串。

  9. 在 “操作、 Pre-routing操作” 中,选择 “验证令牌”。

    1. 对于 JWKS 终端节点,输入您的 JSON Web 密钥集终端节点的 URL。此端点必须可公开访问,并返回用于验证 JWT 签名的公钥。

    2. 对于发行者,在您的 JWT 代币中输入 iss 索赔的预期价值。

    3. (可选)要验证其他索赔,请选择其他索赔。

      1. 在 “索赔名称” 中,输入要验证的索赔名称。

      2. 对于格式,选择索赔值的解释方式:

        1. 单一字符串:声明必须完全匹配一个指定值。

        2. 字符串数组:声明必须与数组中的一个值相匹配。

        3. 空格分隔的值:该声明包含以空格分隔的值,这些值必须包含指定的值。

      3. 在 “值” 中,输入索赔的预期值。

      4. 对于其他索赔,请重复此操作(最多 10 项索赔)。

  10. 对于操作、路由操作,选择在成功验证令牌后应执行的主要操作(转发至、重定向到或返回固定响应)

  11. 根据需要配置主要操作

  12. 选择保存

使用 CLI 配置 JWT 验证

使用以下 create-rule 命令配置 JWT 验证。

使用验证 JWT 的操作创建监听器规则。监听器必须是 HTTPS 监听器。

注意

配置 JWT 验证时,请确保您的 JWKS 终端节点响应的大小不超过 150 KB 或包含超过 10 个密钥。超过这些限制的响应将阻止将请求转发到您的目标。

aws elbv2 create-rule \ --listener-arn listener-arn \ --priority 10 \ --conditions Field=path-pattern,Values="/login" \ --actions file://actions.json

以下是指定jwt-validation动作和操作的actions.json文件示例。forward请按照您的身份提供商提供的文档确定支持的字段

--actions '[ { "Type":"jwt-validation", "JwtValidationConfig":{ "JwksEndpoint":"https://issuer.example.com/.well-known/jwks.json", "Issuer":"https://issuer.com" }, "Order":1 }, { "Type":"forward", "TargetGroupArn":"target-group-arn", "Order":2 } ]'

以下示例指定了要验证的额外索赔。

--actions '[ { "Type":"jwt-validation", "JwtValidationConfig":{ "JwksEndpoint":"https://issuer.example.com/.well-known/jwks.json", "Issuer":"https://issuer.com", "AdditionalClaims":[ { "Format":"string-array", "Name":"claim_name", "Values":["value1","value2"] } ], }, "Order":1 }, { "Type":"forward", "TargetGroupArn":"target-group-arn", "Order":2 } ]'

有关更多信息,请参阅 Application Load Balancer 的侦听器规则