当您需要在网关层面进行统一的身份验证和授权时,可以启用网关JWT认证,确保只有经过认证的请求才能进入后端服务。
背景信息
JWT(JSON Web Token)是一种常用的身份认证和鉴权机制。JWT中会携带一些用户信息和一个存储加密后信息的字段。将加密后的信息字段进行解密,与原始用户信息字段进行比较,可以验证该用户的信息是否有效,从而完成身份认证。更多信息,请参见JWT。
前提条件
操作步骤
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在入口网关页面,单击目标网关名称。
在网关概览导航栏,选择 。
在JWT认证配置配置向导,打开启用网关JWT认证开关,进行相关配置,然后单击下一步。
配置项
说明
Issuer
JWT的颁发者。本示例配置为testing@secure.istio.io。
JWKS来源
选择jwks。
Key
配置示例:
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQO1MV_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5DXIg_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVuoeJT_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoUqgBo_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZbDAa_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqTZ0BJ_EyxOGuHJrLsn00fnMQ"}]}
高级选项
单击高级选项,在JWT规则高级选项对话框,您可以按需自定义Token的位置、是否透传JWT、是否将JWT中的Payload信息放在请求Header中透传等。配置完成后,单击确定。
在匹配规则配置向导,进行相关配置,然后单击提交。
配置项
说明
匹配模式
本文选择选中请求必须经过认证。取值说明如下:
选中请求必须经过认证:选中的请求必须进行JWT认证。
选中请求可跳过认证:选中的请求可以不进行JWT认证。
匹配规则
选中自定义匹配规则,打开HTTP路径(Path)开关,配置为/productpage。该配置表示路径为/productpage的请求只有通过JWT认证,才能进行访问;其他请求(配置规则之外的路径)可以不执行JWT认证。
说明当其他请求进行访问时,不携带JWT的请求可以访问成功,携带错误的JWT的请求会访问失败。
创建成功后,在完成配置向导会显示网关JWT认证创建成功和服务网格原生的安全资源。您可以单击查看YAML,查看资源的具体配置。
验证JWT认证配置是否生效。
执行以下命令,设置环境变量。
TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5pbyJ9.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-LS9qd_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZzvc7M__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCgefSj_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3Uc1MI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvHsU60_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8NxUg
执行以下命令,进行访问测试。
测试一:访问
/productpage
路径且携带正确JWTcurl -I http://${ASM网关IP地址}/productpage -H "Authorization: Bearer $TOKEN"
示例输出:
HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-length: 4294 server: istio-envoy date: Tue, 17 Jan 2023 08:47:34 GMT x-envoy-upstream-service-time: 17
测试二:访问
/productpage
路径且不携带JWTcurl -I http://${ASM网关IP地址}/productpage
示例输出:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Tue, 17 Jan 2023 08:50:31 GMT server: istio-envoy
测试三:访问
/productpage
路径且携带错误JWTcurl -I http://${ASM网关IP地址}/productpage -H "Authorization: Bearer invaild token"
示例输出:
HTTP/1.1 401 Unauthorized www-authenticate: Bearer realm="http://114.55.XXX.XXX/productpage", error="invalid_token" content-length: 79 content-type: text/plain date: Tue, 17 Jan 2023 08:51:47 GMT server: istio-envoy
测试四:访问其他路径且不携带JWT
curl -I http://${ASM网关IP地址}/api/v1/products/1
HTTP/1.1 200 OK content-type: application/json content-length: 195 server: istio-envoy date: Tue, 17 Jan 2023 08:55:10 GMT x-envoy-upstream-service-time: 16
由以上示例输出可以得到如下信息。访问结果符合预期,说明JWT认证配置生效。
类型
访问是否成功
访问
/productpage
路径且携带正确JWT是
访问
/productpage
路径且不携带JWT否
访问
/productpage
路径且携带错误JWT否
访问其他路径且不携带JWT
是
相关文档
您可以自定义ASM网关访问日志的内容,及时发现潜在的安全问题。具体操作,请参见生成和采集ASM网关访问日志。
您可以启用网格审计功能,记录或追溯不同用户的日常操作,也可以为网格资源操作配置审计告警,在重要资源变动时及时发出告警通知到告警联系人。具体操作,请参见使用KubeAPI操作审计和为网格资源操作配置审计告警。
您可以对入口网关进行JWT请求鉴权,使请求必须带有JWT Token,才能访问服务成功。具体操作,请参见在ASM中对入口网关进行JWT请求鉴权。