istio 的安全体现在提供全面的安全解决方案,Istio 提供了强大的身份、强大的策略、透明的 TLS 加密,以及验证、授权和审计(AAA)工具来保护服务和数据。istio 安全性保证涉及多个组件:
- 证书管理机构(CA)。
- (控制平面)将安全配置分发给代理:包括认证策略、授权策略、安全命名信息。
- Sidecar 和边缘代理作为策略执行点(Envoy),用于保证通信安全。
- Envoy 代理扩展,用于管理遥测和审计。
证书管理
istio 使用 X.509 证书为每一个工作负载提供身份标识,istio-agent(即 pilot-agent) 与 Envoy 代理一起运行,与 istiod 一起协作来自动化的进行大规模密钥和证书轮换。
pilot-agent 通过 Unix socket 的方式在本地提供 SDS 服务供 Envoy 使用。
istio 通过以下流程提供密钥和证书:
- istiod 提供 gRPC 服务以接受证书签名请求(CSR)。
- istio-agent 在启动时创建私钥和 CSR,然后将 CSR 及其凭据发送到 istiod 进行签名。
- istiod CA 验证 CSR 中携带的凭据,成功验证后签署 CSR 以生成证书。
- 当工作负载启动时,Envoy 通过 SDS API 向同容器内的 istio-agent 发送证书和密钥请求。
- istio-agent 通过 Envoy SDS API 将从 istiod 收到的证书和密钥发送给 Envoy。
- istio-agent 监控工作负载证书的过期时间。上述过程会定期重复进行证书和密钥轮换。
认证
Istio 提供两种类型的认证:
- 对等认证:用于服务到服务的认证,以验证建立连接的客户端。 对于对等认证,istio 自动的将流量升级为 mTLS。
- 请求认证:用于终端用户认证,以验证附加到请求的凭据(JWT)。对于请求认证,应用程序负责获取 JWT 凭证并将其附加到请求。
使用对等认证策略和双向 TLS 时,istio 将身份从对等认证提取到 source.principal 中。 同样,使用请求认证策略时,istio 会将 JWT 中的身份赋值给 request.auth.principal。
使用 principal 用于设置授权策略。
双向 TLS
istio 可以透明的实现双向 TLS,这包括两方面的认证:
- 在客户端,根据安全命名信息检查服务器的标识, 以查看它是否是工作负载授权的运行程序。
- 在服务器端, 服务器可以根据用户身份信息,通过授权策略确定客户端可以访问哪些信息。
宽容模式 Permissive mode
双向 TLS 具有一个宽容模式,允许服务同时接受纯文本流量和双向 TLS 流量。
安全命名
服务器身份(Server identity)被编码在证书里, 但服务名称(service name)通过服务发现或 DNS 被检索。 安全命名信息将服务器身份映射到服务名称。服务器身份与服务名称的映射,就表示授权服务器身份运行这个服务。
控制面将安全命名映射信息安全的分发到每一个代理,使得客户端可以检查服务器是否合法。
认证策略
可以通过 PeerAuthentication 和 RequestAuthentication 来分别设置对等认证和请求认证策略。
授权
istio 通过 AuthorizationPolicy CRD 对授权策略进行配置,对服务器端 Envoy 代理的入站流量实施访问控制。
授权策略支持 ALLOW、DENY、CUSTOM 操作,通过 CUSTOM、DENY、ALLOW 的顺序依次检查授权策略。