Decision: Aplazamiento de SQLCipher (GOB-13)¶
Sistema: Sherlock-docs v1.0 Entidad: Centro de Servicios Judiciales de Bello, Antioquia — Rama Judicial Marco normativo: Ley 1581 de 2012, Acuerdo PCSJA24-12243 Fecha: 2026-03-19 Version: 1.0 Referencia interna: GOB-13 Tipo de decision: Aplazamiento con mitigaciones alternativas
1. Contexto¶
La contraauditoria SDD (doc 03) identifico que la base de datos SQLite de Sherlock-docs almacena datos judiciales y personales sin cifrado en reposo (at-rest encryption). La recomendacion fue implementar SQLCipher via pysqlcipher3.
1.1 Datos almacenados en la BD¶
| Tipo de dato | Ejemplos | Clasificacion Ley 1581 |
|---|---|---|
| Nombres de partes | Demandantes, demandados | Dato personal |
| Cedulas | Numeros de identificacion | Dato personal |
| Correos electronicos | Datos de contacto | Dato personal |
| Radicados judiciales | Numeros de proceso | Dato publico (*) |
| Texto OCR | Contenido de tutelas | Dato sensible (puede contener datos de salud) |
(*) Los radicados son publicos (Ley 1712), pero el contenido del proceso puede contener datos sensibles.
2. Decision¶
Se aplaza la implementacion de SQLCipher hasta que se cumplan las condiciones descritas en §5.
3. Justificacion Tecnica¶
3.1 Problemas de compatibilidad¶
| Problema | Impacto |
|---|---|
pysqlcipher3 requiere compilacion de OpenSSL/libsqlcipher desde fuente |
+15-20 min build time Docker, imagen +200MB |
| Incompatibilidad con SQLite FTS5 compilado en modo estandar | Requiere recompilar SQLite con FTS5 + cipher; alto riesgo de regresion |
| No soporta WAL mode con acceso concurrente cifrado en algunas versiones | Sherlock-docs usa WAL mode para lecturas concurrentes (GUI + CLI) |
pysqlcipher3 sin release estable desde 2021 (PyPI) |
Riesgo de dependencia abandonada |
| Migracion de BD existente: requiere export/import completo | Downtime de servicio + riesgo de perdida de datos |
3.2 Relacion costo-beneficio¶
| Factor | Evaluacion |
|---|---|
| Esfuerzo estimado | 1-2 semanas (incluye pruebas de compatibilidad FTS5 + WAL + migracion) |
| Riesgo de regresion | Alto — afecta pipeline completo (OCR → NER → Dedup → BD) |
| Beneficio marginal | Bajo — las mitigaciones alternativas ya cubren el vector de ataque principal |
| Usuarios del sistema | 1-3 operadores en red local del CSJ |
| Volumen de datos | ~100 documentos/dia, ~3000 registros totales |
4. Mitigaciones Alternativas Implementadas¶
4.1 Controles en capas (defense in depth)¶
| Capa | Control | Estado | Referencia |
|---|---|---|---|
| Red | Firewall UFW — solo puertos 80, 443, 22 abiertos | Implementado | SEC-04, F2 |
| Red | HTTPS obligatorio via Traefik + Let's Encrypt | Implementado | SEC-02 |
| Sistema | VPS con disco cifrado (Hostinger provisiona con LUKS) | Verificado | Infraestructura |
| Container | Docker non-root user (gosu pattern) | Implementado | SEC-03 |
| Container | Volumenes de datos no expuestos publicamente | Implementado | Dockerfile |
| Aplicacion | Autenticacion Streamlit con bcrypt | Implementado | SEC-05/GOB-05 |
| Aplicacion | Auditoria de operaciones (tabla audit_events) |
Implementado | GOB-11 |
| Datos | Backups cifrados con gzip (compresion, no cifrado AES) | Parcial | F1 (pendiente offsite) |
| Acceso | SSH con clave publica, password auth deshabilitado | Implementado | SEC-04 |
4.2 Analisis de vectores de ataque¶
| Vector | Mitigacion sin SQLCipher | Riesgo residual |
|---|---|---|
| Acceso fisico al servidor | Disco cifrado LUKS + datacenter Hostinger con seguridad fisica | Bajo |
| Acceso SSH no autorizado | Clave publica + UFW + fail2ban | Bajo |
| Acceso al container | Docker non-root + volumenes internos | Bajo |
| Backup robado en transito | gzip (pendiente: cifrado AES en F1) | Medio |
| Vulnerabilidad en aplicacion | Auth + auditoria + HTTPS | Bajo |
| Acceso via red local CSJ | El sistema solo es accesible via HTTPS (no hay BD expuesta) | Bajo |
4.3 Riesgo residual aceptado¶
El riesgo residual sin SQLCipher es BAJO dado que: - El acceso a la BD requiere acceso al container Docker + sistema de archivos - El disco del VPS esta cifrado en reposo (LUKS) - No hay puerto de BD expuesto (SQLite es archivo local, no servidor) - La autenticacion impide acceso no autorizado via la aplicacion
5. Condiciones para Re-evaluar¶
| Condicion | Trigger |
|---|---|
| Migracion a PostgreSQL | Si se migra a PostgreSQL (roadmap API .NET), usar TLS + pg_crypto nativo en lugar de SQLCipher |
| Regulacion explicita | Si el CSJ o la SIC requieren cifrado at-rest especificamente para BD de herramientas auxiliares |
| Incidente de seguridad | Si ocurre un acceso no autorizado que exponga la BD |
| Multi-sede | Si el sistema se despliega en multiples sedes con distintos niveles de seguridad fisica |
| Release estable de pysqlcipher3 | Si se publica version compatible con Python 3.12 + FTS5 + WAL |
6. Firmas¶
| Rol | Nombre | Firma | Fecha |
|---|---|---|---|
| Coordinador CSJ Bello | _____ | _ | _ |
| Administrador de TI | _____ | _ | _ |
Decision tecnica documentada conforme a GOB-13. Sujeta a revision periodica (semestral) o cuando se cumpla alguna condicion de re-evaluacion.
Referencias: Ley 1581 de 2012, Acuerdo PCSJA24-12243 Version: 1.0 — 2026-03-19