Kubernetes 网络安全:配置 NetworkPolicy,限制 Pod 间的网络访问(默认拒绝)
·
Kubernetes 网络安全:配置 NetworkPolicy 实现默认拒绝所有 Pod 间网络访问
在 Kubernetes 中,默认情况下,所有 Pod 可以自由通信,这可能导致安全风险。通过配置 NetworkPolicy,您可以实现“默认拒绝所有网络访问”的策略,即拒绝所有 Pod 间的入口(Ingress)和出口(Egress)流量,除非明确允许。这有助于最小化攻击面,确保只有授权流量才能通过。下面我将逐步指导您完成配置过程。
前提条件
在开始前,请确保:
- Kubernetes 集群版本 >= 1.8(NetworkPolicy API 已稳定)。
- 网络插件支持 NetworkPolicy(如 Calico、Weave Net 或 Cilium)。如果未启用,请参考插件文档进行设置。
- 您有集群管理员权限(例如,使用
kubectl命令)。
步骤 1: 理解 NetworkPolicy 结构
NetworkPolicy 使用 YAML 文件定义,核心字段包括:
podSelector: 选择目标 Pod(例如,{}表示所有 Pod)。policyTypes: 指定规则类型(如Ingress和Egress)。ingress和egress: 定义流量规则。设置为空数组[]时,表示拒绝所有流量。
步骤 2: 创建默认拒绝所有流量的 NetworkPolicy
创建一个 YAML 文件(例如 default-deny-all.yaml),内容如下。此策略将应用到整个命名空间(或所有命名空间),拒绝所有 Pod 间的网络访问。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all # 策略名称
namespace: default # 指定命名空间(如需要应用到所有命名空间,需在每个命名空间创建)
spec:
podSelector: {} # 选择所有 Pod
policyTypes:
- Ingress # 启用入口规则
- Egress # 启用出口规则
ingress: [] # 拒绝所有入口流量
egress: [] # 拒绝所有出口流量
解释:
podSelector: {}:匹配当前命名空间中的所有 Pod。ingress: []和egress: []:空数组表示无允许规则,即拒绝所有流量。- 如果您想应用到特定命名空间,请设置
namespace字段;否则,此策略仅作用于创建它的命名空间。要应用到所有命名空间,需在每个命名空间重复此配置。
步骤 3: 应用 NetworkPolicy
使用 kubectl 命令应用策略:
kubectl apply -f default-deny-all.yaml
- 验证策略是否生效:
输出应显示kubectl get networkpolicydefault-deny-all状态为Active。
步骤 4: 测试默认拒绝效果
- 测试方法:创建一个测试 Pod(如
busybox),尝试访问其他 Pod 或外部服务。- 例如,运行:
kubectl run busybox --image=busybox -- sleep 3600 kubectl exec -it busybox -- ping <other-pod-ip> # 应失败 - 如果 ping 失败(提示超时或拒绝),表示默认拒绝已生效。
- 例如,运行:
- 注意:此时所有网络访问都被拒绝,包括 Pod 间通信和外部流量。您需要添加额外的 NetworkPolicy 来允许必要流量(见后续步骤)。
步骤 5: 添加允许规则(可选)
默认拒绝后,您可以根据需求添加允许特定流量的规则。例如,允许来自特定 Pod 的入口流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-specific-ingress
spec:
podSelector:
matchLabels:
app: my-app # 目标 Pod 标签
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend # 允许来自标签为 role=frontend 的 Pod
注意事项
- 性能影响:默认拒绝策略可能增加网络延迟,建议在测试环境验证后再部署到生产。
- 命名空间管理:如果集群有多个命名空间,需在每个命名空间应用此策略,或使用全局策略(取决于网络插件)。
- 监控和日志:使用工具如 Prometheus 或网络插件的日志功能监控流量,确保策略无误。
- 备份:在修改策略前,备份现有配置:
kubectl get networkpolicy -o yaml > backup.yaml。
通过以上步骤,您可以有效实现 Pod 间网络的默认拒绝策略,提升 Kubernetes 安全性。如果遇到问题,请检查网络插件支持或查阅 Kubernetes 官方文档。
更多推荐
所有评论(0)