文档首页/ 应用服务网格 ASM/ 用户指南/ 安全/ 在ASM中对入口网关进行JWT请求认证
更新时间:2024-10-09 GMT+08:00

在ASM中对入口网关进行JWT请求认证

本文介绍如何在ASM中对入口网关进行JWT请求认证,确保用户在通过入口网关访问服务时,必须带有可信赖的Access Token。

准备工作

  1. 已创建一个1.13或1.15或1.18版本网格。
  2. 网格中有诊断通过的httpbin服务,镜像为httpbin,端口协议为http,端口号为80。
  3. 网格中已为httpbin服务创建可访问的网关。

创建JWT认证

  1. 创建JWK。

    1. 访问JWT工具网站,选择“Algorithm”为“RS512”,获取公钥(PUBLIC KEY)。
      图1 生成公钥
    2. JWK to PEM Convertor online工具中选中“PEM-to-JWK (RSA Only)”,输入上一步获取的公钥,单击“submit”,将公钥转换为JWK。
      图2 将公钥转换为JWK
      {"kty":"RSA","e":"AQAB","kid":"a78641b9-d81e-4241-b35a-71726c3fa053","n":"u1SU1LfVLPHCozMxH2Mo4lgOEePzNm0tRgeLezV6ffAt0gunVTLw7onLRnrq0_IzW7yWR7QkrmBL7jTKEn5u-qKhbwKfBstIs-bMY2Zkp18gnTxKLxoS2tFczGkPLPgizskuemMghRniWaoLcyehkd3qqGElvW_VDL5AaWTg0nLVkjRo9z-40RQzuVaE8AkAFmxZzow3x-VJYKdjykkJ0iT9wCS0DRTXu269V264Vf_3jvredZiKRkgwlL9xNAwxXFg0x_XFw005UWVRIkdgcKWTjpBP2dPwVZ4WWC-9aGVd-Gyn1o0CLelf4rEjGoXbAAEgAqeGUxrcIlbjXfbcmw"}

  2. 创建JWT认证。

    1. 登录应用服务网格控制台,单击网格名称,进入网格详情页面。
    2. 在左侧导航栏选择“服务管理”,在列表右上方选择服务所在命名空间。
    3. 选择httpbin服务,单击操作列的“安全”,在右侧页面选择“JWT认证”页签,单击“立即配置”,在弹出的“JWT认证”页面填写如下信息:
      • 发行者:JWT的颁发者,本文设置为“test”。
      • 令牌受众:JWT受众列表,设置哪些服务可以使用JWT Token访问目标服务,本文设置为“ASM”。
      • jwks:设置JWT信息,本文设置为{"keys": [1创建的JWK]},例如1创建的JWK为{"kty":"RSA","e":"AQAB","kid":"a78641b9-d81e-4241-b35a-71726c3****"},则jwks为{"keys": [{"kty":"RSA","e":"AQAB","kid":"a78641b9-d81e-4241-b35a-71726c3****"}]}。
      图3 创建JWT认证
    4. 单击“确定”完成创建。

验证JWT认证是否生效

  1. 使用JWT工具将JWT请求信息编码成JWT Token。

    在“Decoded”区域输入以下JWT请求信息,在“Encode”区域将看到自动转换后的JWT Token。

    • HEADER:设置alg为“RS512”,输入1创建的JWK中的kid,设置type为“JWT”。
    • PAYLOAD:设置iss为“test”,aud为“ASM”,确保与2中配置的发行者、令牌受众保持一致。
    • VERIFY SIGNATURE:与1.a中的公钥保持一致。
    图4 创建JWT Token

  2. 通过入口网关访问httpbin服务。

    1. 执行以下命令,带1创建的JWT Token访问服务。

      TOKEN=1创建的JWT Token

      curl -I -H "Authorization: Bearer $TOKEN" http://{httpbin服务的外部访问地址}/

      预期输出:

      HTTP/1.1 200 OK
      server: istio-envoy
      date: Wed, 21 Sep 2022 03:11:48 GMT
    2. 执行以下命令,带无效的JWT Token访问服务。

      curl -I -H "Authorization: Bearer invalidToken" http://{httpbin服务的外部访问地址}/

      预期输出:

      HTTP/1.1 401 Unauthorized
      www-authenticate: Bearer realm="http://***.***.***.***:***/", error="invalid_token"
      content-length: 145
      content-type: text/plain
      date: Wed, 21 Sep 2022 03:12:54 GMT
      server: istio-envoy
      x-envoy-upstream-service-time: 19
    3. 修改2中创建的JWT认证,将令牌受众置空(表示对访问的服务不受限制),然后执行以下命令,带1创建的JWT Token访问服务。

      curl -I -H "Authorization: Bearer $TOKEN" http://{httpbin服务的外部访问地址}/

      预期输出:

      HTTP/1.1 200 OK
      server: istio-envoy
      date: Wed, 21 Sep 2022 03:20:07 GMT
    4. 执行以下命令,不带JWT Token访问服务。

      curl -I http://{httpbin服务的外部访问地址}/

      预期输出:

      HTTP/1.1 403 Forbidden
      content-length: 85
      content-type: text/plain
      date: Wed, 21 Sep 2022 03:29:31 GMT
      server: istio-envoy
      x-envoy-upstream-service-time: 6

    根据以上结果,可以看到带有正确的JWT Token的请求访问服务成功,带有错误的JWT Token或者不带JWT Token的请求访问服务失败,说明请求身份认证生效。