| name | implementing-network-policies-for-kubernetes |
| description | 通过配置 Kubernetes NetworkPolicy 资源实施 Pod 级别的网络分段,强制执行最小权限通信并限制集群内的横向移动(Lateral Movement)。 |
| domain | cybersecurity |
| subdomain | network-security |
| tags | ["kubernetes","network-policy","microsegmentation","zero-trust","pod-security","calico","cilium","rbac"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
为 Kubernetes 实施网络策略
概述
Kubernetes NetworkPolicy(网络策略)是实现集群内 Pod 间通信安全的原生机制。通过定义精细的入站(Ingress)和出站(Egress)规则,可以强制执行最小权限原则并防止横向移动(Lateral Movement)。本技能涵盖默认拒绝(Default Deny)模式的实施、应用特定策略配置、跨命名空间隔离以及出站限制,使用 Calico、Cilium 或 Antrea 等 CNI 插件。
前置条件
- 已运行的 Kubernetes 集群(1.20+)
- 支持 NetworkPolicy 的 CNI 插件(Calico、Cilium、Antrea 或 Weave)
- kubectl CLI 工具,具有集群管理权限
- 了解 Kubernetes Pod、Namespace、Label 和 Selector 的基本概念
- 集群中已部署应用(用于测试策略)
核心概念
策略类型
| 类型 | 说明 | 用途 |
|---|
| Ingress(入站) | 控制到 Pod 的入站流量 | 限制哪些来源可以访问 Pod |
| Egress(出站) | 控制从 Pod 发出的流量 | 限制 Pod 可以访问哪些目标 |
| 默认拒绝 | 隐式拒绝所有未匹配流量 | 零信任(Zero Trust)基础 |
选择器类型
- podSelector - 根据 Label 匹配同一命名空间中的 Pod
- namespaceSelector - 匹配整个命名空间中的 Pod
- ipBlock - 基于 CIDR 范围匹配外部 IP
CNI 插件支持
| 插件 | NetworkPolicy | 扩展策略 | eBPF |
|---|
| Calico | 是 | GlobalNetworkPolicy | 否 |
| Cilium | 是 | CiliumNetworkPolicy | 是 |
| Antrea | 是 | ClusterNetworkPolicy | 否 |
| Weave | 是 | 否 | 否 |
实施步骤
步骤 1:验证 CNI 插件支持
kubectl get pods -n kube-system | grep -E "calico|cilium|antrea|weave"
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-policy
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
EOF
kubectl delete networkpolicy test-policy
步骤 2:为每个命名空间实施默认拒绝策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
for ns in production staging default; do
kubectl apply -f default-deny-all.yaml -n $ns
done
kubectl get networkpolicies --all-namespaces
步骤 3:允许必要的 DNS 出站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns-egress
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
步骤 4:配置应用特定策略
三层应用(前端 → 后端 → 数据库)示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: frontend-policy
namespace: production
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
ports:
- protocol: TCP
port: 443
- protocol: TCP
port: 80
egress:
- to:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 8080
-
步骤 5:配置跨命名空间策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-monitoring-scrape
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
podSelector:
matchLabels:
app: prometheus
ports:
- protocol: TCP
port: 9090
- protocol: TCP
port: 8080
kubectl label namespace monitoring kubernetes.io/metadata.name=monitoring
步骤 6:实施出站限制
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-egress-restrict
namespace: production
spec:
podSelector:
matchLabels:
app: backend-service
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
tier: database
ports:
- protocol: TCP
port: 5432
- to:
- ipBlock:
cidr: 10.0.0.0/8
except:
- 10.0.10.0/24
ports:
- protocol: TCP
port: 443
步骤 7:阻断云元数据端点访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: block-cloud-metadata
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 169.254.169.254/32
- 100.100.100.200/32
监控与验证
测试策略
kubectl exec -it frontend-pod -n production -- curl http://backend-service:8080
kubectl exec -it frontend-pod -n production -- curl http://database-service:5432
kubectl exec -it test-pod -- nc -zv backend-service 8080
查看策略
kubectl get networkpolicies --all-namespaces
kubectl describe networkpolicy backend-policy -n production
kubectl get networkpolicy -n production -o yaml
最佳实践
- 先默认拒绝 - 从拒绝所有流量开始,然后根据需要开放
- 按命名空间隔离 - 为每个环境(生产、暂存)使用独立命名空间
- 精确使用 Label - 为策略选择器设计一致的 Label 命名规范
- 始终允许 DNS - 不要忘记在出站策略中开放 UDP 53 端口
- 测试再部署 - 在非生产环境中验证策略
- 版本控制策略 - 将所有 NetworkPolicy YAML 存入 Git 仓库
- 监控流量 - 使用 CNI 插件的可观测性功能检测策略违规
参考资料