--- título: «Configuración del sistema» descripción: «Arquitectura de seguridad, configuración de aplicaciones y opciones de implementación» ---
Configuración del sistema
La configuración del sistema controla el comportamiento de toda la aplicación, los parámetros de seguridad y la configuración de implementación. En esta sección se tratan la arquitectura de seguridad, la configuración de la aplicación y los modelos de implementación alternativos.
Arquitectura de seguridad
Aptli utiliza un modelo de seguridad de cuatro capas con aplicación de renderización del lado del servidor (SSR):
Capa 1: Autenticación Quién eres: verifica la identidad del usuario antes de permitirle el acceso. - Inicio de sesión con contraseña (con requisitos de complejidad). - Proveedores de OAuth (GitHub, Google). - Autenticación de dos factores (TOTP). - Se requiere validación por correo electrónico. - Gestión de sesiones con caducidad. - Bloqueo permanente tras intentos fallidos.
Capa 2: Derechos de administrador (permisivos) Lo que PUEDE modificar - Concesiones de permisos explícitos. - Crear/actualizar/eliminar permisos por modelo - Superderechos: appSettingSchemasModify, adminRightsModify, viewDeleted - Limitado a acciones (se puede crear, pero no eliminar) - Predeterminado: acceso de solo lectura
Capa 3: Restricciones de roles (restrictivas) Lo que NO se puede ver - Filtros de datos a nivel de campo. - Filtros de modelo + campo + comparación + valor - Se aplican en el lado del servidor antes de la consulta a la base de datos - No se pueden eludir mediante llamadas a la API, exportaciones o capturas de pantalla - Se combinan múltiples restricciones (lógica AND)
Capa 4: Aplicación del renderizado del lado del servidor (SSR) a nivel de API - Los datos realmente no existen para los usuarios no autorizados. - Todas las consultas se filtran del lado del servidor (API del servidor Nuxt). - Se aplican restricciones de roles antes de la búsqueda en MongoDB. - No hay filtrado del lado del cliente (no se puede eludir). - La API devuelve un error 404 para los registros no autorizados (incluso si el atacante conoce el ID).
Por qué es importante el SSR: - Filtrado del lado del cliente: datos enviados al navegador, ocultos con JavaScript (se pueden eludir mediante herramientas de desarrollo). - Filtrado del lado del servidor: los datos nunca se envían a usuarios no autorizados (seguro).
Aptli utiliza SSR: los datos no autorizados nunca llegan al cliente.
Configuración de la aplicación
Página de configuración de la aplicación que muestra las opciones de configuración y los parámetros de seguridad
Acceso requerido: derecho de administrador appSettingSchemasModify
Navega a: Admin → Configuración de la aplicación
Configuración de autenticación
Dominios permitidos: - Lista de dominios de correo electrónico que pueden registrar cuentas - Ejemplo: ["company.com", "contractor.com"] - Solo los correos electrónicos de estos dominios pueden registrarse - Predeterminado: su dominio de implementación
Permitir registro: - true: los usuarios pueden registrarse por sí mismos si el dominio coincide. - false: el administrador debe crear las cuentas manualmente. - Predeterminado: false (acceso controlado).
Métodos de inicio de sesión activos: - Nombre de usuario/Contraseña (casilla de verificación) - GitHub OAuth (casilla de verificación) - Google OAuth (casilla de verificación) - Se debe habilitar al menos un método - Predeterminado: solo nombre de usuario/contraseña
Requerir autenticación de dos factores: - true: todos los usuarios deben habilitar la autenticación de dos factores (2FA) (período de gracia configurable). - false: 2FA opcional. - Predeterminado: false.
Seguridad de la sesión
Número máximo de intentos de inicio de sesión: - Número de intentos fallidos antes del bloqueo definitivo - Rango válido: 3-10 intentos - Valor predeterminado: 5
Tiempo de cierre de sesión automático: - Tiempo de inactividad en segundos - La lectura/escritura de datos reinicia la cuenta atrás - Rango válido: 1 hora - 7 días - Valor predeterminado: 86400 (1 día)
Caducidad del token CSRF: - Tiempo de espera de la sesión del servidor en minutos - Obliga a volver a iniciar sesión independientemente de la actividad - Intervalo válido: 1 hora - 4 semanas - Valor predeterminado: 10080 (1 semana)
Caducidad de la sesión: - Duración máxima absoluta de la sesión - Se alinea con el token CSRF para usuarios de un solo dispositivo - Los usuarios de varios dispositivos pueden tener diferentes caducidades - Por defecto: 10080 minutos (1 semana)
Retención de datos
Retención de eliminación temporal: - Cuánto tiempo permanecen los registros eliminados temporalmente en la base de datos - Opciones: 30 días, 90 días, 1 año, indefinido - Predeterminado: 90 días - Se aplica a asignaciones, informes, usuarios, funciones (cuando se establece deletedAt)
Programa de compresión de versiones: - Frecuencia con la que se comprimen las versiones antiguas de las funciones - Opciones: semanal, mensual, trimestral - Predeterminado: mensual - Las versiones comprimidas siguen siendo reconstruibles (compresión sin pérdida).
Historial de transacciones: - Las transacciones de inventario nunca se eliminan (registro de auditoría inmutable). - Se pueden archivar en una base de datos independiente (configuración avanzada).
Valores predeterminados para nuevos usuarios
Roles para nuevos usuarios: - Matriz de ID de roles asignados automáticamente - Matriz vacía = sin restricciones automáticas - Predeterminado: [] (el administrador los asigna manualmente)
Derechos de administrador para nuevos usuarios: - Objeto con concesión de permisos - Objeto vacío = acceso solo para lectura - Predeterminado: {} (sin permisos de escritura)
Ejemplos de configuraciones:
Valores predeterminados del trabajador de campo: json { "roles": ["field_worker_role_id"], "adminRights": { "reportsCreate": true } }
Valores predeterminados del coordinador de oficina: json { "roles": [], "adminRights": { "assignmentsCreate": true, "ordersCreate": true, "stockItemsView": true } }
Implementación autohospedada
Aptli admite la implementación autohospedada (requiere licencia en modo autohospedado).
Modos de implementación
Modo SaaS (predeterminado): bash NUXT_REQUIRE_LICENSE=false - Sin validación de licencia - Aptli gestiona la infraestructura - Actualizaciones automáticas - Asistencia profesional incluida
Modo autohospedado: bash NUXT_REQUIRE_LICENSE=true NUXT_LICENSE_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----..." - Se requiere validación de la licencia - El cliente gestiona la infraestructura - Actualizaciones manuales (se sustituye la carpeta .output) - Se requiere la clave de licencia de Aptli
Sistema de licencias
Cómo funciona: 1. Implemente la carpeta .output/ en su servidor. 2. El servidor genera un ID de implementación único (huella digital del hardware + nombre de host). 3. El periodo de prueba de 30 días comienza automáticamente. 4. Envíe el ID de implementación por correo electrónico a [email protected].
5. Aptli genera una licencia JWT con los ID de implementación autorizados. 6. Actívela a través de la página /admin/license o la variable de entorno NUXT_LICENSE_KEY.
Implementación múltiple: - Cada servidor tiene un ID de implementación único - La licencia incluye una lista de todos los ID de implementación autorizados - No se puede clonar el servidor sin una nueva licencia - Impide la distribución no autorizada
Validación de la licencia: - Se comprueba al iniciar el servidor. - Si la licencia no es válida, la aplicación no se iniciará. - Si la versión de prueba caduca, se mostrará una advertencia durante 7 días y, a continuación, se bloqueará. - Renovación de la licencia por correo electrónico.
Variables de entorno (autoalojadas)
Requisitos: bash NUXT_MONGODB_URI=mongodb://localhost:27017/aptli NUXT_SESSION_PASSWORD=min-32-char-random-string
Opcional - OAuth:bash NUXT_OAUTH_GITHUB_CLIENT_ID=... NUXT_OAUTH_GITHUB_CLIENT_SECRET=... NUXT_OAUTH_GOOGLE_CLIENT_ID=... NUXT_OAUTH_GOOGLE_CLIENT_SECRET=...
Opcional - Correo electrónico: bash NUXT_RESEND_API_KEY=... [email protected]
Opcional - Escaneo de archivos: bash NUXT_ENABLE_FILE_SCAN=true NUXT_CLAMAV_HOST=localhost NUXT_CLAMAV_PORT=3310
Opcional - Licencia: bash NUXT_REQUIRE_LICENSE=true NUXT_LICENSE_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----..." NUXT_LICENSE_KEY=eyJhbGc... (auto-activate)
Requisitos de infraestructura
Mínimo: - 2 núcleos de CPU - 4 GB de RAM - 20 GB de almacenamiento (aumenta con los datos) - MongoDB 5.0+ - Node.js 20+
Recomendado: - 4 núcleos de CPU - 8 GB de RAM - 100 GB de almacenamiento SSD - Conjunto de réplicas MongoDB (alta disponibilidad) - Equilibrador de carga (escalado horizontal)
Servicios opcionales: - Daemon ClamAV (escaneo de archivos) - Redis (almacenamiento en caché de sesiones - mejora del rendimiento) - Servidor SMTP (notificaciones por correo electrónico)
Pasos de implementación
- Compilar la aplicación:
bash npm run build - Copiar salida:
bash scp -r .output/ user@server:/aptli/ - Establecer variables de entorno: Crear
/aptli/.envcon las variables necesarias. - Iniciar el servidor:
bash cd /aptli/.output node server/index.mjs - Activar licencia: - Vaya a
https://your-domain/admin/license- Copie el ID de implementación - Envíe un correo electrónico a [email protected] - Pegue la clave de licencia recibida - Haga clic en «Activar» - Configurar el proxy inverso: Nginx/Apache para el puerto proxy 3000 → HTTPS
- Configurar el gestor de procesos: PM2 o systemd para mantener el servidor en funcionamiento.
Actualizaciones (autohospedadas)
Proceso de actualización manual: 1. Copia de seguridad de la base de datos: mongodump
2. Copia de seguridad del archivo .env 3. Descarga de la nueva carpeta .output/ desde Aptli 4. Detener el servidor: pm2 stop aptli 5. Reemplazar la carpeta .output/ 6. Restaurar el archivo .env 7. Iniciar el servidor: pm2 start aptli 8. Verificar: comprobar la versión en /admin/license
Aptli proporciona: - Notas de la versión con cambios importantes - Scripts de migración (si hay cambios en la base de datos) - Instrucciones de reversión - Asistencia profesional durante las actualizaciones
Mejores prácticas de seguridad
SSL/TLS requerido: - Utilizar HTTPS en producción (no HTTP) - Certificados gratuitos: Let's Encrypt - Rechazar conexiones HTTP (redirigir a HTTPS)
Configuración del cortafuegos: - Permitir: HTTPS (443), SSH (22) - Denegar: puerto MongoDB (27017) desde Internet público - Restringir: páginas de administración a VPN o lista blanca de IP
Seguridad de la sesión: - NUXT_SESSION_PASSWORD - mínimo 32 caracteres aleatorios - Rotación trimestral de la contraseña de sesión - Caducidad de sesión corta para entornos de alta seguridad
Seguridad de la base de datos: - Autenticación MongoDB habilitada - Credenciales de usuario independientes (no root) - Conexiones cifradas (MongoDB TLS) - Copias de seguridad periódicas (automatizadas, restauración probada)
Secretos de OAuth: - Almacenarlos en variables de entorno (no en código). - Rotarlos trimestralmente. - Revocar las aplicaciones OAuth que no se utilicen.
Seguridad en la carga de archivos: - Escaneo ClamAV habilitado en producción - Límites de tamaño de archivo aplicados - Tipos de archivo permitidos restringidos - Cuarentena de almacenamiento para archivos sospechosos
Supervisión: - Intentos fallidos de inicio de sesión (detección de fuerza bruta) - Fallos de autorización (detección de intentos de acceso no autorizado) - Patrones inusuales de uso de la API - Fallos de conexión a la base de datos
Consideraciones sobre el cumplimiento normativo
Residencia de datos: El modo autohospedado permite controlar la ubicación de los datos: - Alojamiento en una región geográfica específica - Cumplimiento de los requisitos normativos (RGPD, HIPAA, etc.) - Control físico del acceso a los datos
Registro de auditoría: Aptli mantiene registros de auditoría para: - Intentos de autenticación (éxitos/fracasos) - Uso de derechos de administrador (quién modificó qué) - Cambios en las restricciones de roles - Historial de transacciones (movimientos de inventario) - Historial de versiones (cambios en las funciones) - Eliminaciones temporales (quién eliminó qué y cuándo)
Exportación de datos: Todos los datos se pueden exportar para cumplir con la normativa: - Exportación CSV para datos no geográficos - Exportación GeoJSON para características (mediante el botón «Transferencia de datos» de la barra de herramientas del mapa) - Informes de transacciones (auditoría de inventario) - Registros de acceso de usuarios
Retención de datos: Políticas de retención configurables: - Período de retención de eliminación temporal - Compresión de versiones (sin pérdida) - Historial de transacciones (inmutable, nunca se elimina) - Registros de auditoría (archivo configurable)