02 - NetworkPolicy 与安全最佳实践
NetworkPolicy(网络策略)
默认情况下,K8s 中所有 Pod 可以互相通信。NetworkPolicy 实现网络级别的隔离。
前提:CNI 插件必须支持 NetworkPolicy(Calico、Cilium 支持,Flannel 不支持)。
基本示例
拒绝所有入站流量(默认拒绝)
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: production
spec:
podSelector: {} # 匹配所有 Pod
policyTypes:
- Ingress # 拒绝所有入站只允许特定来源访问
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-api
namespace: production
spec:
podSelector:
matchLabels:
app: api # 目标 Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 只允许 frontend Pod 访问
ports:
- protocol: TCP
port: 8080限制出站流量
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-egress
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
- to: # 允许 DNS 查询
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53安全最佳实践清单
镜像安全
- [ ] 使用可信的基础镜像
- [ ] 不使用
latest标签,锁定版本 - [ ] 定期扫描镜像漏洞(Trivy、Snyk)
- [ ] 使用私有镜像仓库
Pod 安全
- [ ] 不以 root 用户运行容器
- [ ] 设置只读根文件系统
- [ ] 禁止特权容器
- [ ] 设置资源限制
yaml
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 2000
containers:
- name: app
image: myapp
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
resources:
limits:
memory: "256Mi"
cpu: "500m"集群安全
- [ ] 启用 RBAC,遵循最小权限原则
- [ ] 使用 NetworkPolicy 隔离网络
- [ ] Secret 启用加密存储(Encryption at Rest)
- [ ] 审计日志开启
- [ ] 定期更新 K8s 版本
Secret 管理
- [ ] 不要把 Secret 提交到 Git
- [ ] 使用外部 Secret 管理(Vault、AWS Secrets Manager、阿里云 KMS)
- [ ] 限制 Secret 的 RBAC 访问
