Dawn's Blogs

分享技术 记录成长

0%

Istio学习笔记 (4) 安全

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 通过以下流程提供密钥和证书:

  1. istiod 提供 gRPC 服务以接受证书签名请求(CSR)。
  2. istio-agent 在启动时创建私钥和 CSR,然后将 CSR 及其凭据发送到 istiod 进行签名
  3. istiod CA 验证 CSR 中携带的凭据,成功验证后签署 CSR 以生成证书
  4. 当工作负载启动时,Envoy 通过 SDS API 向同容器内的 istio-agent 发送证书和密钥请求
  5. istio-agent 通过 Envoy SDS API 将从 istiod 收到的证书和密钥发送给 Envoy
  6. 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 的顺序依次检查授权策略

授权策略优先级