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: 指定规则类型(如 IngressEgress)。
  • ingressegress: 定义流量规则。设置为空数组 [] 时,表示拒绝所有流量。
步骤 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 networkpolicy
    

    输出应显示 default-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 官方文档。

更多推荐