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 告警。
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
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 最小权限实施清单
- 禁止使用
cluster-admin默认角色:除非必要,否则创建自定义 ClusterRole。 - 按命名空间隔离:开发、测试、生产环境使用不同 Namespace,各自绑定独立 Role。
- 限制
*通配符:避免verbs: ["*"]或resources: ["*"],明确列出所需操作。 - ServiceAccount 专用化:每个微服务使用独立 ServiceAccount,不共享 。
- 定期审计:使用
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 绑定创建等事件,并直接触发告警。