【Istio 控制面】PeerAuthentication / AuthorizationPolicy → filter chain 与 SDS:策略怎么变成 RBAC 与证书
内容提要
本文介绍Istio控制面中PeerAuthentication和AuthorizationPolicy两种安全策略的翻译与分发机制。PeerAuthentication管理入站连接的mTLS要求,AuthorizationPolicy编译为RBAC过滤器。CUSTOM操作通过shadow RBAC评估和metadata门控调用外部授权服务。证书由istiod CA签发,经istio-agent本地SDS服务器分发给Envoy,身份匹配依赖mTLS对端证书中的SPIFFE身份。
延伸解读
策略落点:入站 filter chain 而非路由
PeerAuthentication 和 AuthorizationPolicy 与路由类资源(CDS/RDS)不同,它们主要作用于入站 Listener 的 filter chain。PeerAuthentication 决定传输层是否强制 mTLS,AuthorizationPolicy 则编译为 RBAC 过滤器。理解这一落点差异,有助于排查策略未生效的问题:若配置了身份匹配规则但连接非 mTLS,规则不会匹配,应先检查连接是否真的启用了 mTLS。
CUSTOM 动作的迂回链路
AuthorizationPolicy 的 CUSTOM 动作并不直接让 RBAC 过滤器调用外部服务,而是通过 shadow RBAC 评估(DENY 但不拦截)写入动态元数据,再由 ext_authz 过滤器根据元数据门控触发外部授权。这种设计保持了 Envoy 过滤器职责单一,但排障时需同时查看 RBAC 和 ext_authz 两处配置,避免遗漏。
证书签发与分发的独立通道
证书由 istiod CA 签发,经 istio-agent 本地 SDS 服务器(Unix Domain Socket)分发给 Envoy,资源名固定为 default 和 ROOTCA。签发与分发是两条独立通道,与 LDS/CDS 共享 ADS 传输但资源名字空间独立。此外,纯文件模式(/etc/certs/)可绕过 CA 客户端,适用于外部 CA 集成场景。
Q&A
Istio 中 PeerAuthentication 和 AuthorizationPolicy 主要影响哪些 xDS 资源?
它们基本不碰 CDS/RDS,主要影响入站 Listener 的 filter chain。PeerAuthentication 管理入站连接的 mTLS 要求,影响 LDS 侧 filter chain 的 transport socket;AuthorizationPolicy 编译为 envoy.filters.http.rbac 过滤器,插入 HTTP filter 链。
PeerAuthentication 的 mTLS 模式有哪些?作用域优先级是怎样的?
mTLS 模式有 UNSET、DISABLE、PERMISSIVE、STRICT 四档。UNSET 表示继承父级,若无父级则视为 PERMISSIVE。作用域优先级为 workload 级(带 selector)> namespace 级 > mesh 级,UNSET 时逐级向上查找第一个显式设置的值。
portLevelMtls 有哪些使用限制?
portLevelMtls 只能用于带 selector 的 workload 级策略,namespace 级策略不能设置端口例外。端口号是 workload(容器)端口,不是 Kubernetes Service 端口,并且只有在该端口确实被某个 Service 绑定时才生效。
AuthorizationPolicy 的 CUSTOM action 是如何工作的?
CUSTOM action 通过 shadow RBAC 评估(DENY action,不拦截)将结果写入 dynamic metadata,然后由 ext_authz filter 根据 metadata 门控调用外部授权服务。这样可以在不修改 RBAC filter 的情况下,将进程内策略引擎与外部策略服务串联起来。
AuthorizationPolicy 中按身份匹配的规则(如 from.source.namespaces)是如何实现的?
这些规则最终读取 mTLS 对端证书中的 SPIFFE 身份,写入 Envoy 的 io.istio.peer_principal filter state。如果连接不是 mTLS,peer_principal 为空,此类规则不会匹配。
Istio 中证书是如何签发和分发的?
证书由 istiod CA 签发(IstioCA.Sign),istio-agent 生成 CSR 并携带 K8s ServiceAccount JWT 通过 gRPC 请求签发。证书分发通过 istio-agent 本地 SDS server(Unix Domain Socket)提供给 Envoy,资源名为 default(workload SPIFFE 证书)和 ROOTCA(根证书)。
Istio 支持哪些证书分发模式?
支持两种模式:一是通过 istio-agent 本地 SDS server 从 istiod CA 获取证书;二是纯文件模式,证书挂载在 /etc/certs/ 下,直接读取文件,不经过 CA 客户端,常见于外部 CA 集成。