【Istio 控制面】PeerAuthentication / AuthorizationPolicy → filter chain 与 SDS:策略怎么变成 RBAC 与证书

💡 原文中文,约9700字,阅读约需24分钟。
📝

内容提要

本文介绍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 集成。

🏷️

标签

➡️

继续阅读