Max-planck-Jr/Zero-Trust-Network-Architecture-ZTNA-

GitHub: Max-planck-Jr/Zero-Trust-Network-Architecture-ZTNA-

基于 Mininet 构建的完整零信任网络架构模拟环境,集成了 JWT 身份认证、OPA 策略引擎和微分段隔离,用于学习、研究和作品集展示。

Stars: 0 | Forks: 0

以下是一份**完整、经过润色、可用于生产环境的 `README.md`**,你可以直接将其放入你的 GitHub 仓库中。 它的结构像一个真正的专业作品集项目:包含清晰的概述、图表、设置、用法、故障排除、架构和学习成果。 你可以无需修改直接将其**复制粘贴为 README.md**。 # 🛡️ 使用 Mininet 模拟零信任网络架构 (ZTNA) *一个完全模拟的企业级零信任环境,用于学习、研究和作品集展示* ## 📌 概述 本项目使用 **Mininet**、**Open Policy Agent (OPA)**、**JWT 身份提供商 (IDP)**、**微分段工作负载** 以及自定义的 **策略执行点 (PEP)**,提供了一个**手把手、端到端的零信任网络架构 (ZTNA) 模拟**。 它重现了一个真实的企业场景: * 用户向 **Identity Provider (身份提供商)** 进行认证 * 他们获取反映以下信息的 JWT token: * **用户身份** * **组成员身份** * **设备态势**(受管 / 非受管) * **MFA 状态** * 每一个对应用程序的请求都流经 **身份感知 PEP** * PEP 验证 token 并通过 **OPA** 执行细粒度授权 * 工作负载被严格的 **微分段** 隔离 * 直接访问应用被**阻断**(零信任原则:“永不信任,始终验证”) 该实验环境非常适合: * 安全工程师 * 学习 ZTNA 的学生 * 红/蓝队成员 * 作品集展示 * 教授零信任概念 # 🏛️ 架构 ``` [ hUser1 ] [ hUser2 ] [ hBYOD ] [ hAdmin ] \ | | / [ sUsers ] / \ / \ / [ sCore ]--------- / \ \ / \ \ [ sDMZ ] [ sServers ] \ / | \ / \ \ [hPEP][hIDP][hOPA][hCRM] [hFinance] ``` ### 组件 | Component | Role | | -------------------- | -------------------------------------------- | | **hPEP** | Policy Enforcement Point (TLS Reverse Proxy) | | **hOPA** | Policy Decision Point (Open Policy Agent) | | **hIDP** | Identity Provider issuing JWTs + JWKS | | **hCRM** | Protected workloads (CRM app) | | **hFinance** | Protected workloads (Finance app) | | **hUser1/2** | Managed enterprise devices | | **hBYOD** | Unmanaged device (often blocked by policy) | | **hAdmin** | Administrator workstation | | **Mininet Switches** | sUsers, sDMZ, sServers, sCore | # ✨ 功能特性 ### 🔐 身份感知访问 * JSON Web Tokens (JWT) * 组、MFA 标志、设备信任态势 * 基于 JWKS 的签名验证 ### 🧠 策略引擎 (OPA) * 细粒度的 Rego 策略: * CRM 需要:Sales 组 + MFA + 受管设备 * Finance 需要:Finance 组 + MFA + 受管设备 ### 🚫 微分段 * 工作负载仅信任来自 PEP 的流量 * 用户无法直接访问工作负载 * 每台主机上严格的 iptables 规则 ### 🔒 启用 TLS 的 PEP * 自定义 Python 代理 * 终止 HTTPS * 仅在 OPA 允许的情况下转发流量 ### 🧪 包含测试流程 * 有效用户成功 * 错误的组被拒绝 * 缺少 MFA 被拒绝 * BYOD 设备被拒绝 * 直接访问服务器被阻断 # 📂 仓库结构 ``` ztna-mininet/ ├── topo_ztna.py # Mininet topology + service orchestration ├── services/ │ ├── pep_proxy.py # Identity-aware reverse proxy (PEP) │ ├── idp.py # JWT Identity Provider + JWKS │ └── apps/ │ ├── crm_app.py # CRM microservice │ └── finance_app.py # Finance microservice ├── policy/ │ ├── ztna.rego # OPA policy │ └── jwks.json # Public key for JWT verification ├── certs/ │ ├── pep.crt # TLS certificate │ └── pep.key └── scripts/ ├── setup_firewall.sh # Optional firewall debug utility └── tests_smoke.sh # Example test commands ``` # ⚙️ 前置条件 ### 安装 Mininet + Open vSwitch ``` sudo apt update sudo apt install -y mininet openvswitch-switch sudo systemctl enable --now openvswitch-switch ``` ### 安装 Python 依赖 ``` python3 -m pip install --upgrade pip pip3 install flask aiohttp pyjwt requests cryptography ``` ### 安装 OPA ``` curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_amd64_static chmod +x opa sudo mv opa /usr/local/bin/opa ``` ### 安装工具 ``` sudo apt install jq curl openssl -y ``` # 🔑 生成证书和密钥 ### 1. PEP 的 TLS 证书 ``` mkdir -p certs policy openssl req -x509 -newkey rsa:2048 -nodes \ -keyout certs/pep.key \ -out certs/pep.crt \ -days 365 \ -subj "/CN=pep.local/O=ZTNA Demo/C=BE" ``` ### 2. IDP JWT 签名密钥 ``` openssl genrsa -out policy/idp_private.pem 2048 openssl rsa -in policy/idp_private.pem -pubout -out policy/idp_public.pem ``` ### 3. 生成 OPA 使用的 JWKS ``` python3 scripts/generate_jwks.py # or the provided python snippet in README ``` # 🚀 运行实验 启动完整的 ZTNA 拓扑: ``` sudo mn -c # cleanup sudo python3 topo_ztna.py ``` 你将进入 Mininet CLI: ``` mininet> ``` # 🧪 测试所有内容(手动步骤) ## 1️⃣ 检查服务健康状况 ``` mininet> hOPA curl -s http://127.0.0.1:8181/health mininet> hIDP curl -s http://127.0.0.1:8080/.well-known/jwks.json | jq mininet> hUser1 curl -sk https://10.0.2.10:8443/healthz ``` 如果上述步骤正常工作,你的 ZTNA 基础设施即功能正常。 ## 2️⃣ 以 Sales 用户身份获取 JWT token ``` mininet> hUser1 curl -s \ "http://10.0.2.20:8080/token?user=alice&groups=Sales,Employee&device=managed&mfa=true" \ | jq -r .access_token ``` 将 token 复制到 **hUser1 的 shell 内部** 的一个变量中: ``` mininet> hUser1 bash hUser1# TKN= ``` ## 3️⃣ 访问 CRM(允许) ``` hUser1# curl -sk -H "Authorization: Bearer $TKN" https://10.0.2.10:8443/crm/ ``` ## 4️⃣ 访问 Finance(拒绝) ``` hUser1# curl -sk -H "Authorization: Bearer $TKN" https://10.0.2.10:8443/finance/ ``` OPA 应当正确拒绝访问。 ## 5️⃣ BYOD 设备(非受管)在任何地方都被拒绝 ``` mininet> hBYOD curl -s \ "http://10.0.2.20:8080/token?user=charlie&groups=Sales&device=unmanaged&mfa=true" \ | jq -r .access_token ``` 尝试访问 CRM/Finance → **被拒绝** ## 6️⃣ 直接服务器访问被阻断(微分段) ``` mininet> hUser1 curl -v --max-time 5 http://10.0.3.10:8001/ mininet> hUser1 curl -v --max-time 5 http://10.0.3.20:8002/ ``` 两者都应该**挂起或失败**。 # 🩺 故障排除 ## PEP 返回 “connection refused” 检查是否正在监听: ``` mininet> hPEP ss -ltnp | grep 8443 ``` 如果为空 → 检查日志: ``` mininet> hPEP tail -n 80 /tmp/pep.log ``` 常见原因: * 缺少 TLS 证书 * 缺少 Python 模块 * 端口已被占用 * 证书路径错误 ## OPA 拒绝有效 token 检查: ``` mininet> hOPA tail -n 80 /tmp/opa.log ``` 同时确保: * `policy/jwks.json` 与 **idp\_private.pem** 匹配 * OPA 启动时使用了 `-b policy/` ## Mininet 行为异常 始终进行清理: ``` sudo mn -c sudo pkill -f pep_proxy.py || true sudo pkill -f idp.py || true sudo pkill -f crm_app.py || true sudo pkill -f finance_app.py || true sudo pkill -f "opa run" || true ``` 然后重新启动。 # 🧩 学习成果 通过完成本实验,你将理解: * 零信任架构如何执行身份感知访问 * JWT 和 JWKS 在真实环境中如何工作 * OPA 等策略引擎如何评估声明 * 微分段如何防止横向移动 * 反向代理如何充当执行点 * 如何在模拟器中建模企业级 ZTNA 非常适合: ✔ 网络安全作品集 ✔ 教授零信任 ✔ 防御者和红队成员 ✔ 研究人员 ✔ 学生 # 🌟 下一步(高级扩展) 你可以将本实验扩展到更高级的主题: * 将 Python PEP 替换 → 搭配 OPA 的 Envoy Proxy (使用 `ext_authz`) * 在 PEP ↔ 工作负载之间添加 mTLS * 添加 SPIFFE/SPIRE 以实现工作负载身份 * 使用 Ryu 或 ONOS 添加 SDN 动态流 * 添加风险评分或设备认证 * 添加 SIEM 日志记录 # 📜 许可证 MIT — 免费学习、扩展和分享。
标签:IDP, JWT认证, Mininet仿真, OPA, PDP, PEP, PE 加载器, Rego策略语言, SDN, ZTNA, 企业网络架构, 安全实验室, 安全测试工具, 安全演示, 微隔离, 提示词工程, 策略决策点, 策略执行点, 网络分段, 网络安全, 网络模拟, 身份感知访问控制, 身份提供商, 软件定义网络, 逆向工具, 隐私保护, 零信任安全, 零信任网络架构, 靶场