在ASM中对入口网关进行JWT请求认证
本文介绍如何在ASM中对入口网关进行JWT请求认证,确保用户在通过入口网关访问服务时,必须带有可信赖的Access Token。
准备工作
- 已创建一个1.13或1.15或1.18版本网格。
- 网格中有诊断通过的httpbin服务,镜像为httpbin,端口协议为http,端口号为80。
- 网格中已为httpbin服务创建可访问的网关。
创建JWT认证
- 创建JWK。
- 访问JWT工具网站,选择“Algorithm”为“RS512”,获取公钥(PUBLIC KEY)。
图1 生成公钥
- 在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"}
- 访问JWT工具网站,选择“Algorithm”为“RS512”,获取公钥(PUBLIC KEY)。
- 创建JWT认证。
- 登录应用服务网格控制台,单击网格名称,进入网格详情页面。
- 在左侧导航栏选择“服务管理”,在列表右上方选择服务所在命名空间。
- 选择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认证
- 单击“确定”完成创建。
验证JWT认证是否生效
- 使用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
- 通过入口网关访问httpbin服务。
- 执行以下命令,带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
- 执行以下命令,带无效的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
- 修改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
- 执行以下命令,不带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的请求访问服务失败,说明请求身份认证生效。
- 执行以下命令,带1创建的JWT Token访问服务。