一、背景
为了确保通信的安全性和保护服务之间的机密信息,Istio需要证书签发和对证书进行管理。
- 加密通信:Istio使用TLS(Transport Layer Security)来加密服务之间的通信。通过为每个服务配置独立的证书和私钥,可以实现端到端的加密,保护数据在传输过程中的机密性。
- 身份验证:证书用于验证服务和Sidecar代理的身份。通过为每个服务和代理分发具有相应身份信息的证书,可以确保通信双方的身份可信,并防止未经授权的服务进入和访问系统。
- 服务间互信:Istio中的服务是通过Sidecar代理进行通信的,而代理之间的互信需要验证对方的身份。证书签发和管理允许代理之间相互验证,确保只有经过授权的代理可以进行通信,提高整个系统的安全性。
- 自动化管理:Istio的证书管理机制使得证书的生成、签发和更新能够自动化进行。这降低了证书管理的复杂性和工作量,使得系统能够快速、灵活地应对证书的变化和更新。
- 动态密钥管理:证书管理还包括私钥的生成、存储和更新。Istio通过动态密钥管理,定期轮换私钥,从而减少私钥被破解或滥用的风险。
总而言之,证书签发和管理是Istio中的重要组成部分,它提供了加密通信、身份验证、服务间互信和自动化管理等功能,以确保系统的安全性、保护敏感信息和防止未经授权的访问。
二、Istio安全架构
2.1 服务身份和认证
Istio使用基于X.509证书的强制服务身份验证,确保服务之间的相互信任和身份验证。
每个服务和Sidecar代理都有自己的证书和私钥,用于进行身份验证和安全通信。
通过Istio的身份验证策略,可以定义和控制服务之间的身份验证要求。
2.2 加密通信
Istio通过自动化的方式为服务之间的通信提供加密保护。
使用Transport Layer Security(TLS)协议,所有服务之间的流量都可以被加密,保护数据在传输过程中的机密性。
Istio通过Sidecar代理自动注入,实现了透明的加密和解密操作。
2.3 访问控制和授权
Istio提供了细粒度的访问控制和授权机制,通过定义策略来限制服务之间的通信和访问。
使用Istio的授权策略,可以基于服务标识、请求属性和其他上下文信息来控制请求的访问权限。
Istio的授权策略支持基于角色的访问控制和动态的访问控制列表(ACL)。
2.4 安全审计和可观察性
Istio提供了丰富的安全审计和可观察性功能,以监控和记录服务之间的通信和安全事件。
使用Istio的审计策略,可以捕获和记录请求和响应的详细信息,用于后续的审计、故障排查和安全分析。
Istio还提供了可视化和查询工具,如Grafana和Kiali,用于实时监控和可视化安全事件和指标。
2.5 多集群和跨集群安全
Istio支持多集群和跨集群的安全通信和控制。
可以使用Istio来扩展安全策略到多个集群,确保不同集群之间的通信和控制一致性。
Istio的多集群架构支持跨集群的安全传输和认证,确保多个集群之间的通信是安全的。
三、Istio证书签发和管理流程
3.1 CA Server
Istio中的CA(Certificate Authority)服务器是负责证书签发和管理的组件,用于生成和颁发用于服务间通信的证书。CA服务器在Istio的安全架构中扮演着重要的角色,确保服务之间的安全通信和身份验证。
- 证书签发:CA服务器负责生成和签发用于服务身份验证和安全通信的证书。它可以生成服务和Sidecar代理的证书,即对Pilog Agent发起的CSR请求进行签名,用于建立TLS连接和进行身份验证。
- 证书管理:CA服务器负责管理证书的生命周期。这包括证书的创建、签发、更新和撤销等操作。它还可以执行证书轮换和自动化的证书管理任务,以确保证书的有效性和安全性。
- 根证书和中间证书:CA服务器通常会生成根证书和中间证书。根证书是信任链的顶级证书,用于验证其他证书的可信性。中间证书是由根证书签署的辅助证书,用于构建证书链并建立信任。
- 安全保护:CA服务器自身也需要受到保护,以防止未经授权的访问和恶意操作。通常,CA服务器会配置访问控制策略、密钥保护和审计机制,确保其安全性和完整性。
- 集群级别的CA服务器:在Istio中,通常会有一个集群级别的CA服务器,负责为整个集群中的服务生成证书。这个CA服务器可以被多个命名空间中的服务共享,并提供集中的证书管理和控制。
证书有两种方式来创建:
1. 自动生成,这种被称为自签名证书,这是默认的方式。
2. 用户手动创建,即手动插入已存在的CA证书。可以在部署Istiod前使用已存在的证书在istio-system中创建名为cacerts的secret,然后istio部署的时候会自动使用这个secret中的证书,具体可以参考Istio官方手册 Plugging in existing CA Certificates。
CA Server对SDS Server的认证有不止一种方式。
一般默认采用KubeJWTAuthenticator的方式认证。
CA Server中涉及到了很多相关的Kubernetes资源:
istio-ca-secret secret
位于istio-system中,用来持久化保存自签名的ca私钥和ca证书,其它字段都为空,只由Istiod使用,与Pilot Agent没有关系。
apiVersion: v1
data:
ca-cert.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvVEND
ca-key.pem: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNS
cert-chain.pem: ""
key.pem: ""
root-cert.pem: ""
kind: Secret
metadata:
creationTimestamp: "2023-04-27T01:03:28Z"
name: istio-ca-secret
namespace: istio-system
resourceVersion: "415479"
uid: ecbe5050-28ae-44ba-9a2b-8b6ca6fd6ff4
type: istio.io/ca-root
istio-ca-root-cert configmap
每个namespace中都会有一个,用于保存根证书,会挂载到Pilot Agent的/var/run/secrets/istio目录。
apiVersion: v1
data:
root-cert.pem: |
-----BEGIN CERTIFICATE-----
MIIC/TCCAeWgAwIBAgIRAKai8hRHS77edrkdbEQr8ZIwDQYJKoZIhvcNAQELBQAw
-----END CERTIFICATE-----
kind: ConfigMap
metadata:
creationTimestamp: "2023-05-04T07:33:47Z"
labels:
istio.io/config: "true"
name: istio-ca-root-cert
namespace: sample
resourceVersion: "2387176"
uid: 4f7520c5-4c9d-45de-96aa-d18d021976b0
cacerts secret
会挂载到Istiod的/etc/cacerts目录,用户可以手动通过现有证书创建这个secret,然后再部署Istio,这样Istio就可以使用用户指定的证书。
3.2 SDS Server
在Istio中,SDS(Secret Discovery Service)服务器是负责证书和密钥的动态发现和管理的组件。SDS服务器为Istio的Sidecar代理提供所需的证书和密钥,以实现服务间的安全通信。
- 证书和密钥管理:SDS服务器负责管理和分发用于服务身份验证和安全通信的证书和密钥。它可以动态生成、分发和更新证书和密钥,以保证其有效性和安全性。
- 动态发现:SDS服务器采用动态发现的方式,根据需要为每个Sidecar代理提供其所需的证书和密钥。这意味着每个代理可以根据需要动态地获取证书和密钥,而无需事先配置或硬编码。
- 自动注入:Istio的Sidecar注入功能会自动将Sidecar代理部署到每个服务的Pod中。SDS服务器会与自动注入过程结合,根据服务的配置和需要,在Pod启动时为Sidecar代理提供相应的证书和密钥。
- 加密通信:SDS服务器的主要目标是为了确保服务之间的安全通信。它通过为每个Sidecar代理提供证书和密钥来实现加密通信,以保护数据在传输过程中的机密性。
- 动态密钥轮换:SDS服务器还支持动态密钥轮换,定期为Sidecar代理生成新的密钥,并进行动态更新。这有助于增加密钥的安全性,降低密钥被破解或滥用的风险。
要通过服务证书来实现网格中服务的身份认证,必须首先确保服务从控制面获取自身证书的流程是安全的。Istio 通过 Istiod 和 Pilog-agent 之间的 gRPC 通道传递 CSR 和证书,因此在这两个组件进行通信时,双方需要先验证对方的身份,以避免恶意第三方伪造 CSR 请求或者假冒 Istiod CA 服务器。双方都需要有一个根证书,根据配置的不同,这个根证书有几种不同的获取方式,对应的类型名称为分别为istiod、kubernetes和custom。
sidecar的模板文件:
在部署的时候是通过pilotCertProvider这个参数来控制的,默认值是istiod,在模板文件中会将这个参数的值设置到环境变量PILOT_CERT_PROVIDER中。当这个值是istiod的情况下,会将istio-ca-root-cert这个configmap挂载到/var/run/secrets/istio目录中。
除了默认向Istiod获取证书,SDS Server还可以采用读取挂载的静态证书文件的方式。注入的sidecar的模板文件如下:
如果是这种手动插入证书的方式,则SDS Server会将用户配置的证书直接返回给Envoy,而不是像前一种情况那样本地生成私钥和证书签名请求然后向CA Server申请签名。
3.3 认证流程
流程图中Pod Helloworld是用户的负载,Istio-proxy是Istio注入的sidecar容器,启动的主进程被称为Pilot Agent,它核心的功能是启动Envoy进程来劫持并管理Pod Helloworld的进出口流量,除此之外,在Pilot Agent还有一个名为SDS Server的组件,用来生成私钥和证书签名请求文件并向CA Server发起证书签名请求。
- 默认使用istiod的CA Server证书颁发机构自签名生成根证书 Istiod certificate,并采用该服务器证书对外提供基于 TLS 的 gPRC 服务;
- Istiod向Kube-Apiserver请求创建istio-ca-root-cert的ConfigMap存储到Kubernetes中,该 ConfigMap 中放入了 Istiod 的 CA 根证书;
- Helloworld初始化时, Kubernetes 为Helloworld关联一个 Service Account,以表明该 pod 中运行的服务的身份信息。如果不指定,默认生成default的Service Account。
- Kubernetes 会为该 Service account 生成一个 jwt token,并将该 token 通过 secret 加载到 pod 中的一个文件,默认default-token前缀。
- Istio-ca-root-cert的ConfigMap 被K8s Mount 到 Istio-proxy 容器中,被 Pilot-agent 用于验证 Istiod 的服务器证书。
- 当Envoy进程在与其它Envoy进程交互时,发现需要进行TLS认证,它会从静态配置文件或者动态配置服务器获取证书的名称等相关信息,这时Envoy进程就会通过SDS API向Pilot Agent中的SDS Server发起请求获取自己的证书和私钥。
- SDS Server收到请求后,会首先读取本地的ServiceAccount Token,路径为/var/run/secrets/kubernetes.io/serviceaccount/token,然后从token中解析出namespace和ServiceAccount等信息,再用这些信息生成私钥和证书签名请求文件CSR。接下来使用证书签名请求文件作为参数,向Istiod发起申请证书签名的请求。
- Pilot-agent 和 Istiod 建立 gRPC 连接,Pilot-agent 采用标准的 TLS 服务器认证流程对 Istiod 的服务器证书(Istio-ca-root-cert的ConfigMap)进行认证;
- Istiod中的CA Server收到请求后会对其中的凭证进行验证,调用 Kube-apiserver 接口验证请求中附带的 service account token,以确认请求证书的服务身份是否合法;
- Istiod验证通过后会对根据请求对证书进行签名、生成证书,并将签名后的数字证书发送给SDS Server;
- Pilot-agent 将证书和私钥通过 SDS 接口返回给 Envoy;
- 以上过程会周期性地重复执行以便实现证书的轮换;
为什么要通过 Pilot-agent 中转?
Istio 证书签发的过程中涉及到了三个组件: Istiod (Istio CA) —> Pilot-agent —> Enovy。为什么其他 xDS 接口都是由 Istiod 直接向 Envoy 提供,但 SDS 却要通过 Pilot-agent 进行一次中转,而不是直接由 Envoy 通过 SDS 接口从 Istiod 获取证书呢?这样做主要有两个原因。
首先,在 Istio 的证书签发流程中,由 Pilot-agent 生成私钥和 CSR,再通过 CSR 向 Istiod 中的 CA 申请证书。在整个过程中,私钥只存在于本地的 Istio-proxy 容器中。如果去掉中间 Pilot-agent 这一步,直接由 Envoy 向 Isitod 申请证书,则需要由 Istiod 生成私钥,并将私钥和证书一起通过网络返回给 Envoy,这将大大增加私钥泄露的风险。
另一方面,通过 Pilot-agent 来提供 SDS 服务,由 Pilot-agent 生成标准的 CSR 证书签名请求,可以很容易地对接不同的 CA 服务器,方便 Istio 和其他证书机构进行集成。
四、总结
Istio证书签名和管理,主要结构是Istiod的CA Server和Pilot-Agent的SDS Server;两者通信需要互相认证,以避免恶意第三方伪造 CSR 请求或者假冒 Istiod CA 服务器。默认通过Istiod的CA证书颁发机构自签名生成根证书,控制面需要对SDS Server认证,默认采用K8s的ApiServer的JWT Token的方式验证CSR请求;SDS Server默认采用Istio-ca-root-cert的configMap方式对控制面认证。