Dubbo 服务网格的安全功能提供了强大的身份、强大的策略、透明的 TLS 加密以及认证工具,以保护您的服务和数据。Dubbo 的安全功能使用与 Istio 相同的安全模型,但针对 Dubbo 协议和无 Sidecar 架构进行了优化。
Dubbo 服务网格的安全架构包括两个核心组件:
这些组件协同工作,为您的服务网格提供安全防护。
在 Dubbo 服务网格中,每个工作负载都有一个身份,用于标识其来源。身份基于 SPIFFE 标准,使用 SPIFFE URI 格式:spiffe://<trust-domain>/ns/<namespace>/sa/<service-account>。
Dubbo 身份由以下部分组成:
cluster.local例如,在 default 命名空间中运行的服务账户 bookinfo-productpage 的身份为:
spiffe://cluster.local/ns/default/sa/bookinfo-productpage
Dubbo 服务网格支持信任域别名(Trust Domain Aliases),允许一个网格信任来自多个信任域的工作负载。这在跨集群或多租户场景中非常有用。通过 MeshConfig 中的 TrustDomainAliases 配置,可以为给定身份自动补全多信任域变体。
Dubbo 服务网格使用 SPIFFE 标准来管理工作负载身份和证书。每个工作负载都会自动获得一个 SPIFFE 身份,并可以获取相应的 X.509 证书用于双向 TLS 认证。
Dubbo 控制平面包含一个证书颁发机构(CA),用于为工作负载颁发证书。工作负载通过 Dubbo Agent 与控制平面通信,请求证书并定期轮转。
工作负载证书存储在以下位置:
./etc/certs/cert-chain.pem 或 ./var/run/secrets/workload-spiffe-uds/credentials/cert-chain.pem./etc/certs/key.pem 或 ./var/run/secrets/workload-spiffe-uds/credentials/key.pem./etc/certs/root-cert.pem 或 ./var/run/secrets/workload-spiffe-uds/credentials/root-cert.pem证书可以通过 SDS(Secret Discovery Service)或文件挂载方式下发到工作负载。
Dubbo 服务网格支持对等认证(Peer Authentication),用于服务到服务的认证。
双向 TLS 是 Dubbo 服务网格中服务到服务通信的主要认证机制。它提供了:
在宽容模式(PERMISSIVE)下,服务可以同时接受明文和 mTLS 流量。这对于逐步迁移到 mTLS 非常有用,允许服务在迁移过程中同时支持两种类型的流量。
安全命名确保只有具有适当服务账户的工作负载才能访问服务。Dubbo 使用 SPIFFE 身份来验证服务身份,确保只有授权的服务可以相互通信。
Dubbo 服务网格的认证架构包括:
dubbod 负责管理认证策略和证书认证策略用于指定网格、命名空间或工作负载级别的认证要求。Dubbo 支持 PeerAuthentication 策略,用于定义服务到服务的认证要求。
认证策略作为 Kubernetes CRD 存储在 Kubernetes API 服务器中。Dubbo 控制平面监听这些资源的变化,并将策略下发给数据平面。
PeerAuthentication 策略可以使用 selector 字段来指定策略应用的工作负载。如果没有指定 selector,策略将应用于命名空间或网格级别的所有工作负载。
PeerAuthentication 策略用于配置服务到服务的认证。它支持以下 mTLS 模式:
以下示例配置了一个 PeerAuthentication 策略,要求 default 命名空间中的所有服务使用 STRICT mTLS:
apiVersion: security.dubbo.apache.org/v1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
当您更新认证策略时,Dubbo 控制平面会自动将新策略下发给数据平面。策略更改会立即生效,无需重启工作负载。
在学习了上述基本概念之后,您还可以温习下述资料: