本文目录导读:

- 第一层:供应链与依赖安全(源头审计)
- 第二层:Kubernetes 资源安全配置(运行时审计)
- 第三层:Helm 模板逻辑与变量注入(配置审计)
- 第四层:部署与生命周期管理(操作审计)
- 给审计人员的实操建议(检查清单表)
- 特别针对关基的关键红线(一票否决项)
针对关基(关键信息基础设施)场景下 Helm Charts 的审计,核心在于从“应用交付”角度,验证其是否符合国家等级保护、关基保护条例以及企业自身的合规与安全基线。
Helm Chart 本质上是一个打包了 Kubernetes 资源清单(YAML)、元数据(Chart.yaml)和模板逻辑(Go Template)的压缩包,审计它,不仅要看最终输出的 YAML 是否安全,还要看其模板逻辑是否会引入不安全变量,以及依赖的外部镜像/ Chart 是否存在供应链风险。
以下是针对关基场景的深度审计清单,分为四个层级:
第一层:供应链与依赖安全(源头审计)
这是关基场景的重中之重,因为 Helm Chart 通常会引入子 Chart 或依赖外部容器镜像。
- 镜像来源与签名
- 检查项:
values.yaml或deployment.yaml中的image.repository和image.tag。 - 风险: 使用了
latest标签、使用了 Docker Hub 或第三方非可信仓库、未指定镜像 digest(SHA256)。 - 关基要求: 必须使用内部私有仓库(Harbor / Nexus)的镜像,且标签必须是不可变的(如精确版本号或 Digest)。
- 检查项:
- 依赖 Chart 审计
- 检查项:
Chart.yaml中的dependencies字段。 - 风险: 引入了未审计的第三方公共 Chart(如 Bitnami),或依赖仓库使用了 HTTP(非 HTTPS)。
- 做法: 检查依赖是否已拉取至内部仓库,并经过安全扫描(如 Trivy 扫描 Chart 中的镜像)。
- 检查项:
- Chart 签名(Provenance)
- 检查项: 是否存在
PROVENANCE文件及.prov签名文件。 - 风险: 无签名,无法确认 Chart 是否被篡改。
- 做法: 在安装时使用
--verify标志,审计时需验证公钥链。
- 检查项: 是否存在
第二层:Kubernetes 资源安全配置(运行时审计)
这部分最繁琐,关键看你 Helm Chart 最终渲染出来的 YAML 是否安全。
- 权限与 RBAC
- 服务账户(ServiceAccount): 检查是否会使用
default服务账户。关基要求:必须显式创建并挂载自定义的、最小权限的服务账户。 - ClusterRole 绑定: 检查是否存在
cluster-admin级别的绑定,对于非系统组件(如数据库、应用),除非绝对必要,否则严禁绑定。 - 自动化挂载: 检查 Pod Template 中
automountServiceAccountToken: false是否被遗漏,当 Pod 不需要访问 API Server 时,应禁用。
- 服务账户(ServiceAccount): 检查是否会使用
- 安全上下文(Security Context)
- POD 级别: 检查
runAsNonRoot: true、runAsUser/Group是否为高 ID(如 1000-2000,非 root 0)、fsGroup是否合理。 - 容器级别: 检查
capabilities.drop: ["ALL"],并仅添加必要的add(如NET_BIND_SERVICE),检查readOnlyRootFilesystem: true。 - Seccomp / AppArmor: 检查是否注入了
seccomp.security.alpha.kubernetes.io/pod: runtime/default或类似注解。关基环境通常要求开启。
- POD 级别: 检查
- 网络策略(NetworkPolicy)
- 默认拒绝: 检查是否有默认的“拒绝所有入站”策略,Helm Chart 如果没有自带 NetworkPolicy,则存在风险。
- 最小允许: 检查是否只开放了必要的 Ingress 和 Egress 规则,而非 或
0.0.0/0。
- 资源限制与 Pod 安全标准
- 资源配额: 检查
resources.requests和limits是否已定义,缺乏限制会导致 DoS 风险。 - Pod 安全准入: 检查 Chart 是否符合 Pod Security Standards 的
restricted或baseline级别,禁止privileged: true、hostPID: true、hostNetwork: true等高风险选项。
- 资源配额: 检查
- 敏感信息存储(Secrets 与 ConfigMaps)
- 硬编码值: 检查
values.yaml文件中是否含有明文密码或 Token。 - 环境变量泄露: 检查是否通过
env.value直接传递敏感字段,而非使用env.valueFrom.secretKeyRef。 - 密钥加密: 检查 Chart 是否使用了 SealedSecrets 或 External Secrets Operator 等机制,而非直接存储明文 Secret。
- ConfigMap 数据: 检查 ConfigMap 中是否意外存储了证书或连接字符串。
- 硬编码值: 检查
第三层:Helm 模板逻辑与变量注入(配置审计)
关基场景下,运维人员会通过 values.yaml 注入大量配置,模板逻辑必须安全。
- 模板注入与转义
- 风险点: 在 Helm 模板中使用
{{ .Values.description }}这类变量时,如果未正确转义,可能被注入恶意表达式(虽然较少见,但属于深度审计)。 - 检查项: 查找
tpl函数的使用,确保用户输入的字符串不会意外调用 Go 模板函数。
- 风险点: 在 Helm 模板中使用
- 默认值与覆盖规则
- 安全默认值: 检查
values.yaml中的默认安全配置是否合理,默认的replicaCount是否为 2(高可用),默认的日志级别是否为info而非debug(防止敏感信息泄露)。 - 校验钩子: 检查是否存在
values.schema.json,这个 JSON Schema 文件可以校验用户输入的 values 类型、格式和枚举值。关基要求:必须提供 schema 文件,防止错误或非预期的配置注入。
- 安全默认值: 检查
- 命名空间硬编码
- 风险: 模板中硬编码了
namespace: default或特定的业务命名空间。 - 做法: 必须使用
.Release.Namespace动态获取命名空间。
- 风险: 模板中硬编码了
第四层:部署与生命周期管理(操作审计)
Helm 的 hooks 和 lifecycle 可能带来预安装或卸载阶段的执行风险。
- Helm Hooks 脚本
- 检查项:
annotations: "helm.sh/hook: pre-install, post-upgrade"等。 - 风险: Hook 中运行的 Job 或 Pod 可能执行危险命令(如
kubectl delete、数据库 DROP TABLE),或请求外部资源(数据泄露)。 - 审计要求: 逐行审查 Hook 中的 Job 模板及其容器命令,对于关基系统,应限制 Hook 的执行用户和网络。
- 检查项:
- Webhook 与 Admission
Chart 自带的 Mutating / Validating Webhook,需特别审计其逻辑,防止其绕过 Kubernetes 自身的准入控制器(如 Pod Security Admission)。
- 版本回退策略
- 审计 Chart 是否支持
--history-max限制,防止helm rollback操作时因历史版本未清理导致的资源泄露。
- 审计 Chart 是否支持
给审计人员的实操建议(检查清单表)
你可以使用以下工具链和思路来执行审计:
| 阶段 | 工具/命令 | 审计要点 |
|---|---|---|
| 静态扫描 | helm lint |
检查语法错误、命名规范、Schema 有效性。 |
helm template (重定向到文件) |
生成最终 YAML,这是最核心的审计步骤。 | |
kube-score |
对渲染后的 YAML 进行评分,检查安全上下文、资源限制、PVC 等。 | |
conftest + OPA 策略 |
编写自定义 Rego 策略,检查是否违反内部安全基线(禁止使用 latest 标签)。 |
|
trivy (config 模式) |
扫描 Helm Chart 中的错误配置(如特权容器、敏感端口暴露)。 | |
| 依赖扫描 | trivy (fs / image 模式) |
扫描 Chart 内引用的容器镜像的 CVE 漏洞。 |
| 深度检查 | 人工 Review templates/ 目录 |
检查 Go Template 逻辑、循环、条件判断是否安全。 |
检查 charts/ 目录 |
Chart 被打包(.tgz),解压后检查其内置的 charts/ 子目录依赖。 |
特别针对关基的关键红线(一票否决项)
如果在审计中发现以下任意一项,该 Helm Chart 应被立即拒绝部署:
- 容器以 root 用户(UID=0)运行。
- 镜像使用了
latest或可变标签,且未指定 SHA256 Digest。 - 存在
privileged: true或挂载了宿主机敏感路径(如/var/run/docker.sock、/proc、/sys)。 - 未定义 NetworkPolicy,或 NetworkPolicy 允许
0.0.0/0出站。 - 在
values.yaml或 ConfigMap 中出现了明文密码、Token 或证书私钥。 - 依赖的 Chart 或镜像来自互联网公共仓库且未经内部安全团队扫描。
关基的 Helm Chart 审计,核心是“不可信执行”的前提——即 Chart 中所有的镜像、配置、默认值都应被视为潜在不安全,需要通过内部安全基线(通常以 OPA/Kyverno 策略形式固化)的严格校验。