在云原生体系里,“代理”早已不是简单转发:它可能是 Sidecar、网关、出入口转发器、透明代理(TPROXY),甚至是跨集群的流量中继。一旦业务把鉴权与加密寄托在代理层,最常见的事故也随之出现:只做单向 TLS 导致伪装客户端横行;证书手工分发 引发轮换中断;身份与策略割裂 造成审计无法追责。所谓“云原生双向代理认证”,核心就是让通信双方都能被强身份识别,并让代理在不暴露业务代码的前提下完成验证、授权与可观测。
一、目标与原则
- 双向身份:客户端与服务端都必须能被证明“是谁”,而不是“在谁的网段里”。
- 短周期凭据:证书/令牌应可自动轮换,避免长期密钥。
- 身份标准化:服务身份应可跨集群、跨云一致表达,避免依赖 IP/主机名。
- 策略可下沉:在代理层做最小侵入的认证与授权,业务只关心“已认证主体”。
二、推荐架构:mTLS + 工作负载身份 + 代理扩展授权
基础层(传输安全):服务间默认启用 mTLS,代理终止并校验对端证书,实现双向认证与加密。
身份层(工作负载身份):使用标准化的工作负载身份(如 SPIFFE 思路)给每个服务发放短期证书,证书中携带可解析的服务身份。
控制层(证书分发与轮换):通过 SDS/Agent 模式把证书动态推送给代理,避免把私钥塞进镜像或 ConfigMap。
策略层(细粒度授权):在代理启用外部授权(ext_authz 类能力),将请求元数据(来源身份、路径、方法、标签、请求头等)交给策略服务/OPA 评估,返回 allow/deny,并记录审计链路。
用户层(终端用户认证可选):若需要区分最终用户,再叠加 JWT/OIDC,在代理校验后把 user principal 传递给上游。
三、落地步骤(可直接照做)
Step 1:划定“谁必须 mTLS”
先覆盖东西向(服务到服务)流量;南北向(外部到网关)可逐步迁移。对遗留系统设例外清单,但要有期限与指标。
Step 2:建立工作负载身份与发证链路
为每个命名空间/服务账户映射一个服务身份;证书有效期建议小时级;启用自动轮换与吊销(至少支持失效重发)。
Step 3:代理接入动态证书(SDS/Agent)
代理不再读取静态证书文件,而是从本机 Agent/Socket 获取证书与信任包;这样跨集群联邦时也能动态注入对方信任根。
Step 4:启用双向校验与对端约束
不仅“校验证书有效”,还要“校验身份是否匹配”:
- 以服务身份做 allowlist(source principal / dest principal)
- 限制 SAN/URI 模式(防止证书被误用到别的服务)
- 对跨域通信启用联邦信任并做域隔离
Step 5:把授权从代码挪到代理(ext_authz)
策略服务最小实现:基于(来源身份 + 路由 + 方法 + 标签)做 RBAC;再逐步加入速率限制、风险分级、灰度放行与审计落库。这里的关键是:拒绝必须可解释(返回原因码 + trace id),否则排障会崩溃。
Step 6:可观测与审计闭环
每次认证与授权都要能在日志/指标/链路追踪中关联:
- mTLS 握手失败原因(过期、信任链、主机名/身份不匹配)
- 授权拒绝的策略命中点
- 证书轮换的成功率与耗时
- 代理与策略服务的可用性(避免授权系统成为单点)
四、常见坑与对策
- 坑1:只开 mTLS,不校验身份 → 等于“加密但不鉴别”,必须加 principal 级策略。
- 坑2:证书太长寿 → 泄露风险放大,建议短期证书 + 自动轮换。
- 坑3:网关/出入口代理绕过 → 需要对 egress/ingress 同样施加身份与策略,并限制直连。
- 坑4:策略服务性能瓶颈 → 先做本地缓存与分级策略;高频规则尽量在代理本地 RBAC 解决,复杂逻辑再外部授权。
- 坑5:调试困难 → 建议保留“诊断模式”:只记录不拦截,用于灰度期对齐策略。
五、上线检查清单
- 默认全网格 mTLS 是否覆盖?例外是否可追踪?
- 身份是否唯一且可跨环境解析?
- 证书轮换是否自动且可观测?
- 授权策略是否能解释拒绝原因并支持灰度?
- 出入口代理是否纳入同一套身份与审计?
最后补一句实用建议:在做代理认证联调与多账号隔离测试时,很多团队会用指纹环境来避免“同机多会话”互相污染;例如拉力猫指纹浏览器给予3天免费试用,内置隔离配置与环境复用的思路,上手成本低,适合在验证登录链路、风控规则与代理策略时快速搭建可重复的测试环境。整体而言,只要坚持“身份标准化 + 自动轮换 + 策略下沉 + 可观测闭环”,云原生双向代理认证就能从概念走到稳定可运营的工程方案。