如何基于 CIS Benchmark 加固 K8s 集群?

来源:站长源码作者:深圳程序员头衔:程序员
导读:本期聚焦于深圳程序员创作的《如何基于 CIS Benchmark 加固 K8s 集群?》,敬请观看详情。把 K8s 集群直接部署到生产环境而不做基线检查,往往在首次安全审计中暴露大量高危配置。CIS Kubernetes Benchmark 提供了一套可落地的配置检查清单,覆盖控制平面、etcd、工作节点、RBAC 与审计策略。该基准把每个检查项划分为自动化可验证的规则,帮助运维人员快速定位 apiserver 匿名认证、etcd 明文传输、kubelet 只读端口等风险。结合官方推荐的 kube-bench 工具,可以在集群内或外部节点执行扫描,生成与 CIS 编号对应的整改报告。本文从 CIS 检查域、kube-bench 扫描流程、控制平面与 etcd 加固、工作节点与 RBAC 网络策略落地四个层面展开,给出可以直接用于测试环境和生产环境的关键参数与 YAML 示例。读完可以建立一套最小化权限、可审计、带持续扫描的 K8s 加固闭环。

CIS Kubernetes Benchmark 不是一份简单的安全建议,而是由国际组织 CIS 发布的、可被自动化工具执行的具体配置检查集合。它针对 Kubernetes 控制平面、数据存储、工作节点以及策略配置,给出了数百条带有编号的检查项。这些检查项的默认阈值通常对应生产环境最低安全要求,因此常被银行、政务云和互联网核心业务用作集群上线前的验收基线。对于规模不大但暴露在公网的集群,先完成 Level 1 检查,再根据业务模型选做 Level 2,可以在不显著增加运维成本的情况下消除大部分已知攻击面。

如何基于 CIS Benchmark 加固 K8s 集群?

一、CIS Benchmark 的检查域与等级划分

CIS Kubernetes Benchmark 按组件划分检查域,典型包括 Master Node Security Configuration、Worker Node Security Configuration、Policies 以及 Control Plane 组件等。每个检查项都有唯一编号,例如 1.2.3 表示控制平面的某个参数要求。检查项分为 Level 1 和 Level 2:Level 1 要求明确、对多数环境无副作用,适合所有集群;Level 2 通常用于高安全环境,可能会牺牲部分兼容性或性能。加固前应先明确集群需要达到的等级,否则容易误改生产参数造成业务抖动。

从实际审计经验看,高风险问题集中在 apiserver 的匿名认证、etcd 未启用证书认证、kubelet 只读端口暴露以及默认 ServiceAccount 自动挂载。这些问题不需要修改业务代码即可修复,但需要仔细核对节点启动参数和配置文件。比如 kube-apiserver 允许匿名访问时,任何能访问 API Server 端点的客户端都可以读取部分资源,属于典型的高危基线偏差。CIS 检查项会给出期望值和修复命令,这正是它比普通安全清单更适合自动化的原因。

此外,CIS Benchmark 并不仅针对集群部署本身,也关注审计日志、事件限制和 Secret 保护。许多团队只改 apiserver 参数,却忽略了 audit log 的持久化和告警,导致入侵后无法还原操作路径。因此本文会把审计策略作为控制平面加固的一部分,而不是孤立步骤。

二、使用 kube-bench 扫描并定位配置偏差

kube-bench 是 Aqua Security 开源的 CIS Kubernetes Benchmark 扫描器,能够以容器、二进制或 Kubernetes Job 方式运行。它读取节点上的配置文件、进程参数和 API 资源,然后逐项对比 CIS 编号,输出 PASS、FAIL、WARN 三种结果。扫描报告中会直接引用检查项编号,例如 1.1.1 要求确保 kube-apiserver 的 --anonymous-auth 参数为 false。根据报告定位问题比手工查阅 PDF 高效得多。

# 以容器方式扫描 master 节点
docker run --rm -v /etc:/etc -v /var:/var -v /usr:/usr \
  aquasec/kube-bench:latest master

上面命令挂载宿主机目录,使容器内的 kube-bench 能读取 kube-apiserver 的配置文件。如果集群由 kubeadm 部署,静态 Pod 文件位于 /etc/kubernetes/manifests,kube-bench 会解析这些 YAML 里的启动命令。为了只检查某一小节,可以增加 --check 参数,如 --check 1.2.3。需要注意的是,kube-bench 的版本必须与集群大版本匹配,否则可能因检查项变化产生误报。

扫描完成后,不要直接批量执行所有修复建议。应先处理 FAIL 项,再评估 WARN。很多 FAIL 项修复需要重启相应组件,apiserver、controller-manager、scheduler、etcd 都是静态 Pod,修改 /etc/kubernetes/manifests/*.yaml 后 kubelet 会自动拉起。但生产环境应逐台滚动,避免同时重启多个控制平面节点导致集群不可用。可以在测试集群先验证参数组合是否影响业务,再发布到生产节点。

如果需要持续检测,可以把 kube-bench 部署为 Kubernetes CronJob,每日执行一次并将结果输出到日志系统。例如先创建 Job YAML,再通过 kubectl logs 收集报告。这样能防止集群因后续变更重新引入不安全配置。

三、控制平面与 etcd 的关键加固参数

控制平面加固的核心是拒绝匿名访问、启用 Node 授权模式、限制准入控制器和开启审计日志。kube-apiserver 的 --anonymous-auth 必须设置为 false--authorization-mode 应至少包含 Node,RBAC,不要保留 AlwaysAllow。同时建议启用 NodeRestrictionPodSecurity 等准入插件,限制 kubelet 只能修改与自身 Pod 关联的资源。

# kube-apiserver.yaml 片段
spec:
  containers:
  - command:
    - kube-apiserver
    - --anonymous-auth=false
    - --authorization-mode=Node,RBAC
    - --enable-admission-plugins=NodeRestriction,PodSecurity
    - --audit-log-path=/var/log/kubernetes/audit.log
    - --audit-policy-file=/etc/kubernetes/audit-policy.yaml

etcd 存储集群所有状态,包含 Secret、ConfigMap 和证书信息。CIS 检查要求 etcd 必须启用客户端证书认证,禁止使用 HTTP 明文监听。--client-cert-auth--peer-client-cert-auth 都应该为 true--listen-client-urls 不应包含 http://,而应仅保留 https:// 地址。如果 etcd 与 apiserver 部署在同一节点,至少要将 --listen-client-urls 绑定到 https://127.0.0.1:2379,避免其他 Pod 直接访问。

审计日志方面,CIS 建议配置合理的 audit policy,至少记录元数据级别的写请求和敏感资源访问。可以创建 audit-policy.yaml,对 SecretsConfigMaps 等资源使用 RequestResponse 级别,其余使用 Metadata。开启审计后要给日志文件设置轮转和保留周期,否则磁盘可能被写满。以 systemd 或 kubelet 管理的节点为例,可使用 logrotate 或 Kubernetes 的 audit-log-maxage 参数控制保留天数。

四、工作节点、RBAC 与网络策略落地

工作节点最常见的偏差是 kubelet 只读端口和匿名请求。默认配置下 kubelet 可能监听 10255 只读端口,并允许未认证请求获取节点信息。CIS 要求设置 readOnlyPort: 0 并启用 Webhook 认证授权。kubelet 配置通常在 /var/lib/kubelet/config.yaml,修改后需要重启 kubelet 服务。以下为关键字段示例:

# kubelet config.yaml 片段
readOnlyPort: 0
protectKernelDefaults: true
authentication:
  anonymous:
    enabled: false
  webhook:
    enabled: true
authorization:
  mode: Webhook

RBAC 方面,CIS 检查会审计 cluster-admin 绑定数量、默认 ServiceAccount 是否自动挂载令牌以及 RoleBinding 是否过度授权。生产环境应避免直接给业务 Deployment 绑定 cluster-admin,尽量按命名空间创建 Role 和 RoleBinding。默认 ServiceAccount 可通过在 ServiceAccount 资源中设置 automountServiceAccountToken: false 或者使用专门的 ServiceAccount 并禁用自动挂载。对于需要调用 API 的工作负载,应使用 TokenRequest 获得有时效的令牌,而不是长期有效的 Secret 令牌。

网络策略是 CIS 中 Policies 检查域的重要组成部分。如果没有 NetworkPolicy,任何 Pod 之间默认可以互相访问,横向移动风险极高。建议至少为敏感命名空间创建默认拒绝入口流量和出口流量的策略,再针对实际需要放行白名单。以下 YAML 定义默认拒绝后,只允许同命名空间内带 app: web 标签的 Pod 访问数据库端口。

# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-access
spec:
  podSelector:
    matchLabels:
      app: db
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web
    ports:
    - protocol: TCP
      port: 5432

完成加固后,建议重新运行 kube-bench 并保留报告作为合规证据。同时把关键参数纳入集群配置管理系统,避免后续扩容节点或升级集群时重新引入不安全默认值。对于使用托管 Kubernetes 服务的团队,虽然无法修改控制平面参数,但可以对照 CIS Benchmark 检查 RBAC、NetworkPolicy、Pod 安全标准和审计日志配置,并结合云厂商的安全评分服务做持续巡检。

K8s集群加固CIS Benchmarkkube-bench修改时间:2026-08-21 12:51:55

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。