Agente · dev-core
Agente · dev-core
Proposito
Desarrollo y mantenimiento del modulo core/ — autenticacion, usuarios, organizaciones, permisos, credenciales, middleware y configuracion SaaS. Es la base sobre la que operan todos los demas modulos.
Estructura de archivos
core/
├── models.py # 10 modelos (440 LOC)
├── api.py # API principal: 8 routers, ~45 endpoints (1049 LOC)
├── auth_api.py # WebAuthn/Passkey endpoints (357 LOC)
├── credential_api.py # Credential Store API (263 LOC)
├── htmx_views.py # Vistas HTMX para templates (698 LOC)
├── signals.py # Audit signals: login, logout, welcome email
├── email_service.py # Welcome email via Resend
├── module_registry.py # Mapa URL → modulo SaaS requerido
├── workspace_api.py # Endpoints para el workspace
├── middleware/
│ ├── rate_limit.py # Rate limiting per-IP + per-tenant
│ ├── module_gating.py # Acceso por modulo contratado
│ ├── impersonation.py # Suplantacion de superusuario
│ ├── tenant_rls.py # Row-Level Security PostgreSQL
│ ├── csp.py # Content Security Policy
│ ├── payload_budget.py # Limite de tamano de request
│ └── tenant_metrics.py # Metricas por tenant
└── management/commands/
├── finops_report.py # Informe FinOps
└── perf_review.py # Informe rendimiento
Modelos (10)
| Modelo | Proposito | FK/M2M clave |
|---|
| SaaSModule | Catalogo de modulos contratables | — |
| Plan | Planes de suscripcion (Starter/Pro/Custom) | M2M → SaaSModule |
| Organization | Tenant raiz — config, plan, limites, soft-delete | FK → Plan, M2M → SaaSModule |
| User | Usuario (extiende AbstractUser) | FK → Organization |
| SystemLog | Auditoria de acciones (auth, racks, system) | FK → User, FK → Organization |
| ScriptTemplate | Plantillas de scripts de red | FK → Organization, FK → User |
| ImpersonationLog | Registro de suplantacion | FK → User (admin), FK → User (target) |
| ModulePermission | Permisos granulares por usuario (JSON) | OneToOne → User |
| TemporaryAccess | Elevacion temporal de privilegios (1-72h) | FK → User, FK → User (granted_by) |
| StoredCredential | Credenciales encriptadas (SNMP/SSH/HTTP) | FK → Organization, FK → User |
| LoginLog | Historial de login (exito/fallo, IP, metodo) | FK → User |
Relaciones clave
Plan ──M2M──> SaaSModule
Organization ──FK──> Plan
Organization ──M2M──> SaaSModule (extra_modules)
User ──FK──> Organization
SystemLog ──FK──> User, Organization
StoredCredential ──FK──> Organization
ModulePermission ──1:1──> User
TemporaryAccess ──FK──> User
LoginLog ──FK──> User
API Endpoints (~45)
Users (/api/users/)
| Metodo | Path | Auth | Proposito |
|---|
| GET | /api/users/ | Admin | Listar usuarios de la organizacion |
| POST | /api/users/ | Admin | Crear usuario |
| PUT | /api/users/{id} | Admin/Self | Actualizar password/rol |
| DELETE | /api/users/{id} | Admin | Eliminar usuario |
| GET | /api/users/mfa-status | Admin | Listar usuarios con estado MFA |
| GET | /api/users/me/mfa | Auth | Mis dispositivos MFA |
| GET | /api/users/{id}/mfa | Admin | Dispositivos MFA de un usuario |
| DELETE | /api/users/{id}/mfa/{auth_id} | Admin | Eliminar dispositivo MFA |
Settings (/api/settings/)
| Metodo | Path | Auth | Proposito |
|---|
| GET | /api/settings/company | Auth | Nombre, direccion, logo |
| PUT | /api/settings/company | Admin | Actualizar datos empresa |
| POST | /api/settings/company/logo | Admin | Subir logo (PNG/JPEG/SVG) |
| GET | /api/settings/session-timeout | Auth | Timeout de sesion |
| PUT | /api/settings/session-timeout | Admin | Cambiar timeout |
| POST | /api/settings/onboarding/complete | Auth | Marcar onboarding completado |
| POST | /api/settings/onboarding/reset | Auth | Reset del wizard |
Status y Search (/api/status/, /api/search)
| Metodo | Path | Auth | Proposito |
|---|
| GET | /api/status/ | Auth | Contadores: racks, devices, blueprints, users |
| GET | /api/status/health | Auth | Health check (DB + storage) |
| GET | /api/status/version | Auth | Version + release date |
| GET | /api/status/racks-summary | Auth | Resumen optimizacion racks |
| GET | /api/status/blueprints-stats | Auth | Estadisticas blueprints |
| GET | /api/search?q=query | Auth | Busqueda global (racks, devices, blueprints) |
Admin (/api/admin/)
| Metodo | Path | Auth | Proposito |
|---|
| POST | /api/admin/impersonate/start | Superuser | Iniciar suplantacion |
| POST | /api/admin/impersonate/stop | Superuser | Detener suplantacion |
| GET | /api/admin/permissions/{id} | Admin | Ver permisos efectivos |
| PUT | /api/admin/permissions/{id} | Admin | Establecer overrides |
| POST | /api/admin/permissions/{id}/reset | Admin | Resetear a defaults del rol |
| POST | /api/admin/temporary-access/grant | Admin | Conceder acceso temporal |
| POST | /api/admin/temporary-access/{id}/revoke | Admin | Revocar acceso temporal |
Logs (/api/logs/, /api/login-history/)
| Metodo | Path | Auth | Proposito |
|---|
| GET | /api/logs/data | Admin | Ultimos 500 logs del sistema |
| GET | /api/logs/export | Admin | Exportar logs a CSV (1000) |
| GET | /api/login-history/ | Admin | Historial de login |
Auth — Passkeys (/auth/)
| Metodo | Path | CSRF | Proposito |
|---|
| GET | /auth/passkey-login-options | No | Opciones WebAuthn para login |
| POST | /auth/validate-and-setup-biometric | Si | Validar credenciales + generar challenge |
| POST | /auth/complete-biometric-setup | Si | Completar registro passkey + login |
Credentials (/api/credentials/)
| Metodo | Path | Auth | Proposito |
|---|
| GET | /api/credentials/ | Auth | Listar credenciales (metadata) |
| POST | /api/credentials/ | Admin | Crear credencial |
| PUT | /api/credentials/{id} | Admin | Actualizar credencial |
| DELETE | /api/credentials/{id} | Admin | Eliminar credencial |
| GET | /api/credentials/{id}/decrypt | Auth | Descifrar para auto-fill |
Otros
| Metodo | Path | Auth | Proposito |
|---|
| GET | /api/backup/latest | Admin | Descargar ultimo backup |
| POST | /api/signup/ | Publico | Registro self-service (org + user) |
| GET | /api/export/csv | Auth | Exportar inventario CSV |
Middleware Pipeline
Orden de ejecucion (despues de Django auth):
- ImpersonationMiddleware — Sustituye
request.user si hay sesion de suplantacion
- ModuleGatingMiddleware — Verifica que la org tiene el modulo activo para la URL
- RateLimitMiddleware — Dos capas: per-IP (sliding window) + per-tenant (plan-based)
- PayloadBudgetMiddleware — Limite de tamano de request
- TenantRLSMiddleware — Configura Row-Level Security de PostgreSQL
- CSPMiddleware — Inyecta headers Content-Security-Policy
- TenantMetricsMiddleware — Contadores Prometheus por tenant
Rate Limits
| Endpoint | Limite |
|---|
/api/auth/login | 5/min per IP |
/api/auth/register | 3/min per IP |
/api/blueprints/auto-plan | 10/min per IP |
/api/network/device/ | 30/min per IP |
| Per-tenant (Starter) | 60 req/min |
| Per-tenant (Pro) | 300 req/min |
| Per-tenant (Custom) | 1000 req/min |
Credential Store
Sistema unificado de credenciales encriptadas para Auto-Provision y SSH.
Tipos soportados
- SNMPv2c: community string
- SNMPv3: username, auth_protocol (MD5/SHA), auth_key, priv_protocol (DES/AES), priv_key
- SSH: username, password, enable_password
- HTTP: username, password
- Multi: combinacion de los anteriores en una sola credencial
Encriptacion
- Algoritmo: Fernet (AES-128-CBC + HMAC-SHA256)
- Campos encriptados: community, auth_key, priv_key, ssh_password, enable_password, http_password
- Campos en claro: usernames, protocols
StoredCredential.get_section(name) → descifra y devuelve dict de una seccion
Sistema de permisos
Jerarquia de roles
Superuser (is_superuser=True)
└── Admin (role='admin')
└── Operator (role='operator')
└── Readonly (role='readonly')
Permisos granulares (ModulePermission)
Formato JSON: {"scope": "level"}
Scopes: racks, blueprints, observatory, terminal, network, cns, itsm, fleet, users
Levels: none < view < edit < admin
Ejemplo: {"racks": "edit", "observatory": "view", "users": "none"}
Acceso temporal (TemporaryAccess)
- Duracion: 1-72 horas
- Auto-expira segun
expires_at
- Revocable manualmente
- No puede exceder nivel del que lo concede
- Registro completo en audit trail
Signals y auditoria
| Signal | Evento | Destino |
|---|
user_login_failed | Login fallido | SystemLog + LoginLog |
user_logged_in (allauth) | Login exitoso | SystemLog + LoginLog |
user_logged_out (allauth) | Logout | SystemLog |
post_save (User) | Nuevo usuario | email_service.send_welcome_email |
LoginLog campos
- timestamp, user, ip_address, user_agent, success, username_attempted, method
- Methods detectados: password, social, passkey, token
Docs relacionados
| Documento | Que cubre |
|---|
DATABASE_ARCHITECTURE.md | Modelos, ER, multi-tenancy, RLS |
PASSKEYS_AUTHENTICATION.md | WebAuthn flow, security fixes |
DJANGO_CONSOLE_GUIDE.md | Operaciones admin (orgs, users, plans) |
SUPERUSER_ADMIN_GUIDE.md | Jerarquia permisos, impersonation |
SECURITY_GUIDE.md | Auth, sessions, encryption, firewalls |
SECRET_ROTATION_PLAYBOOK.md | Rotacion de API keys y secrets |
Mantenido por: Claude (Anthropic) + Equipo CreaRack
Ultima actualizacion: 13-04-2026
Véase también
- [[concept—saas—multi-tenancy]] — modelo multi-tenancy con RLS
- [[concept—saas—module-gating]] — gating de módulos por plan SaaS
- [[entity—core—model—organization]] — modelo tenant principal del core
- [[entity—core—model—user]] — modelo de usuario multi-organización
- [[entity—core—model—plan]] — planes SaaS y módulos contratables
- [[entity—core—model—saasmodule]] — definición de módulos de producto
- [[entity—core—model—storedcredential]] — credenciales cifradas reutilizables
- [[crearack-tech—backend—passkeys-authentication]] — autenticación con passkeys