istio 中有两种不同的身份认证方式:
- 基于 mTLS 的对等身份认证 PeerAuthentication
- 基于 JWT(JSON Web Token)令牌的服务请求认证 RequestAuthentication
对等身份认证 PeerAuthentication
概念
- 提供服务到服务的认证
- 服务网格的主要场景就是服务到服务的认证
- 基于双向 TLS 实现对等身份认证
证书获取流程
- Envoy 向 pilot-agent 发起一个 SDS (Secret Discovery Service) 请求,要求获取自己的证书和私钥
- Pilot-agent 生成私钥和 CSR(Certificates Signing Request,证书签名请求),向 Istiod 发送证书签发请求,请求中包含 CSR 和该 pod 中服务的身份信息
- Istiod 根据请求中服务的身份信息(Service Account)为其签发证书,将证书返回给 Pilot-agent
- Pilot-agent 将证书和私钥通过 SDS 接口返回给 Envoy
配置定义
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: test
namespace: test
spec:
selector:
matchLabels:
app: test
mtls:
mode: STRICT
portLevelMtls:
3001:
mode: STRICT
-
selector 选择器
- istio 通过 selector 选择认证策略作用的负载
- selector 可以为空,表示该认证策略配置给指定命名空间或服务网格全局
selector: matchLabels: app: test
-
mtls 认证配置
PeerAuthentication 核心配置,定义双向认证的模式,支持以下三种模式:- STRICT:典型用法,只接收双向 TLS 的流量
- PERMISSIVE(istio 默认策略):既可以接收双向 TLS 流量,也可以接收飞加密流量
- DISABLE:禁用双向 TLS
- UNSET:继承上一级范围内配置的模式
mtls: mode: STRICT
-
portLevelMtls
给负载的端口配置认证策略(一个负载有多个端口,可以灵活配置端口粒度的认证策略)protLevelMtls: 3001: mode: STRICT
作用范围
istio 中可以定义多种范围的认证策略,分别是全服务网格范围、命名空间范围、工作负载范围,默认全服务网格范围和命名空间范围的认证策略只能配置一个,如果多个则以最早定义的策略为准(工作负载同上)
- 服务网格统一认证策略
根命名空间:istio-system,selector 为空apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: mesh_tls namespace: istio-system spec: mtls: mode: STRICT
- 命名空间统一认证策略
指定命名空间:test,selectorapiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: test_tls namespace: test spec: mtls: mode: STRICT
- 负载粒度认证策略
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: test_tls namespace: test spec: selector: matchLabels: app: test mtls: mode: STRICT
- 多粒度认证策略叠加
对于一个工作负载同时只有一个认证策略生效,如果存在多个生效的策略,则优先级为:负载范围 > 命名空间范围 > 全服务网格范围
举例:如果要使大多数负载启用双向 TLS,个别禁用双向 TLS,可以使用如下的多粒度叠加策略
以下两个策略,第一个表示 test 命名空间所有负载启用双向 TLS,第二个表示 label 为 enable 的负载禁用双向 TLS。不用一个一个为需要双向 TLS 的负载添加认证策略apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: enable_tls namespace: test spec: mtls: mode: STRICT --- apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: disable_tls namespace: test spec: selector: matchLabels: app: enable mtls: mode: STRICT
- 端口粒度认证策略
以下示例表示只在3001端口定义 STRICT 模式apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: port_tls namespace: test spec: selector: matchLabel: app: port protLevelMtls: 3001: mode: STRICT
服务请求认证 RequestAuthentication
- 提供对最终用户的认证,用于认证请求的最终用户或者设备
- 在 istio 中一般通过 JWT 方式实现请求级别的验证
istio JWT 的认证流程
- 客户端连接授权/认证服务,提供账号密码
- 服务端验证账号密码,生成 JWT 令牌,使用私钥签名,向客户端返回生成的 JWT 令牌