# 简介：CIS Kubernetes 安全基准指南

在使用 [Kube Bench](https://github.com/aquasecurity/kube-bench) 的过程中注意到，其指导依据来自于 [CIS Benchmark](https://www.cisecurity.org/benchmark/kubernetes/)，于是顺藤摸瓜，下载了 CIS Kubernetews Be nchmark 的 PDF 版本，全文有两百多页，阅读量还蛮大的，因此对其进行整理，便于大家参考使用。

## 简介

CIS 的指导原则里把建议行为分成了两级：

- 一级：使用该建议不会造成负面影响。
- 二级：仅建议在非常强调安全性的系统中使用，可能对系统有副作用。

另外还将具体的检测结果分为计分和不计分两种结果。

以上两个维度可以用来对系统进行现状评估，也有助于读者选择性地采纳加固措施。

整个指南分为五个部分：

1. 控制平面组件
1. etcd
1. 控制平面配置
1. 节点配置
1. 策略

## 检查项概要

1. 所有运行参数文件、kubeconfig 文件以及证书，权限至少应为 `644` 并且属于 `root:root`。

1. API Server

    - 南向和北向通信
        - 关闭匿名访问
        - 禁止明文通信
    - 认证
        - 启用 Node,RBAC 认证
        - 禁用 Token 和 Basic 认证
        - 禁用 Alwaysallow
    - Admission Control
        - 禁用：AlwaysAdmit
        - 启用：AlwaysPullImages、AlwaysAdmit、EventRateLimit、ServiceAccount、NamespaceLifecycle、PodSecurityPolicy、NodeRestriction
    - 关闭 `profiling`
    - 启用审计日志
    - 启用请求超时
    - 启用 `--service-account-lookup`
    - `--tls-cipher-suites` 仅使用新的、强加密算法
    - 使用 `oidc` 等模式来代替客户端证书认证。

1. Controller Manager

    - 关闭 `profiling`
    - 开启 `--use-service-account-credentials`
    - 绑定 `127.0.0.1`
    - 启用 `--service-account-private-key-file`
    - `--feature-gates` 启用 `RotateKubeletServerCertificate`

1. Scheduler

    - 关闭 `profiling`
    - 绑定 `127.0.0.1`

1. ETCD

    - 启用节点间和客户端的双向认证
    - 设置数据文件权限
    - 禁用 `--auto-tls`
    - 使用独立的 CA 证书

1. 工作节点

    - Kubelet、Kube-proxy 的服务和配置文件权限
    - 关闭匿名访问
    - `--authorization-mode`  禁用 `AlwaysAllow`
    - kubelet 参数 `--read-only-port` 为 0
    - `--streaming-connection-idle-timeout` 不应设置为 0
    - `--protect-kernel-defaults` 设置为 `true`
    - `--make-iptables-util-chains` 设置为 `true`
    - 不要设置 `--hostname-override`
    - HTTPS 访问
    - `--rotate-certificates` 设置为 `true`
    - `--event-qps` 设置足够高，或者为 `0`
    - `--feature-gates` 启用 `RotateKubeletServerCertificate`

1. RBAC 和 ServiceAccount

    - 仅在需要时才使用 `cluster-admin` 角色
    - 限制对 `secret` 的访问
    - 限制使用通配符
    - 限制分配 Pod 创建权限
    - 仅在需要时才加载 Token，缺省将 automountServic eAccountToken 为 `false`
    - 使用不同的 ServiceAccount

1. Pod Security Policy

    - 使用 PSP 不应泛泛使用 `privileged`
    - 使用 PSP 谨慎控制如下授权
        - `hostPID`
        - `hostIPC`
        - `hostNetwork`
        - `allowPrivilegeEscalation`
        - `runAsUser.rule`
        - `NET_RAW`
    - 不应提供全面放行的 PSP 策略

1. 网络策略和 CNI

    - 支持策略的 CNI
    - 所有命名空间都定义网络策略

1. Secret 管理

    - 建议使用文件而非环境变量
    - 使用外部 Secret 存储

1. 扩展准入控制

    - 保障镜像来源

1. 通用策略

    - 命名空间隔离
    - 在 Docker 中启用 seccomp
    - 为 Pod 和容器启用 Security context
    - 不用缺省命名空间
