3. Kubernetes 集群安全基线:API Server 安全配置、etcd 加密、RBAC 最小权限原则

Kubernetes 集群的安全基线是云原生安全的第一道防线。攻击者一旦突破集群控制面,即可窃取敏感数据、部署恶意负载或横向移动。本章聚焦三大核心安全域:API Server(集群入口)、etcd(数据存储)、RBAC(权限控制)。三者构成“入口加固—存储加密—权限收敛”的纵深防御基线。

3.1 API Server 安全配置基线

API Server 是 Kubernetes 控制面的前端,所有 kubectl、Pod、ServiceAccount 的请求均经过它。基线配置需覆盖认证、传输、审计三个层面。

配置项 推荐值 风险说明
--anonymous-auth false 禁止匿名请求,防止未认证访问
--enable-admission-plugins NodeRestriction,PodSecurity,DenyServiceExternalIPs 启用准入控制器,拦截不安全 Pod 与 Service
--tls-cert-file / --tls-private-key-file 集群 CA 签发的证书 强制 TLS 1.2+,禁用自签名或过期证书
--audit-log-path /var/log/kubernetes/audit.log 开启审计日志,记录所有 API 操作
--service-account-lookup true 验证 ServiceAccount 是否存在,防止伪造
基线检查命令示例:
# 检查匿名认证是否关闭
kubectl get pods -n kube-system -l component=kube-apiserver \
  -o jsonpath='{.items[*].spec.containers[*].command}' | grep anonymous-auth

# 检查准入插件列表
kubectl get pods -n kube-system -l component=kube-apiserver \
  -o jsonpath='{.items[*].spec.containers[*].command}' | grep enable-admission-plugins
实践建议: 使用 kube-bench 或 kubeaudit 自动化扫描 API Server 配置,将检查结果接入 Prometheus 告警。
API Server 请求链路与安全控制点 API Server 请求链路与安全控制点 kubectl / 用户 认证层 TLS / / OIDC 准入控制层 NodeRestriction / PodSecurity 审计 & 授权 RBAC / Audit Log 安全控制点说明 1. 认证层:拒绝匿名请求,强制 TLS 双向认证。 2. 准入控制层:拦截特权容器、HostPath、外部 IP Service。 3. 审计与授权层:记录所有变更操作,按最小权限授予 RBAC 角色。 4. 任何一层拒绝,请求即终止,不进入 etcd。

3.2 etcd 加密:静态数据与传输安全

etcd 存储集群所有资源对象(Secret、ConfigMap、Pod 定义等)。若 etcd 被攻破,攻击者可直接读取明文 Secret。基线要求:传输加密 + 静态加密。

3.2.1 传输加密(TLS)

  • etcd 集群成员间通信使用 --peer-cert-file 和 --peer-key-file 启用 TLS。
  • API Server 连接 etcd 使用 --etcd-certfile 和 --etcd-keyfile 进行双向认证。
  • 禁止使用 --peer-auto-tls 或 --client-cert-auth=false。

3.2.2 静态加密(EncryptionConfiguration)

Kubernetes 1.13+ 支持通过 EncryptionConfiguration 资源对 etcd 中的 Secret 等敏感对象进行 AES-CBC 或 AES-GCM 加密。

EncryptionConfiguration 示例:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aesgcm:
          keys:
            - name: key1
              secret: c2VjcmV0LWtleS0zMi1ieXRlcw==
      - identity: {}  # 降级时保留明文读取能力
关键注意: 加密密钥必须定期轮换,且存储在外部 KMS(如 AWS KMS、GCP Cloud KMS、HashiCorp Vault)中,不要硬编码在 YAML 文件内。启用加密后,需验证 etcd 中存储的 Secret 是否为密文:
ETCDCTL_API=3 etcdctl get /registry/secrets/default/mysecret --print-value-only | hexdump -C | head
etcd 加密架构与数据流 etcd 加密架构与数据流 API Server EncryptionConfiguration 加密层 AES-GCM / KMS 密钥轮换 etcd 集群 密文存储 外部 KMS 密钥管理 审计日志 数据流说明 1. API Server 写入 Secret 时,先通过加密层(AES-GCM 或 KMS)加密,再写入 etcd。 2. 读取时,API Server 从 etcd 获取密文,解密后返回给客户端。 3. 外部 KMS 负责密钥存储与轮换,API Server 不直接接触主密钥。

3.3 RBAC 最小权限原则

RBAC(基于角色的访问控制)是 Kubernetes 权限管理的核心。最小权限原则要求:每个用户、ServiceAccount 只获得完成其任务所需的最小权限集。

3.3.1 核心 RBAC 对象

对象 作用 示例
Role 命名空间内权限集合 get pods, list services
ClusterRole 集群级权限(节点、PV、CRD) get nodes, list persistentvolumes
RoleBinding 将 Role 绑定到用户/ServiceAccount binding: dev-team → developer-role
ClusterRoleBinding 将 ClusterRole 绑定到集群范围主体 binding: admin-user → cluster-admin

3.3.2 最小权限实施清单

  1. 禁止使用 cluster-admin 默认角色:除非必要,否则创建自定义 ClusterRole。
  2. 按命名空间隔离:开发、测试、生产环境使用不同 Namespace,各自绑定独立 Role。
  3. 限制 * 通配符:避免 verbs: ["*"] 或 resources: ["*"],明确列出所需操作。
  4. ServiceAccount 专用化:每个微服务使用独立 ServiceAccount,不共享 。
  5. 定期审计:使用 kubectl auth can-i --list --as=system:serviceaccount:ns:sa-name 检查实际权限。
最小权限 Role 示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: app-team
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: app-team
  name: read-pods
subjects:
- kind: ServiceAccount
  name: app-sa
  namespace: app-team
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
常见风险: 许多团队将 edit 或 admin 角色直接绑定给 CI/CD 系统,导致流水线拥有创建 Pod、挂载 HostPath 的权限。攻击者一旦攻破 CI 节点,即可利用该权限逃逸到宿主机。建议为 CI/CD 创建仅包含 create pods、get deployments 等最小操作的专用 Role。

3.4 基线变更监控与告警

安全基线不是静态的。攻击者可能通过修改 API Server 启动参数、关闭 etcd 加密、或创建高权限 RoleBinding 来绕过基线。实时监控策略:

监控对象 变更事件 告警规则示例(PromQL)
API Server 配置 --anonymous-auth=true 被启用 kube_apiserver_anonymous_requests_total > 0
etcd 加密状态 EncryptionConfiguration 被删除或降级 absent(kube_apiserver_encryption_config_controller_encryption_enabled)
RBAC 权限变更 创建 cluster-admin 绑定 rate(kube_audit_event_total{verb="create",object="clusterrolebindings"}[5m]) > 0
审计日志异常 非预期用户执行 exec 或 attach kube_audit_event_total{verb="create",resource="pods/exec"} > 0
工具链推荐: Falco(运行时异常检测)+ kube-bench(基线扫描)+ Prometheus + Alertmanager 构成闭环。Falco 可检测 API Server 启动参数变更、etcd 进程异常、RBAC 绑定创建等事件,并直接触发告警。