somaz94/network-policy-generator

GitHub: somaz94/network-policy-generator

一个基于 Kubernetes Operator 的网络策略自动化生成与管理工具,旨在通过学习真实流量简化并强化网络分段。

Stars: 4 | Forks: 0

# 网络策略生成器 ![Top Language](https://img.shields.io/github/languages/top/somaz94/network-policy-generator?color=green&logo=go&logoColor=b) ![Version](https://img.shields.io/github/v/tag/somaz94/network-policy-generator?label=version&logo=kubernetes&logoColor=white) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Go Report Card](https://goreportcard.com/badge/github.com/somaz94/network-policy-generator)](https://goreportcard.com/report/github.com/somaz94/network-policy-generator) ![Docker Pulls](https://img.shields.io/docker/pulls/somaz940/network-policy-generator?logo=docker&logoColor=white) ![GitHub Release](https://img.shields.io/github/release/somaz94/network-policy-generator?logo=github) ![GitHub Stars](https://img.shields.io/github/stars/somaz94/network-policy-generator?style=social) 一个 Kubernetes 控制器,它基于观察到的流量模式和用户定义的规则自动生成和管理 Kubernetes 网络策略。
## 描述 网络策略生成器是一个 Kubernetes Operator,它通过提供两种主要操作模式来简化网络策略的创建和管理: - **学习模式**:在指定持续时间内分析集群内的实际网络流量模式 - **强制执行模式**:基于学习到的模式或预定义规则自动生成和应用网络策略 此工具通过以下方式帮助安全团队和集群管理员更有效地实施网络分段: - 减少手动创建网络策略的开销 - 基于真实流量提供数据驱动的策略建议 - 支持允许式(permissive)和拒绝式(restrictive)策略方法 - 支持从学习阶段到强制执行阶段的渐进式过渡 - 通过 `policyEngine` 字段(`kubernetes`、`cilium`、`calico`)支持多种 CNI 后端 - 提供常见工作负载类型的内置策略模板(web-app、database、monitoring 等) - 在学习模式下从观察到的流量生成命名空间和规则建议 ### 关键特性 ![Pod Selector](https://img.shields.io/badge/Pod_Label_Selector-blue?logo=kubernetes&logoColor=white) ![CIDR Rules](https://img.shields.io/badge/CIDR_Rules-blue?logo=kubernetes&logoColor=white) ![Named Port](https://img.shields.io/badge/Named_Port-blue?logo=kubernetes&logoColor=white) ![Dry Run](https://img.shields.io/badge/Dry_Run-green?logo=kubernetes&logoColor=white) ![Policy Diff](https://img.shields.io/badge/Policy_Diff/Audit-green?logo=kubernetes&logoColor=white) ![Kubernetes](https://img.shields.io/badge/Kubernetes_NetworkPolicy-326CE5?logo=kubernetes&logoColor=white) ![Cilium](https://img.shields.io/badge/Cilium_NetworkPolicy-F8C517?logo=cilium&logoColor=black) ![Calico](https://img.shields.io/badge/Calico_NetworkPolicy-FF6D00?logo=kubernetes&logoColor=white) ![Policy Templates](https://img.shields.io/badge/Policy_Templates-teal?logo=kubernetes&logoColor=white) ![Learning Mode](https://img.shields.io/badge/Learning_Mode-orange?logo=kubernetes&logoColor=white) ![Event Recording](https://img.shields.io/badge/Event_Recording-purple?logo=kubernetes&logoColor=white) ![Prometheus Metrics](https://img.shields.io/badge/Prometheus_Metrics-E6522C?logo=prometheus&logoColor=white) ![Webhook Validation](https://img.shields.io/badge/Webhook_Validation-red?logo=kubernetes&logoColor=white) - **Pod 标签选择器** — 通过标签选择特定 Pod,而不是整个命名空间 - **CIDR 规则** — 为外部 IP 范围定义入口/出口规则(例如数据库、外部 API) - **命名端口支持** — 使用服务端口名称(`http`、`grpc`)而不是数字端口 - **干运行模式** — 在状态中预览生成的策略而不应用到集群 - **策略差异/审计** — 在状态中跟踪策略变更(Created/Updated)用于审计跟踪 - **事件记录** — 在策略应用、删除、模式转换和错误时发出 Kubernetes 事件 - **Prometheus 指标** — 自定义指标用于协调计数、持续时间、活动生成器和策略操作 - **Webhook 验证** — 准入 Webhook 用于 CRD 验证(通过 `--enable-webhooks` 标志启用,需要 cert-manager)
## 安装
### 先决条件 - Kubernetes v1.16+ - kubectl v1.11.3+ - 对于 Cilium 策略:Cilium CNI 在集群上安装 - 对于 Calico 策略:Calico CNI 在集群上安装
### 选项 1:Helm(推荐) **推荐:OCI 注册表(Helm 3.8+)** ``` # 单命令安装 — 无需添加 Helm 仓库 helm install npg oci://ghcr.io/somaz94/charts/network-policy-generator \ --version 0.3.0 \ --namespace npg-system --create-namespace ``` **替代:经典 Helm 仓库** ``` # 添加 Helm 仓库 helm repo add network-policy-generator https://somaz94.github.io/network-policy-generator/helm-repo helm repo update # 使用默认值安装 helm install npg network-policy-generator/network-policy-generator # 或使用自定义值安装 helm install npg network-policy-generator/network-policy-generator \ --set image.tag=v0.3.0 \ --set crds.cleanup=false \ --namespace npg-system --create-namespace ``` 有关完整的 Helm chart 选项,请参见 [Helm README](docs/HELM.md)。
### 选项 2:kubectl apply(快速安装) ``` kubectl apply -f https://raw.githubusercontent.com/somaz94/network-policy-generator/main/dist/install.yaml ```
### 选项 3:从源代码构建 ``` # 克隆仓库 git clone https://github.com/somaz94/network-policy-generator.git cd network-policy-generator # 安装 CRDs make install # 部署控制器 make deploy IMG=somaz940/network-policy-generator:v0.3.0 ```
### 验证安装 ``` # 检查控制器是否运行 kubectl get pods -n network-policy-generator-system # 检查 CRDs 是否已安装 kubectl get crd networkpolicygenerators.security.policy.io ```
## 快速开始 安装后,创建一个 `NetworkPolicyGenerator` 资源: ``` # 应用示例策略 kubectl apply -f config/samples/security_v1_networkpolicygenerator-deny.yaml # 检查状态 kubectl get networkpolicygenerator # 查看生成的 NetworkPolicies kubectl get networkpolicy -A ``` 可用的示例配置: - `security_v1_networkpolicygenerator-allow.yaml`:允许式策略示例 - `security_v1_networkpolicygenerator-deny.yaml`:拒绝式策略示例 - `security_v1_networkpolicygenerator.yaml`:学习模式示例 - `security_v1_networkpolicygenerator-pod-selector.yaml`:Pod 标签选择器示例 - `security_v1_networkpolicygenerator-cidr-rules.yaml`:基于 CIDR 的入口/出口规则 - `security_v1_networkpolicygenerator-named-port.yaml`:命名端口(`http`、`grpc`)示例 - `security_v1_networkpolicygenerator-dry-run.yaml`:干运行模式(预览但不应用) - `security_v1_networkpolicygenerator-full-features.yaml`:所有功能组合 - `security_v1_networkpolicygenerator-calico-deny.yaml`:Calico 拒绝策略 - `security_v1_networkpolicygenerator-calico-allow.yaml`:Calico 允许策略 - `security_v1_networkpolicygenerator-template-web-app.yaml`:Web 应用策略模板 - `security_v1_networkpolicygenerator-template-database.yaml`:数据库策略模板 - `security_v1_networkpolicygenerator-template-backend-api.yaml`:后端 API 策略模板 - `security_v1_networkpolicygenerator-template-monitoring.yaml`:监控策略模板 - `security_v1_networkpolicygenerator-cilium-deny.yaml`:Cilium 拒绝策略 - `security_v1_networkpolicygenerator-cilium-allow.yaml`:Cilium 允许策略 - `test-policy.yaml`:命名空间特定的策略示例 - `test.yaml`:用于验证的测试 Pod 和服务
## 卸载 ``` # Helm helm uninstall npg # kubectl kubectl delete -f https://raw.githubusercontent.com/somaz94/network-policy-generator/main/dist/install.yaml # 从源码安装 make undeploy make uninstall ```
## 使用示例
### 1. 允许式策略(默认拒绝) 创建一个默认拒绝所有流量、仅允许指定命名空间流量的策略: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: test-policy-generator-allow spec: mode: "enforcing" policy: type: "allow" # Default deny, explicit allow deniedNamespaces: # Namespaces to deny access from - "test-ns1" - "test-ns2" globalRules: - type: "allow" port: 80 protocol: TCP direction: "ingress" - type: "allow" port: 443 protocol: TCP direction: "egress" ```
### 2. 拒绝式策略(默认允许) 创建一个默认允许所有流量、仅拒绝指定命名空间流量的策略: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: test-policy-generator-deny spec: mode: "enforcing" policy: type: "deny" # Default allow, explicit deny allowedNamespaces: # Only these namespaces are allowed - "test-ns1" - "test-ns2" globalRules: - type: "allow" port: 80 protocol: TCP direction: "ingress" - type: "allow" port: 443 protocol: TCP direction: "egress" ```
### 3. 学习模式示例 在生成策略前分析指定时间段内的流量模式: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: traffic-learner spec: mode: "learning" duration: "1m" # Analyze traffic for 1 minute (use longer durations in production) policy: type: "deny" allowedNamespaces: - "test-ns1" - "test-ns2" deniedNamespaces: - "test-ns3" - "test-ns4" ```
### 4. 命名空间特定策略 对不同命名空间应用不同的策略: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: test-policy-generator-deny namespace: test-ns1 spec: mode: "enforcing" policy: type: "deny" allowedNamespaces: - "test-ns3" # Only test-ns3 can access test-ns1 globalRules: - type: "allow" port: 80 protocol: TCP direction: "ingress" ```
### 5. Pod 标签选择器 通过标签选择特定 Pod,而不是应用于整个命名空间: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: pod-selector-example spec: mode: "enforcing" policy: type: "deny" allowedNamespaces: - "kube-system" podSelector: app: nginx tier: frontend globalRules: - type: "allow" port: 80 protocol: TCP direction: "ingress" ```
### . 基于 CIDR 的规则 为外部 IP 范围定义入口/出口规则: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: cidr-rules-example spec: mode: "enforcing" policy: type: "deny" allowedNamespaces: - "kube-system" cidrRules: - cidr: "10.0.0.0/8" direction: "egress" protocol: TCP port: 5432 - cidr: "192.168.1.0/24" except: - "192.168.1.100/32" direction: "ingress" protocol: TCP port: 443 ```
### 7. 命名端口支持 使用服务端口名称而不是数字端口: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: named-port-example spec: mode: "enforcing" policy: type: "deny" allowedNamespaces: - "kube-system" globalRules: - type: "allow" namedPort: "http" protocol: TCP direction: "ingress" - type: "allow" namedPort: "grpc" protocol: TCP direction: "egress" ```
### 8. 干运行模式 在不应用策略的情况下预览生成的策略: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: dry-run-example spec: mode: "enforcing" dryRun: true policy: type: "deny" allowedNamespaces: - "kube-system" globalRules: - type: "allow" port: 80 protocol: TCP direction: "ingress" ``` 生成的策略以 JSON 形式存储在 `.status.generatedPolicies` 中,不会创建 NetworkPolicy 资源。
### 9. Calico NetworkPolicy 生成 Calico 原生的 `crd.projectcalico.org/v1` NetworkPolicy 资源: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: calico-deny-example spec: mode: "enforcing" policyEngine: "calico" policy: type: "deny" allowedNamespaces: - "kube-system" podSelector: app: web globalRules: - type: "allow" port: 80 protocol: TCP direction: "ingress" ``` Calico 策略使用选择器语法(`app == 'web'`),通过 `projectcalico.org/name` 进行命名空间选择,并包含自动 DNS 出口允许规则。
### 10. 策略模板 使用内置模板代替从头编写规则: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: template-web-app-example spec: mode: "enforcing" templateName: "web-app" policy: type: "deny" allowedNamespaces: - "kube-system" ``` 可用模板: | 模板 | 描述 | |------|------| | `zero-trust` | 拒绝所有流量,仅允许 DNS 出口 | | `web-app` | 允许 HTTP/HTTPS 入口,DNS 和 HTTPS 出口 | | `backend-api` | 允许 API 端口(8080、8443、9090)入口,HTTPS 出口 | | `database` | 允许数据库端口(3306、5432、6379、27017)入口,仅 DNS 出口 | | `monitoring` | 允许 Prometheus 抓取(9090、9100),HTTPS 出口 | 模板与用户定义的 `globalRules` 合并(用户规则优先于模板规则)。
### 11. 学习模式与建议 学习模式现在会根据观察到的流量生成命名空间和规则建议: ``` apiVersion: security.policy.io/v1 kind: NetworkPolicyGenerator metadata: name: traffic-learner-improved spec: mode: "learning" duration: "5m" policy: type: "deny" ``` 学习期结束后,检查建议: ``` # 查看从观察流量建议的命名空间 kubectl get networkpolicygenerator traffic-learner-improved -o jsonpath='{.status.suggestedNamespaces}' # 查看带观察计数的端口/协议规则建议 kubectl get networkpolicygenerator traffic-learner-improved -o jsonpath='{.status.suggestedRules}' ```
### 监控生成器状态 ``` # 查看所有 NetworkPolicyGenerator 资源 kubectl get networkpolicygenerator # 获取特定生成器的详细信息 kubectl describe networkpolicygenerator # 检查状态和观察流量(学习模式) kubectl get networkpolicygenerator -o yaml ```
## 测试 ``` # 单元测试 make test # 集成测试(自动检测 CNI 并运行匹配测试) make test-integration # Auto-detect CNI make test-integration ENGINE=kubernetes # Kubernetes only make test-integration ENGINE=cilium # Cilium only make test-integration ENGINE=calico # Calico only make test-integration ENGINE=all # Force all engines # Helm chart 测试(lint、安装、升级、策略测试、卸载) make test-helm # Auto-detect CNI make test-helm ENGINE=kubernetes # Kubernetes only make test-helm ENGINE=cilium # Cilium only make test-helm ENGINE=calico # Calico only make test-helm ENGINE=all # Force all engines ``` 有关详细的手动测试步骤和示例说明,请参见 [测试指南](docs/TESTING.md)。
## 文档 | 文档 | 描述 | |------|------| | [Helm Chart](docs/HELM.md) | Helm chart 安装、配置和 values 参考 | | [测试指南](docs/TESTING.md) | 单元测试、集成测试、Helm 测试和手动测试说明 | | [故障排除](docs/TROUBLESHOOTING.md) | 常见问题及解决方案 | | [版本更新](docs/VERSION_BUMP.md) | 发布新版本的检查清单 | | [贡献指南](CONTRIBUTING.md) | 如何贡献本项目 |
## 贡献 欢迎提交问题和 Pull Request。
## 许可证 本项目根据 Apache License 2.0 授权 - 详细信息请参见 [LICENSE](LICENSE) 文件。
标签:Calico, Cilium, CNI, EVTX分析, Go, Kubernetes Operator, NPM, Ruby工具, 基于观察的决策, 声明式配置, 安全策略, 开源安全工具, 微服务安全, 拒绝模式, 控制器, 提示词设计, 数据驱动安全, 日志审计, 流量学习模式, 渐进式策略迁移, 策略即代码, 策略强制执行, 策略模板, 网络分段, 网络流量分析, 网络策略, 网络隔离, 聊天机器人安全, 自动化策略生成, 自定义请求头, 许可模式, 逆向工程平台