铜墙铁壁 - 服务网格的安全之道 (Istio 实例)
铜墙铁壁 - 服务网格的安全之道 (Istio 实例)
在微服务架构中,服务间的通信是频繁且复杂的。传统的安全模型常常假设内部网络是可信的,这在现代分布式系统和云原生(尤其是零信任)环境中是远远不够的。我们需要解决几个核心安全问题:
- 通信加密 (Encryption):如何确保服务 A 和服务 B 之间的通信内容不被窃听?
- 身份认证 (Authentication):服务 A 如何确信它正在与之通信的确实是合法的服务 B,反之亦然?(这不仅仅是客户端认证服务器,而是双向认证)。
- 访问授权 (Authorization):即使身份得到认证,服务 A 是否有权限调用服务 B 的特定接口?
服务网格(以 Istio 为例)通过在基础设施层面提供统一的安全能力,极大地简化了这些问题的解决。
零信任网络基石:双向 TLS (mTLS) - 自动加密与认证
在零信任网络模型中,我们不信任任何网络连接,即使是内部服务之间的连接。双向 TLS (Mutual TLS - mTLS) 是实现服务间安全通信的基础。它不仅加密了通信内容,还允许通信双方互相验证对方的身份。
手动为成百上千的微服务实例配置和管理 mTLS 证书是一项极其繁重且易出错的任务。而 Istio 则可以自动化这个过程:
- 内置 CA 与证书管理:Istio 的控制平面 (
istiod
) 包含一个证书颁发机构 (Certificate Authority - CA) 的功能。它负责为网格内的每一个工作负载(具体来说是其 Sidecar 代理)自动生成、签发、分发和轮换 X.509 证书和私钥。 - 强大的身份标识:这些证书中嵌入了工作负载的身份信息,该身份通常基于其 Kubernetes 服务账号 (Service Account)。例如,证书的 SPIFFE ID 可能是
spiffe://cluster.local/ns/my-app/sa/my-service-account
。这提供了一个强加密、可验证的服务身份。 - Sidecar 自动协商:当启用了 mTLS 后,源端 Sidecar(客户端)和目标端 Sidecar(服务器)在建立 TCP 连接时,会自动进行 mTLS 握手。
- 加密 (Encryption):握手成功后,两者之间的所有通信流量都会被 TLS 加密。
- 双向认证 (Mutual Authentication):在握手过程中,双方会交换并验证对方的证书。Sidecar 会检查证书是否由信任的 CA(即 Istio CA)签发,并可以验证证书中的身份信息(如预期的 Service Account)。
- 应用透明:这一切对于应用程序代码来说是完全透明的!应用只需发起普通的 HTTP/gRPC/TCP 请求,Sidecar 会在底层自动完成加密和认证。开发者无需关心证书管理和 TLS 库的使用。
-
如何配置 (输入):
- 主要通过
PeerAuthentication
资源来控制 mTLS 策略的应用范围(整个网格、特定命名空间或特定工作负载)和模式:mode: STRICT
: 强制执行 mTLS。目标工作负载只接受使用 mTLS 加密的连接。这是在网格内部署推荐的默认模式。mode: PERMISSIVE
: 宽容模式。目标工作负载同时接受 mTLS 加密连接和普通的明文连接。这对于将现有服务逐步迁移到网格中非常有用。mode: DISABLE
: 禁用 mTLS。目标工作负载只接受明文连接。(通常不推荐在网格内部使用)。
# peer-authn-strict.yaml apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata:name
- 主要通过