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, 企业网络架构, 安全实验室, 安全测试工具, 安全演示, 微隔离, 提示词工程, 策略决策点, 策略执行点, 网络分段, 网络安全, 网络模拟, 身份感知访问控制, 身份提供商, 软件定义网络, 逆向工具, 隐私保护, 零信任安全, 零信任网络架构, 靶场