本文目录导读:

- 集群层面的基础安全加固
- Pod 安全标准(Pod Security Standards, PSS)
- 网络安全策略(NetworkPolicy)
- 容器与Pod运行时的安全配置
- 镜像与供应链安全
- 机密管理与Secrets加密
- 服务网格与零信任网络(进阶)
- 推荐的基线配置清单
配置Kubernetes集群的安全策略是一个系统工程,需要从集群层面、Pod层面以及网络层面等多个维度进行,以下是一套比较完整的安全策略配置指南:
集群层面的基础安全加固
在配置Pod和网络策略之前,首先要确保集群本身是安全的。
-
RBAC(基于角色的访问控制)
- 原则:最小权限原则。
- 操作:禁止使用
cluster-admin这类超级管理员角色给普通用户或ServiceAccount,为不同的团队、应用创建特定的Role(命名空间级别)或ClusterRole(集群级别),并通过RoleBinding或ClusterRoleBinding进行绑定。 - 示例:只给某应用的CI/CD系统赋予在特定命名空间内
create和updateDeployment的权限,而非整个集群。
-
API Server 安全
- 启用TLS:确保API Server使用经过CA签名的证书进行通信。
- 禁用匿名访问:设置
--anonymous-auth=false。 - 审计日志:开启审计日志(
--audit-policy-file),记录敏感操作(如创建Pod、访问Secret)。
Pod 安全标准(Pod Security Standards, PSS)
这是Kubernetes官方推荐用来取代PodSecurityPolicy(PSP,已在1.21弃用)的方案,通过准入控制器生效。
-
三种安全级别
- Privileged(特权级):无限制,通常只用于系统级组件(如Ingress Controller、CNI)。
- Baseline(基线级):默认安全配置,禁止已知的提权行为。
- Restricted(严格级):最高限制,遵循Pod加固最佳实践,适用于大多数业务应用。
-
实施方式
- 命名空间标签:为命名空间添加标签来定义策略。
apiVersion: v1 kind: Namespace metadata: name: my-workloads labels: # 在该命名空间下,Pod必须满足Restricted级别 pod-security.kubernetes.io/enforce: restricted - 策略模式:
enforce:强制执行,拒绝不符合的Pod。audit:记录审计事件,但不拒绝。warn:向用户发出警告。
- 命名空间标签:为命名空间添加标签来定义策略。
网络安全策略(NetworkPolicy)
默认情况下,Kubernetes允许所有Pod之间的通信,NetworkPolicy用于实现流量隔离。
-
基本规则
- 默认拒绝:如果没有匹配到任何NetworkPolicy,则拒绝所有入站/出站流量。
- 白名单:只允许明确指定的流量通过。
-
配置示例
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend namespace: my-app spec: podSelector: matchLabels: app: backend # 目标Pod是backend policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: frontend # 只允许来自frontend Pod的流量 ports: - port: 8080 egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system # 只允许访问kube-system内的DNS ports: - port: 53 protocol: UDP- 注意:你的集群网络插件(如Calico、Cilium、Weave)必须支持NetworkPolicy。
容器与Pod运行时的安全配置
这些配置通常在Pod的securityContext中设置。
-
只读根文件系统
- 将容器的根文件系统设置为只读,强制将所有写入数据挂载到临时或持久卷。
securityContext: readOnlyRootFilesystem: true
- 将容器的根文件系统设置为只读,强制将所有写入数据挂载到临时或持久卷。
-
禁止特权容器
securityContext: allowPrivilegeEscalation: false privileged: false capabilities: drop: ["ALL"] # 删除所有内核能力,然后按需添加 -
以非root用户运行
securityContext: runAsNonRoot: true runAsUser: 1000 # 显式指定用户ID
镜像与供应链安全
- 使用私有镜像仓库:通过
imagePullSecrets拉取镜像,避免使用公共仓库中存在漏洞的镜像。 - 容器镜像扫描:结合Trivy、Clair等工具,在CI/CD流水线中扫描镜像,阻止有高危漏洞的镜像部署。
- ImagePolicyWebhook:配置准入控制器,只允许来自受信仓库的镜像运行。
机密管理与Secrets加密
-
使用Secret而非ConfigMap存储敏感信息:Secret仅被Base64编码(不是加密),因此需要额外措施。
-
加密静态数据:在集群中启用 EncryptionConfiguration,对etcd中的Secret进行AES-GCM等算法加密。
# 在API Server配置中启用 apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - aescbc: keys: - name: key1 secret: c2VjdXJl... # 你的加密密钥 - identity: {} -
外部Secrets管理:使用External Secrets Operator或Sealed Secrets,将Secret管理职责从K8s集群内转移到外部Vault、AWS Secrets Manager等。
服务网格与零信任网络(进阶)
如果需要更细粒度的安全控制(如mTLS、服务间身份认证),可以考虑服务网格:
- Istio / Linkerd:启用mTLS,强制所有服务间的通信都经过TLS加密和双向身份验证。
- 证书管理:使用 cert-manager 自动签发和轮换TLS证书。
推荐的基线配置清单
| 策略名称 | 配置方式 | 建议级别 |
|---|---|---|
| RBAC | 角色绑定 | 必须 |
| 禁止匿名访问 | API Server参数 | 必须 |
| Pod安全标准(PSS)Restricted | 命名空间标签 + 准入控制器 | 强烈建议 |
| 只读根文件系统 | Pod Spec securityContext |
建议 |
| 禁止特权容器且丢弃所有Capabilities | Pod Spec securityContext |
强烈建议 |
| 以非root运行 | Pod Spec securityContext |
强烈建议 |
| 默认拒绝网络策略 | NetworkPolicy | 建议 |
| 镜像签名/扫描 | CI/CD + 准入控制器 | 建议 |
| etcd静态加密 | EncryptionConfiguration | 必须(生产环境) |
实施顺序建议:先通过RBAC和认证审计锁定集群大门,再通过PSS限制Pod行为,最后用NetworkPolicy隔离网络流量。