Skip to content

Plataforma técnica · Seguridad

Protección de Datos

Seguridad

La protección de datos define los controles mínimos para manejar información financiera, tributaria, laboral y personal dentro del ecosistema Nostromo. Todo dato debe clasificarse antes de ser almacenado, procesado, expuesto en API o registrado en logs.

NivelDescripciónEjemplosControles mínimos
PúblicoInformación destinada a difusión externaDocumentación pública, contenido del sitioRevisión editorial
InternoInformación operativa sin sensibilidad directaConfiguración de UI, identificadores técnicos no personalesAutenticación requerida
ConfidencialInformación sensible del negocio o del tenantContratos, saldos, movimientos contables, reportes financierosRBAC, auditoría de acceso, segregación por tenant
CríticoPII, secretos y datos laborales sensiblesRUT, remuneraciones, claves, tokens, llaves criptográficasCifrado, acceso restringido, logs enmascarados
  1. No versionar credenciales, tokens, llaves privadas ni archivos .env.
  2. Usar .env.local para desarrollo local y mantenerlo fuera del repositorio.
  3. Inyectar secretos de producción mediante variables de entorno administradas por la plataforma.
  4. Rotar secretos críticos, como $DB_PASSWORD, $JWT_SECRET y $ENCRYPTION_KEY, al menos cada 90 días.
  5. Revocar y reemplazar secretos inmediatamente ante sospecha de exposición.

Los logs deben permitir diagnosticar fallas sin exponer información crítica. Antes de registrar objetos de dominio, se deben enmascarar claves sensibles y estructuras anidadas.

utils/sanitize-log.ts
const SENSITIVE_KEYS = [
'password',
'token',
'secret',
'apiKey',
'api_key',
'rut',
'salary',
'sueldo',
'clave',
'authorization',
];
export function sanitizeLog(value: unknown): unknown {
if (Array.isArray(value)) {
return value.map((item) => sanitizeLog(item));
}
if (value && typeof value === 'object') {
return Object.fromEntries(
Object.entries(value as Record<string, unknown>).map(([key, nestedValue]) => {
const isSensitive = SENSITIVE_KEYS.some((sensitiveKey) =>
key.toLowerCase().includes(sensitiveKey),
);
return [key, isSensitive ? '[REDACTED]' : sanitizeLog(nestedValue)];
}),
);
}
return value;
}
console.log(
sanitizeLog({
userId: '$USER_ID',
rut: '$RUT',
authorization: 'Bearer $TOKEN',
}),
);

El sistema aplica controles por capa para proteger datos en tránsito, en reposo y durante la verificación de credenciales.

Todo tráfico HTTP público debe operar exclusivamente sobre HTTPS.

ControlConfiguración requerida
HSTSmax-age=31536000; includeSubDomains
CertificadosGestionados por la plataforma de despliegue
TLSVersión mínima 1.2; versión preferida 1.3
Headers de seguridad
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Nivel de datoCifrado en tránsitoCifrado en reposoAccesoLogging
PúblicoRequeridoNo requeridoLibre o autenticado según recursoNormal
InternoRequeridoNo requeridoAutenticadoNormal
ConfidencialRequeridoSegún criticidad del campoRBAC y tenant scopeAuditado
CríticoRequeridoRequeridoRestringido y justificadoEnmascarado
VerificaciónCriterio de aceptación
SecretosNo existen valores reales en código, documentación ni fixtures
PIILos ejemplos usan placeholders como $RUT, $USER_ID o $TOKEN
LogsLos objetos sensibles pasan por sanitización antes de registrarse
CifradoLos campos críticos declaran mecanismo de protección
AccesoLas rutas que exponen datos confidenciales validan autenticación, RBAC y tenant scope