JulianoVinceCampos/iam-governance-lab-web
GitHub: JulianoVinceCampos/iam-governance-lab-web
一个基于合成数据的只读IAM/IGA治理实验室,通过交互式仪表盘评估和报告职责分离、跨账户提权、生命周期残留及再认证风险。
Stars: 0 | Forks: 0
# iam-governance-lab
针对多账户合成数据的 IAM/IGA **只读**访问治理。引擎读取一个数据集,评估风险并进行报告;永远不会写入真实的身份存储。它配备了一个交互式 Web 仪表板和一个将场景持久化到数据库的编辑器。
它回答了真正的访问审查会提出的四个问题:
- **Segregation of Duties**:谁承担了有毒的职责组合,这来源于直接授权还是通过组嵌套继承?
- **Privilege reachability**:谁能*到达*敏感权限,跨越账户边界,以及确切的路径是什么?
- **Lifecycle (JML)**:哪些访问是职位变动的残留(privilege creep),属于离职者,还是处于休眠状态?
- **Recertification**:鉴于此,要撤销什么,按照最差情况优先,并附带可解释的分数?
刚接触 IAM、IGA、RBAC 或 ABAC?每个概念是什么、为什么在这里以及项目的意图都在 [docs/conceitos.md](docs/conceitos.md) 中。
## 目录
- [亮点](#destaques)
- [架构](#arquitetura)
- [如何运行](#como-rodar)
- [仪表板](#o-dashboard)
- [部署](#deploy)
- [测试与质量门禁](#testes-e-quality-gates)
- [项目结构](#estrutura-do-projeto)
- [文档](#documentação)
## 亮点
| 能力 | 交付内容 |
| --- | --- |
| 可追溯的 Findings | 每一次 SoD 违规都会指出两个 entitlements 以及带来它们的组链;每一次提权都会逐边打印出完整路径。 |
| 可解释的评分 | recertification 的 risk score 是一个有文档记录的、逐项列出的公式,而不是黑盒。 |
| 诚实的范围 | 模型不评估的内容(condition keys, SCPs, deny)在任何结论之前都已写明。 |
| RBAC 和 ABAC 并排 | 访问由两种真实的机制解析:组(RBAC)和属性(ABAC)。每个 finding 都会说明它来自哪一个,并且图会将一个涂成青色,另一个涂成蓝色。 |
| 场景编辑器 | 通过浏览器创建、编辑和删除对象;每次编辑都会经过验证,并立即重新计算 findings。 |
| 一键恢复 | 数据集存在于数据库中,并由 YAML 进行种子化;一个按钮可以重建一切,因此公共演示总是可以自我恢复。 |
| 容器部署 | 一个镜像,一个卷;通过 reverse proxy 在 DNS 后面使用 TLS 启动。 |
## 架构
上下文视图(完整的 C4 和时序图见
[docs/arquitetura.md](docs/arquitetura.md)):
```
flowchart LR
user([Analista / visitante]) -->|HTTPS| spa[Dashboard web]
spa -->|JSON| api[API FastAPI]
api -->|SQLAlchemy| db[(Banco SQLite / PostgreSQL)]
seed[/Seed YAML/] -->|semeia se vazio| api
api --> engines[["Engines: access, SoD,
reachability, JML, recert"]]
```
贯穿项目的三个决策:
- **Standing access 和 reachable access 是不同的概念。** SoD 和 recertification 使用 standing access(直接授权加上组的传递闭包)。Reachability 添加了 assume-role 边并计算通过提权获得的内容。将它们混淆会掩盖风险。
- **Trust 是按账户建模的。** 只有当 identity-based 端(entitlement 列出了 role)和 resource-based 端(role 信任该账户或 `*`)达成一致时,assume 边才存在,这反映了 `sts:AssumeRole`。
- **数据集在计算之前进行验证。** 不存在的引用、重复的 id 和嵌套循环会在加载时失败,因此损坏的数据集永远不会产生默默的错误 finding。
## 如何运行
需要 Python 3.11+。
```
python -m venv .venv
# Windows: .venv\Scripts\activate
# Unix: source .venv/bin/activate
pip install -e ".[dev]"
iamgov validate --data data # valida o dataset
iamgov scan --data data # headline metrics em JSON
iamgov report --data data --out out # gera governance.report.{json,md}
iamgov serve --data data # sobe API + dashboard em http://127.0.0.1:8000
```
在没有 `make` 的 Windows 上,直接使用 venv 中的 Python:`.venv\Scripts\python.exe -m iamgov.cli serve`。
在首次启动时,应用程序会创建一个 SQLite(`iamgov.db`)并使用 `data/` 中的 YAML 对其进行种子化。
## 仪表板
| 视图 | 内容 |
| --- | --- |
| 概览 | 标题卡片、按严重程度划分的 SoD、findings 图表以及跨账户提权路径。 |
| 权限图 | 整个访问图(Cytoscape.js)。选择一个 target 和一个 identity,点击 *Traçar caminho*,提权路由就会突出显示并逐步描述。 |
| SoD 违规 | 每次违规都带有匹配的来源以及在哪里修复(identity 或组)。 |
| Lifecycle (JML) | Privilege creep、orphaned access、dormancy 和 joiner gaps。 |
| Recertification | 撤销工作清单以及按 reviewer 划分的活动。 |
| Identities | 每个 principal 都带有状态和访问足迹,可过滤。 |
| 数据编辑器 | accounts、entitlements、groups、roles、identities 和 SoD 规则的 CRUD,具有完整性验证和**恢复默认设置**。 |
## 部署
单一容器;状态是卷中的一个 SQLite 文件,由嵌入的 YAML 进行种子化。
```
docker compose up --build # abre http://localhost:8000
```
对于公共 DNS,存储库提供了一个 Render 蓝图(`render.yaml`),可在 push 时自动部署。拓扑结构、从 commit 到上线的路径、环境变量以及仅对写入进行 auth 的选项在 [docs/deploy.md](docs/deploy.md) 中。
## 测试与质量门禁
```
ruff check src tests # lint
mypy # type check strict
pytest # testes de unidade + API
pip-audit # CVE conhecido nas dependências
semgrep scan --config p/python --config p/security-audit src # SAST
```
两层测试:一个在代码中组装并带有手动计算结果的最小数据集(引擎回归测试会在本地失败),以及锁定已发布数据集数字的断言(对 seed 的更改变得是有意的)。在测试之上还运行着两道安全防线:使用 Semgrep 和 CodeQL 的 SAST,以及使用 pip-audit 的依赖项审计,并由 Dependabot 开启版本提升的 PR。CI 在 Python 3.11 到 3.13 上运行质量门禁,构建镜像并将其推送以检查健康状态。详细信息在 [docs/ci-cd.md](docs/ci-cd.md) 中,策略在 [SECURITY.md](SECURITY.md) 中。
## 项目结构
```
src/iamgov/
model.py domínio tipado + integridade referencial
loader.py YAML -> Dataset com validação
access.py standing access com procedência (RBAC de grupo + ABAC de atributo)
sod.py detecção de segregation of duties
reachability.py grafo de acesso, caminhos de escalonamento, export Cytoscape
jml.py joiner / mover / leaver + privilege creep
recert.py risk score, worklist de revogação, campanhas
report.py agregação em JSON + Markdown
db.py persistência SQLAlchemy (SQLite / PostgreSQL)
store.py dataset editável em banco, validado ao vivo, restaurável
cli.py validate / scan / report / serve
api.py endpoints FastAPI (leitura + editor) + dashboard estático
web/ dashboard (index.html, styles.css, app.js)
data/ dataset sintético
tests/ testes de ground truth + testes de API
docs/ arquitetura, CI/CD, plano de ação, docs por engine
```
## 文档
| 文档 | 内容 |
| --- | --- |
| [conceitos.md](docs/conceitos.md) | 什么是 IAM、IGA、RBAC 和 ABAC,为什么它们在项目中以及意图 |
| [plano-de-acao.md](docs/plano-de-acao.md) | 开发的逐步操作,按顺序 |
| [arquitetura.md](docs/arquitetura.md) | C4(上下文、容器、组件)和时序图 |
| [ci-cd.md](docs/ci-cd.md) | 集成和交付周期以及安全门禁 |
| [deploy.md](docs/deploy.md) | 部署拓扑,它是如何组织和结构化的 |
| [SECURITY.md](SECURITY.md) | 安全策略和存储库的防御层 |
| [modelo-de-dominio.md](docs/modelo-de-dominio.md) | 实体以及它们如何关联 |
| [sod.md](docs/sod.md) | Segregation of duties |
| [reachability.md](docs/reachability.md) | 访问图和提权 |
| [jml.md](docs/jml.md) | Joiner/mover/leaver 和 privilege creep |
| [recertificacao.md](docs/recertificacao.md) | Risk score,逐项说明 |
| [limitacoes.md](docs/limitacoes.md) | 这不做什么 |
| [modelo-de-ameacas.md](docs/modelo-de-ameacas.md) | 它检测什么以及它假设什么 |
## 许可证
MIT。
标签:AV绕过, FastAPI, IGA, NetworkX, 可视化面板, 权限治理, 测试用例, 特权检测, 突变策略, 职责分离, 请求拦截, 身份与访问管理, 逆向工具