MartinZ18/Proyecto-Inventario-EGI

GitHub: MartinZ18/Proyecto-Inventario-EGI

面向理工大学实验室的设备库存管理系统,整合 FastAPI 后端、双数据库、AD 认证与 Kubernetes 零信任网络部署的完整全栈项目。

Stars: 0 | Forks: 0

# EGI 综合项目 — ITU 库存系统 面向理工大学 (ITU) 的实验室设备库存系统。包含口头答辩的小组综合项目。 ## 团队与职责 | 成员 | 层 | |---|---| | Backend | FastAPI + Python — API REST | | Frontend | HTML/JS/Bootstrap — Web 界面 | | 数据库 | SQL Server 2022 + MongoDB 7 — 模型与脚本 | | 安全与网络 | Kubernetes, NetworkPolicies, Active Directory, pfSense, CI/CD | ## 技术栈 | 层 | 技术 | |---|---| | API | Python 3.12 + FastAPI + SQLAlchemy | | Frontend | HTML + CSS + 原生 JS + Bootstrap 5 | | 关系型数据库 | SQL Server 2022 (`inventario_ubicaciones`) | | 文档型数据库 | MongoDB 7 (`inventario_componentes.computadoras`) | | 身份验证 | LDAP → Active Directory (`itu.local`) + JWT (HS256) | | 编排 | Minikube + Calico CNI (NetworkPolicies) | | CI/CD | GitHub Actions — LinuxEGI 上的 self-hosted runner | | 网关 | pfSense — NAT, DHCP relay, AD 身份验证 | ## 仓库结构 ``` . ├── backend/ FastAPI — código de la API │ ├── app/ Aplicación (routers, services, repos, models, schemas) │ ├── scripts-dev/ Seeds SQL/Mongo/LDAP para desarrollo local │ ├── Dockerfile │ ├── docker-compose.yml SQL Server + MongoDB + OpenLDAP (dev local) │ ├── requirements.txt │ └── .env.example │ ├── frontend/ Interfaz web — HTML/JS vanilla + Bootstrap 5 │ ├── index.html Login │ ├── listado.html Tabla de equipos │ ├── detalle.html Detalle completo de un equipo │ ├── formulario.html Alta / edición (solo Técnicos) │ ├── js/ api.js, login.js, listado.js, detalle.js, formulario.js │ └── css/ img/ │ ├── bases-de-datos/ Scripts de base de datos │ └── database/scripts/ │ ├── Script SQL Server 2022.sql Crea ubicacion_db con 5 tablas + seed │ └── inventario-db_mongo.js Crea inventario_db.componentes + seed │ ├── kubernetes/ Manifiestos del namespace "inventario" │ ├── 00-namespace.yaml │ ├── configmaps/ │ ├── deployments/ backend, frontend, mongo │ ├── services/ │ ├── external/ Endpoints hacia SQL Server y AD (VMs, no pods) │ └── network-policies/ 7 políticas zero-trust (00-06) │ ├── active-directory/ Scripts PowerShell — OUs, grupos, usuarios AD ├── pfsense/ Runbook + scripts PHP para configurar pfSense ├── sql-server-iis/ Runbook + scripts de firewall para SQL Server ├── iptables/ Reglas de firewall del host LinuxEGI (Minikube) ├── docker/frontend/ Dockerfile + nginx.conf para el frontend en K8s │ ├── infra/ Configuración de red dinámica │ ├── red.example.env Plantilla (committear) — copiar a red.local.env │ └── scripts/ detectar-red.*, generar-manifiestos.*, seed-mongo.sh │ ├── docs/ Documentación técnica │ ├── arquitectura.md Diagrama de componentes, flujo de autenticación │ ├── topologia-red.md Diagrama de red, 7 NetworkPolicies, matriz de puertos │ └── runbook-despliegue.md Orden end-to-end de despliegue (Fases 0-5) │ └── .github/workflows/ └── deploy.yml Pipeline CI/CD — build + deploy en Minikube ``` ## 本地启动(开发) ``` # 启动 SQL Server、MongoDB 和 OpenLDAP(使用 Docker) cd backend docker compose up -d # Python 环境 python -m venv venv venv\Scripts\activate # Windows pip install -r requirements.txt # 配置环境变量 cp .env.example .env # 编辑 .env:SQLSERVER_DB=inventario_ubicaciones # 初始 Seed # SQL Server:执行 bases-de-datos/database/scripts/Script SQL Server 2022.sql # 或 scripts-dev/ubicaciones_prueba.sql 用于快速开发 # MongoDB:mongosh < scripts-dev/componentes_prueba.js # 启动 API uvicorn app.main:app --reload --port 8000 # Swagger UI:http://localhost:8000/docs # 前端 # 直接在浏览器中打开 frontend/index.html ``` ## 在 Kubernetes 中部署 查看 [`docs/runbook-despliegue.md`](docs/runbook-despliegue.md) 以获取完整的流程 (阶段 0-5)。摘要: ``` # 复制网络模板并填入实验室的 IP cp infra/red.example.env infra/red.local.env # 使用解析后的 IP 生成 manifest bash infra/scripts/detectar-red.sh bash infra/scripts/generar-manifiestos.sh # 应用到集群(或使用来自 GitHub Actions 的 CI/CD pipeline) kubectl apply -f kubernetes/00-namespace.yaml kubectl apply -f kubernetes/configmaps/ kubectl apply -f kubernetes/_generated/external/ kubectl apply -f kubernetes/deployments/ kubectl apply -f kubernetes/services/ kubectl apply -f kubernetes/_generated/network-policies/ ``` `deploy.yml` 流水线将所有这一切自动化。需要安装在 LinuxEGI 上且带有 `minikube` 标签的 self-hosted runner,并配置好 GitHub Secrets (`JWT_SECRET`, `SQLSERVER_USER`, `SQLSERVER_PASSWORD`, `MONGO_ROOT_USER`, `MONGO_ROOT_PASSWORD`, `LDAP_BIND_PASSWORD`)。 ## API 端点 | 方法 | 路径 | 访问权限 | |---|---|---| | POST | `/auth/login` | 公开 | | GET | `/inventario/` | 需身份验证 | | GET | `/inventario/{id}` | 需身份验证 | | GET | `/inventario/ubicaciones` | 需身份验证 | | POST | `/inventario/equipos` | 仅限技术人员 | | PUT | `/inventario/equipos/{id}` | 仅限技术人员 | | DELETE | `/inventario/equipos/{id}` | 仅限技术人员 | | POST | `/inventario/componentes` | 仅限技术人员 | | PUT | `/inventario/componentes/{id}` | 仅限技术人员 | | DELETE | `/inventario/componentes/{id}` | 仅限技术人员 | | GET | `/health` | 公开(K8s health check) | ## 安全 — 零信任 NetworkPolicies 在 `inventario` namespace 中应用的 7 项策略: | 文件 | 效果 | |---|---| | `00-default-deny.yaml` | 默认拒绝所有流量 | | `01-allow-dns.yaml` | 允许 egress DNS → kube-dns | | `02-allow-frontend-ingress.yaml` | 允许 ingress :80 到 frontend | | `03-allow-frontend-egress.yaml` | 允许 frontend 的 egress → API :8000 | | `04-allow-backend-from-frontend.yaml` | 允许仅来自 frontend 的 ingress :8000 到 backend | | `05-allow-backend-egress.yaml` | 允许 backend 的 egress → MongoDB (pod) + SQL Server/AD (ipBlock) | | `06-allow-mongodb-from-backend.yaml` | 允许仅来自 backend 的 ingress :27017 到 MongoDB | ## 测试用户(Active Directory) | 用户 | 密码 | 角色 | |---|---|---| | `mgomez` | `Inventario!2025` | 技术人员(完整 CRUD) | | `clopez` | `Inventario!2025` | 技术人员(完整 CRUD) | | `jperez` | `Inventario!2025` | 教师(只读) | | `agarcia` | `Inventario!2025` | 教师(只读) | | `psanchez` | `Inventario!2025` | 学生(只读) | ## 团队成员 - Luciana Torres - tluciana893@gmail.com | - Brian Tomadin - tomadinbrian@gmail.com | - Franco Prolongo - franklinelcrack3@gmail.com | - Roberto Vildoza - Roberto.e.vildoza.25@gmail.com | - Agustina Zartmann - zartmann.agustina@gmail.com | - Martin Zamora - martin.zamora004@gmail.com |
标签:Active Directory, AV绕过, Checkov, FastAPI, Plaso, Terraform 安全, 前端Bootstrap, 多数据库架构, 子域名突变, 网络测绘, 自定义脚本, 请求拦截, 资产管理系统, 逆向工具