Some checks failed
Build / Build Backend (push) Has been cancelled
Build / Build Mobile (TypeScript Check) (push) Has been cancelled
Lint / Lint Backend (push) Has been cancelled
Lint / Lint Mobile (push) Has been cancelled
Test / Backend E2E Tests (push) Has been cancelled
Test / Mobile Unit Tests (push) Has been cancelled
Build / Build Docker Image (push) Has been cancelled
- Add exports module with PDF/CSV/Excel generation - Add reports module for inventory analytics - Add POS integrations module - Add database migrations for exports, movements and integrations - Add GitHub Actions CI/CD workflow with Docker support - Add mobile export and reports screens with tests - Update epic documentation with traceability - Add deployment and security guides Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
6.5 KiB
6.5 KiB
| id | type | status | version | created_date | updated_date | simco_version | author |
|---|---|---|---|---|---|---|---|
| SEGURIDAD | Guide | Vigente | 1.0.0 | 2026-01-13 | 2026-01-13 | 4.0.0 | Agente Arquitecto de Documentación |
Seguridad - MiInventario
1. Resumen de Seguridad
MiInventario implementa múltiples capas de seguridad para proteger datos de usuarios y transacciones financieras.
| Capa | Mecanismo | Estado |
|---|---|---|
| Autenticación | JWT + OTP | Implementado |
| Autorización | RBAC (Roles) | Implementado |
| Datos | Row-Level Security | Implementado |
| Comunicación | HTTPS/TLS | Requerido en producción |
| Inputs | Sanitización | Implementado |
2. Autenticación
2.1 JWT (JSON Web Tokens)
Implementación: src/modules/auth/strategies/jwt.strategy.ts
// Configuración JWT
{
secret: process.env.JWT_SECRET,
signOptions: {
expiresIn: '15m', // Access token: 15 minutos
}
}
Flujo de autenticación:
[Usuario] → [Login con teléfono] → [Envío OTP SMS] → [Verificación OTP]
↓
[Generación Access Token (15m) + Refresh Token (7d)]
↓
[Acceso a recursos protegidos]
2.2 OTP (One-Time Password)
Implementación: src/modules/auth/services/otp.service.ts
- Código de 6 dígitos
- Expiración: 5 minutos
- Máximo 3 intentos por código
- Rate limiting: 1 OTP por minuto
2.3 Refresh Tokens
Tabla: refresh_tokens
| Campo | Descripción |
|---|---|
| token | Token hasheado |
| userId | Usuario propietario |
| expiresAt | Fecha de expiración (7 días) |
| revokedAt | Fecha de revocación (nullable) |
3. Autorización (RBAC)
3.1 Roles del Sistema
| Rol | Nivel | Permisos |
|---|---|---|
| USER | 1 | Acceso básico a su tienda |
| OWNER | 2 | Gestión completa de su tienda |
| OPERATOR | 3 | Operaciones en tiendas asignadas |
| VIEWER | 4 | Solo lectura |
| MODERATOR | 5 | Moderación de contenido |
| ADMIN | 10 | Administración del sistema |
| SUPER_ADMIN | 100 | Acceso total |
3.2 Guard de Roles
Implementación: src/common/guards/roles.guard.ts
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('ADMIN', 'SUPER_ADMIN')
@Get('admin/dashboard')
getDashboard() {
// Solo accesible por ADMIN y SUPER_ADMIN
}
3.3 Decorator de Roles
Implementación: src/common/decorators/roles.decorator.ts
export const Roles = (...roles: string[]) => SetMetadata('roles', roles);
4. Row-Level Security (RLS)
4.1 Multi-tenancy
Cada tienda (tenant) solo puede acceder a sus propios datos:
-- Política RLS ejemplo
CREATE POLICY tenant_isolation ON inventory_sessions
USING (store_id = current_setting('app.current_store_id')::uuid);
4.2 Verificación de Propiedad
Implementación en servicios:
async getSession(sessionId: string, userId: string) {
const session = await this.sessionRepository.findOne({
where: { id: sessionId },
relations: ['store', 'store.users'],
});
// Verificar que el usuario pertenece a la tienda
if (!session.store.users.some(u => u.id === userId)) {
throw new ForbiddenException('No tienes acceso a esta sesión');
}
return session;
}
5. Sanitización de Inputs
5.1 Validación con class-validator
Ejemplo de DTO:
export class CreateStoreDto {
@IsString()
@MinLength(3)
@MaxLength(100)
@Transform(({ value }) => value.trim())
name: string;
@IsOptional()
@IsString()
@MaxLength(500)
@Transform(({ value }) => sanitizeHtml(value))
description?: string;
}
5.2 Pipes de Validación
// En main.ts
app.useGlobalPipes(new ValidationPipe({
whitelist: true, // Elimina campos no definidos
forbidNonWhitelisted: true, // Error si hay campos extras
transform: true, // Transforma tipos automáticamente
}));
6. Secretos y Variables de Entorno
6.1 Variables Sensibles
| Variable | Descripción | Rotación |
|---|---|---|
JWT_SECRET |
Firma de tokens | Trimestral |
STRIPE_SECRET_KEY |
API Stripe | Según necesidad |
STRIPE_WEBHOOK_SECRET |
Verificación webhooks | Según necesidad |
AI_API_KEY |
API de IA | Según necesidad |
S3_SECRET_KEY |
Acceso MinIO/S3 | Anual |
6.2 Generación de Secrets
# JWT Secret
openssl rand -base64 32
# Verificar que no hay secrets en código
grep -r "sk_live\|sk_test\|secret" --include="*.ts" src/
6.3 Archivo .env.example
# Database
DATABASE_URL=postgresql://user:pass@localhost:5433/db
# Auth
JWT_SECRET=<generar-con-openssl>
# Stripe (usar test keys en desarrollo)
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
# IA
AI_API_KEY=<api-key>
AI_PROVIDER=openai
7. Seguridad en Pagos
7.1 Stripe Integration
- Nunca almacenar números de tarjeta
- Usar Stripe Elements en frontend
- Validar webhooks con firma
Verificación de webhook:
const event = stripe.webhooks.constructEvent(
req.body,
req.headers['stripe-signature'],
process.env.STRIPE_WEBHOOK_SECRET
);
7.2 Protección Anti-Fraude
- Verificación de transacciones duplicadas
- Límites de monto por transacción
- Logs de auditoría para pagos
8. Auditoría
8.1 Tabla audit_logs
CREATE TABLE audit_logs (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
action VARCHAR(50) NOT NULL,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID,
old_values JSONB,
new_values JSONB,
ip_address INET,
user_agent TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
8.2 Eventos Auditados
- Login/Logout
- Cambios en permisos
- Transacciones financieras
- Modificación de datos sensibles
- Acceso a reportes
9. Headers de Seguridad
// En main.ts con Helmet
app.use(helmet({
contentSecurityPolicy: true,
crossOriginEmbedderPolicy: true,
crossOriginOpenerPolicy: true,
crossOriginResourcePolicy: true,
dnsPrefetchControl: true,
frameguard: true,
hidePoweredBy: true,
hsts: true,
ieNoOpen: true,
noSniff: true,
referrerPolicy: true,
xssFilter: true,
}));
10. Checklist de Seguridad
Pre-Deploy
- Variables de entorno configuradas
- JWT_SECRET rotado desde desarrollo
- HTTPS habilitado
- CORS configurado correctamente
- Rate limiting activo
- Logs de auditoría funcionando
Periódico
- Revisar logs de acceso
- Rotar secrets (trimestral)
- Actualizar dependencias
- Pruebas de penetración (anual)
Documento creado: 2026-01-13 Última actualización: 2026-01-13 Versión: 1.0.0