Istio 1.28.7 是一个聚焦于安全与健壮性的补丁版本。如果你正在运行 1.28.x 系列,这次升级不是"可选"——里面包含两个已确认的授权绕过漏洞,以及一个影响 AWS EKS Ambient Mesh 的 kubelet 健康检查修复。下面逐项拆解关键变更,并给出升级前的实操检查清单。
AuthorizationPolicy 正则绕过:合法 K8s 名称被当成通配符
这是本次最严重的安全修复(Issue #59992)。问题出在 AuthorizationPolicy 的 source.principals(以 * 开头的后缀匹配)和 source.namespaces 字段上。
当策略中写入了包含正则元字符(如 . 或 [)的身份标识时,Istio 会把这些字符直接嵌入 Envoy 的 SafeRegex 规则,没有做转义。结果:一个合法的 Kubernetes 名称 my-app.prod 中的 . 在正则里变成了"匹配任意字符",原本只想允许 my-app.prod,实际却放过了 my-appXprod、my-appQprod 等大量非预期身份。
影响范围:使用了 source.principals 后缀匹配(* 开头)或 source.namespaces 且值中包含 .、[ 等正则元字符的策略。
快速排查你的集群中是否存在受影响的策略:
# 检查所有 AuthorizationPolicy 中 source.principals 或 source.namespaces
# 包含正则元字符且使用前缀/后缀匹配的情况
kubectl get authorizationpolicies -A -o json \
| jq -r '.items[] | select(.spec.rules[]?.from[]?.source.principals[]? | test("\\*.*[.\\[\\]]")) | "\(.metadata.namespace)/\(.metadata.name): \(.spec.rules[].from[].source.principals)"'
如果输出不为空,说明你的策略在 1.28.6 下可能已经被绕过。升级到 1.28.7 后这些元字符会被正确转义,策略行为回归预期。
XDS Debug 端点跨命名空间泄露
第二个安全修复(由 1seal 报告):Istiod 的 istio.io/debug/syncz 和 istio.io/debug/config_dump 端点,在旧版本中允许任何已认证的工作负载跨命名空间枚举代理并获取其他命名空间工作负载的配置 dump。
1.28.7 修复后,非系统调用者只能访问同命名空间的 debug 端点。如果你之前依赖跨命名空间访问这些端点做调试,升级后需要调整工作流——比如在目标命名空间内起一个临时调试 Pod,或使用 istioctl proxy-status 等工具替代。
Ambient Mesh 修复:AWS EKS 分支 ENI 与 Waypoint TLS
EKS 分支 ENI 的 kubelet 健康检查
在 AWS EKS 上使用 Security Groups for Pods(分支 ENI 模式)时,Ambient Mesh Pod 的 kubelet 健康探针流量会走 VPC fabric 而非 veth pair,导致探针失败、Pod 被 kubelet 杀死。
1.28.7 中 istio-cni 自动检测分支 ENI Pod,并添加 IP 规则将探针流量路由到 veth pair。该行为由 AMBIENT_ENABLE_AWS_BRANCH_ENI_PROBE feature flag 控制,默认开启。
如果你在 EKS 上跑 Ambient Mesh 且使用了分支 ENI,升级后这个问题应该直接消失。如果需要临时关闭该行为(比如排查路由问题),可以这样设置:
# 在 istio-cni 的 ConfigMap 中关闭分支 ENI 探针修复
kubectl edit configmap istio-cni-config -n istio-system
# 将 AMBIENT_ENABLE_AWS_BRANCH_ENI_PROBE 设为 "false"
Waypoint TLS Inspector 缺失
当 Waypoint 代理只有 TLS 端口时,旧版本不会添加 TLS inspector listener filter。这导致 resolution: DYNAMIC_DNS 的 wildcard ServiceEntry 上基于 SNI 的路由失效。1.28.7 修复了这一逻辑——只要存在 TLS 端口,TLS inspector 就会被正确注入。
HBONE 连接窗口大小可配置
新增两个 feature flag:PILOT_HBONE_INITIAL_STREAM_WINDOW_SIZE 和 PILOT_HBONE_INITIAL_CONNECTION_WINDOW_SIZE,用于配置 HBONE 连接到上游集群(Waypoint 和东西向网关生成)的初始流和连接窗口大小。
如果你观察到 Ambient Mesh 中 HBONE 连接出现不必要的缓冲延迟,可以尝试调大窗口:
# 在 istiod 的 ConfigMap 中调整 HBONE 窗口大小
kubectl edit configmap istio -n istio-system
# 添加或修改:
# PILOT_HBONE_INITIAL_STREAM_WINDOW_SIZE: "65536"
# PILOT_HBONE_INITIAL_CONNECTION_WINDOW_SIZE: "1048576"
# 修改后重启 istiod 使配置生效
kubectl rollout restart deployment istiod -n istio-system
默认值通常够用,只有在明确诊断出缓冲瓶颈时才建议调整。
istioctl 新增 IST0175 告警
当集群中存在 RequestAuthentication 资源但 istiod 未配置 BLOCKED_CIDRS_IN_JWKS_URIS 时,istioctl analyze 会输出 IST0175 告警。这是为了提醒你:JWKS URI 可能指向内网 CIDR,存在 SSRF 风险。
# 运行分析查看是否有 IST0175 告警
istioctl analyze -A
# 如果出现 IST0175,在 istiod ConfigMap 中配置阻塞 CIDR
kubectl edit configmap istio -n istio-system
# 添加 BLOCKED_CIDRS_IN_JWKS_URIS: "169.254.0.0/16,10.0.0.0/8"
其他修复
- Istiod 证书溢出:旧版本中 istiod 可能签发 NotAfter 超过签名证书过期时间的叶子证书。修复后叶子证书的过期时间被正确截断。
- Gateway API v1.4.1:新增对 Gateway API v1.4.1 的支持,如果你在使用 Gateway API CRD,可以升级到该版本获得最新字段兼容。
升级前检查清单
# 1. 检查当前版本
istioctl version
# 2. 检查 AuthorizationPolicy 正则绕过风险
kubectl get authorizationpolicies -A -o json \
| jq -r '.items[] | select(.spec.rules[]?.from[]?.source.principals[]? | test("\\*.*[.\\[\\]]")) | "\(.metadata.namespace)/\(.metadata.name)"'
# 3. 检查 RequestAuthentication + BLOCKED_CIDRS 配置缺失
istioctl analyze -A 2>&1 | grep IST0175
# 4. 检查是否有跨命名空间访问 debug 端点的调试脚本或自动化流程
# 升级后这些流程可能失效,需要提前调整
# 5. 下载并安装 1.28.7
istioctl upgrade --version 1.28.7
# 6. 升级后验证:确认策略行为正确
istioctl analyze -A
kubectl rollout restart deployment istiod -n istio-system
核心判断:如果你用了 AuthorizationPolicy 的 source.principals 后缀匹配,或者集群暴露了 XDS debug 端点给非管理员使用,这次升级应尽快完成。EKS 分支 ENI 用户同样受益明显。其余修复属于稳定性改善,可在常规维护窗口中升级。