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, 可视化面板, 权限治理, 测试用例, 特权检测, 突变策略, 职责分离, 请求拦截, 身份与访问管理, 逆向工具