Kubernetes 安全最佳实践
一、前言
哥们,别整那些花里胡哨的。Kubernetes 安全不是小事,今天直接上硬货,教你如何加固你的 K8s 集群。
二、安全架构设计
1. 多层安全防护
| 层级 | 防护措施 | 实现方案 |
|---|---|---|
| 集群层 | RBAC 授权 | 最小权限原则 |
| 网络层 | 网络策略 | 零信任网络 |
| 容器层 | 镜像扫描 | 漏洞检测 |
| 运行时 | Pod 安全标准 | 限制特权容器 |
| 数据层 | 密钥管理 | Vault 集成 |
三、实战配置
1. RBAC 权限管理
yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: susu
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
2. 网络策略
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-traffic
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
3. Pod 安全标准
yaml
apiVersion: policy/v1
kind: PodSecurityPolicy
metadata:
name: restricted
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'
apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
seccomp.security.alpha.kubernetes.io/defaultProfileName: 'runtime/default'
apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
fsGroup:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
4. 镜像安全
bash
# 安装 trivy
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.49.1
# 扫描镜像
trivy image nginx:latest
# 集成到 CI/CD
cat > .gitlab-ci.yml << 'EOF'
image_scanning:
stage: test
script:
- trivy image --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
allow_failure: true
EOF
5. 密钥管理
yaml
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
name: app-secrets
namespace: default
spec:
type: kv-v2
mount: kv
path: secrets/app
refreshAfter: 1h
destination:
name: app-secrets
create: true
rolloutRestartTargets:
- kind: Deployment
name: app
四、安全监控
1. Audit 日志
yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["secrets", "configmaps"]
- level: Metadata
resources:
- group: ""
resources: ["pods", "services"]
2. 运行时监控
使用 Falco 监控异常行为:
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: falco
namespace: falco
spec:
selector:
matchLabels:
app: falco
template:
metadata:
labels:
app: falco
spec:
containers:
- name: falco
image: falcosecurity/falco:latest
securityContext:
privileged: true
volumeMounts:
- name: falco-config
mountPath: /etc/falco
volumes:
- name: falco-config
configMap:
name: falco-config
五、安全加固清单
-
集群配置
- 启用 RBAC
- 配置 NetworkPolicy
- 启用 PodSecurityPolicy
- 配置 Audit 日志
-
容器配置
- 使用最小基础镜像
- 启用镜像扫描
- 限制容器权限
- 配置资源限制
-
网络配置
- 启用 CNI 插件的网络策略
- 配置 Ingress 控制器
- 启用 TLS 加密
- 限制集群外访问
-
数据安全
- 使用 Secrets 管理敏感信息
- 集成外部密钥管理系统
- 配置持久化存储加密
六、常见安全问题
1. 特权容器
解决方案 :避免使用 privileged: true,使用 securityContext 限制权限。
2. 镜像漏洞
解决方案:定期扫描镜像,使用官方或经过验证的镜像源。
3. 网络暴露
解决方案:配置网络策略,限制 Pod 间通信。
4. 密钥泄露
解决方案:使用 Secrets 管理,避免硬编码敏感信息。
七、总结
Kubernetes 安全是一个持续的过程,不是一蹴而就的。按照本文的最佳实践,你可以显著提高集群的安全性,炸了!