
Kubernetes 安全加固:2026 年生产级指南
在生产环境中运行 Kubernetes 意味着操作有史以来最复杂的分布式系统之一。默认配置针对快速入门进行了优化,而非安全性。本指南涵盖了每个生产集群所需的关键安全控制措施。
了解 Kubernetes 攻击面
在加固之前,了解您要保护的内容:
- API Server:控制平面的单一入口点——一旦被攻破,一切尽失
- etcd:存储包括密钥在内的所有集群状态——必须启用静态加密
- Kubelet:节点级代理,可能被利用进行容器逃逸
- 容器运行时:工作负载执行前的最后一层
真实世界的入侵几乎总是遵循相同的模式:暴露的服务 → 容器逃逸 → 横向移动到 API Server → 集群接管。

Pod 安全标准(PSS)
PSP 在 1.21 版本中被弃用,并在 1.25 版本中被移除。替代方案是 Pod 安全标准与 Pod 安全准入控制器:
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: v1.28
pod-security.kubernetes.io/warn: restricted
restricted 配置文件强制要求:
runAsNonRoot: true- 只读根文件系统
- 删除所有 capabilities
- 禁止特权提升
- 需要 Seccomp 配置文件
合规的 Pod 规范:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 10001
seccompProfile:
type: RuntimeDefault
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: [ALL]
RBAC:最小权限原则
kubectl get clusterrolebindings -o json | \
jq '.items[] | select(.roleRef.name == "cluster-admin") |
{name: .metadata.name, subjects: .subjects}'
创建最小权限的服务账户:
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-sa
namespace: production
automountServiceAccountToken: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-role
rules:
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["app-config"]
verbs: ["get"]

网络策略:零信任网络
# 默认拒绝所有流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
kind: NetworkPolicy
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
External Secrets Operator
切勿直接将敏感数据存储在 Kubernetes Secrets 中。使用 External Secrets Operator 与 AWS Secrets Manager 或 Vault:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets
kind: SecretStore
target:
name: db-credentials
data:
- secretKey: DB_PASSWORD
remoteRef:
key: prod/database/credentials
property: password

运行时安全:Falco
Falco 使用 eBPF 探针检测运行时异常行为:
- rule: Shell in Container
desc: A shell was spawned in a container
condition: >
container and spawned_process and shell_procs and
not proc.pname in (shell_binaries)
output: >
Shell spawned (user=%user.name container=%container.id
image=%container.image.repository shell=%proc.name)
priority: WARNING
OPA Gatekeeper 策略执行
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: requirelabels
spec:
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package requirelabels
violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("Missing required labels: %v", [missing])
}
安全检查清单
- etcd 使用 AES-GCM 静态加密
- API Server 禁用匿名认证
- 网络策略默认拒绝
- 强制 Pod 安全标准(restricted 配置文件)
- 所有密钥使用 External Secrets Operator
- 部署 Falco 进行运行时检测
- OPA Gatekeeper 进行策略执行
- 审计日志发送至 SIEM
- 定期 RBAC 审计
- CI/CD 中的镜像扫描(Trivy、Snyk)
Kubernetes 安全需要持续监控、定期审计,并关注影响集群组件的 CVE。