现状:2019 年 Kubernetes 第三方安全审计

我们预计全新的 Kubernetes 第三方安全审计报告将于本月晚些时候(2022 年 10 月)发布。

为此,我们来回顾一下上次基于 Kubernetes v1.13.42019 年第三方安全审计中公开的发现现状。

动机

Craig Ingram 多年来一直在努力跟踪上次审计中报告的问题状态:kubernetes/kubernetes#81146。这篇博文将深入探讨这个问题,弥补跟踪中的任何不足,并成为对 2019 年报告的问题现状的时间点总结。

本文还将通过透明的沟通,帮助读者对社区为解决这些发现所做的工作树立信心,并突出任何需要社区贡献者帮助的发现。

当前状态

此处每个问题/发现的状态是以尽力而为的方式呈现的。作者不保证状态 100% 准确,并欢迎对现状未准确反映的任何更正或反馈,请直接在相关问题上发表评论。

#标题问题状态
1hostPath PersistentVolumes 启用 PodSecurityPolicy 绕过#81110已关闭,已通过 kubernetes/website#15756kubernetes/kubernetes#109798 解决
2Kubernetes 不支持证书撤销#81111#18982 的重复项,需要一个 KEP
3HTTPS 连接未认证#81112大部分留给最终用户通过设置正确的配置来完成
4TOCTOU 当通过 kubelet 将 PID 移动到 manager 的 cgroup 时#81113需要节点访问才能成功利用。需要修复
5kubectl cp 中未正确修补的目录遍历漏洞#76788已关闭,分配了 CVE-2019-11249,在 #80436 中修复
6日志中暴露 Bearer tokens#81114已关闭,分配了 CVE-2019-11250,在 #81330 中修复
7Seccomp 默认禁用#81115已关闭,已通过 #101943 解决
8普遍存在的世界可访问的文件权限#81116#112384 (进行中)
9环境变量暴露敏感数据#81117已关闭,已通过 #84992#84677 解决
10SSH 连接中使用了 InsecureIgnoreHostKey#81118此功能已在 v1.22 中移除:#102297
11使用了 InsecureSkipVerify 和其他 TLS 弱点#81119需要一个 KEP
12kubeadm 执行潜在危险的重置操作#81120已关闭,通过 #81495#81494kubernetes/website#15881 修复
13使用 strconv.Atoi 并向下转型结果时发生溢出#81121已关闭,通过 #89120 修复
14kubelet 可能因恶意 manifest 导致内存不足错误#81122已关闭,通过 #76518 修复
15kubectl 可能因恶意 Pod 规范导致内存不足错误#81123需要修复
16不正确的 PIDs 获取方式导致 cgroup 移动不正确#81124需要修复
17运行 kube-apiserver 和 kubelet 的主机日志目录遍历#81125已关闭,通过 #87273 修复
18非常数时间密码比较#81126已关闭,通过 #81152 修复
19加密建议不符合最佳实践#81127进行中
20默认将凭据添加到容器是不安全的#81128已关闭,通过 #89193 修复
21kubelet 活跃度探针可用于枚举主机网络#81129需要一个 KEP
22日志中的 iSCSI 卷存储明文密钥#81130已关闭,通过 #81215 修复
23硬编码的凭据路径#81131已关闭,等待更多证据
24日志轮转不是原子性的#81132需要修复
25没有边界的任意文件路径#81133需要修复
26不安全的 JSON 构造#81134部分修复
27kubelet 因错误处理不当而崩溃#81135已关闭,通过 #81135 修复
28旧版 tokens 不会过期#81136已关闭,作为 #70679 的一部分修复
29CoreDNS 泄露跨命名空间的内部集群信息#81137已关闭,通过 CoreDNS v1.6.2 解决。#81137 (comment)
30Services 使用可疑的默认函数#81138需要修复
31容器管理器中 docker daemon 进程名不正确#81139已关闭,通过 #81083 修复
32到处使用标准格式#81140需要一个 KEP
33表面健康检查提供虚假的安全感#81141已关闭,通过 #81319 修复
34硬编码使用不安全的 gRPC 传输#81142需要一个 KEP
35Retry-After 处理不正确#81143已关闭,通过 #91048 修复
36不正确的 isKernelPid 检查#81144已关闭,通过 #81086 修复
37Kubelet 支持不安全的 TLS 密码套件#81145已关闭,但 #91444 需要修复 (参见 此评论)

受启发的成果

除了修复特定问题外,2019 年的第三方安全审计还推动了 Kubernetes 在接下来的几个版本中进行安全增强。其中一个例子是 Kubernetes Enhancement Proposal (KEP) 1933 通过静态分析防御日志记录密钥,以防止将密钥暴露到日志中,由 Patrick Rhomberg 推动实现。作为此 KEP 的结果,go-flow-levee 是一个配置用于检测密钥日志记录的污点传播分析工具,在 脚本 中作为 Prow 预提交作业执行。此 KEP 在 v1.20.0 中作为 alpha 特性引入,然后在 v1.21.0 中升级到 beta,并在 v1.23.0 中升级到 stable。在 stable 阶段,分析作为阻塞预提交测试运行。此 KEP 还帮助解决了 2019 年第三方安全审计中的以下问题:

剩余工作

已识别的 37 个发现中的许多问题已由我们的社区成员在过去 3 年中修复。然而,我们仍有一些工作要做。以下是剩余工作的分解,以及关于修复这些待解决问题所需时间投入、复杂性和对生态系统的益处的粗略估计。

标题问题时间投入复杂性对生态系统的益处
Kubernetes 不支持证书撤销#81111
使用了 InsecureSkipVerify 和其他 TLS 弱点#81119
kubectl 可能因恶意 Pod 规范导致本地内存不足错误#81123
不正确的 PIDs 获取方式导致 cgroup 移动不正确#81124
kubelet 活跃度探针可用于枚举主机网络#81129
API Server 支持不安全的 TLS 密码套件#81145
TOCTOU 当通过 kubelet 将 PID 移动到 manager 的 cgroup 时#81113
日志轮转不是原子性的#81132
没有边界的任意文件路径#81133
Services 使用可疑的默认函数#81138
到处使用标准格式#81140非常低
硬编码使用不安全的 gRPC 传输#81142非常低

要开始修复需要帮助的这些发现中的任何一个,请考虑参与 Kubernetes SIG Security,加入我们的双周会议或在 Slack 频道与我们交流。