[GUÍA RÁPIDA]

Cheat Sheet de configuración

Todo lo que necesitas para configurar Crisol-RX: el archivo crisol.json, modo servidor, HTTPS, cifrado y comandos esenciales.

El archivo crisol.json

Se crea solo junto al ejecutable en el primer arranque. Edítalo con cualquier editor de texto y reinicia la app para aplicar los cambios.

{
  "listen": "127.0.0.1:8723",
  "db": "",
  "org_name": "",
  "open_browser": true,
  "secure_cookies": false,
  "trust_proxy": false,
  "allowed_hosts": [],
  "allowed_ips": [],
  "tls_enabled": false,
  "cert_file": "",
  "key_file": "",
  "encrypt_db": false,
  "db_passphrase": "",
  "backup_enabled": false,
  "backup_dir": "",
  "backup_interval_hours": 12,
  "backup_keep": 14,
  "backup_passphrase": ""
}
Campo Tipo Por defecto Qué hace
listen string "127.0.0.1:8723" Dónde escucha. 127.0.0.1:8723 = solo este equipo. 0.0.0.0:8723 = accesible desde la red.
db string "" Ruta del archivo SQLite. Vacío = junto al ejecutable.
org_name string "" Nombre de tu entidad. Aparece junto al logo y en los informes.
open_browser bool true Abre el navegador al arrancar. Ponlo a false en un servidor.
secure_cookies bool false Marca las cookies como Secure. Actívalo si sirves por HTTPS (o tras un proxy TLS).
trust_proxy bool false Detrás de un reverse proxy de confianza: usa X-Forwarded-For para mostrar la IP real en la auditoría.
allowed_hosts string[] [] Nombres de host permitidos (anti DNS-rebinding). Añade tu dominio, p. ej. ["crisol.miempresa.com"].
allowed_ips string[] [] Lista blanca de IPs/CIDR de cliente. Vacío = sin restricción. Loopback siempre permitido.
tls_enabled bool false Activa HTTPS en el propio binario (autofirmado si no das cert/key).
cert_file / key_file string "" Rutas del certificado y clave PEM. Vacíos = certificado autofirmado.
encrypt_db bool false Cifra la base en reposo (<db>.enc). Requiere passphrase.
db_passphrase string "" Passphrase de cifrado. Mejor usar la variable CRISOL_KEY (no queda en disco).
backup_enabled bool false Copias automáticas: una al arrancar y otra cada N horas.
backup_dir string "" Carpeta de copias. Vacío = <carpeta de la BD>/backups.
backup_interval_hours int 12 Cada cuántas horas se copia (mínimo efectivo: 1).
backup_keep int 14 Cuántas copias se conservan (las más antiguas se borran). 0 = no rotar.
backup_passphrase string "" Passphrase para cifrar las copias. Si está vacía usa db_passphrase / CRISOL_KEY.

Flags de arranque

Opciones de línea de comandos. Tienen prioridad sobre el crisol.json.

./crisol                          # arranca según crisol.json
./crisol -addr 127.0.0.1:9000     # otra dirección/puerto
./crisol -db /ruta/otra.db        # otra base de datos
./crisol -config /ruta/otra.json  # otra configuración
./crisol -no-open                 # no abrir el navegador

# Variable de entorno: passphrase de cifrado (base + backups), no queda en disco
CRISOL_KEY=<clave> ./crisol

# Herramientas manuales de cifrado
./crisol -encrypt datos.db -out datos.db.enc
./crisol -decrypt datos.db.enc -out datos.db

Levantarlo como servidor en red

Para que otros equipos de tu red entren a la misma instancia.

{
  "listen": "0.0.0.0:8723"
}

Los demás acceden por http://<IP-del-servidor>:8723. Averigua tu IP con ipconfig (Windows) o ip a / ifconfig (Linux/macOS).

⚠️
Sin HTTPS el tráfico va en claro. Úsalo solo en una red de confianza y activa el cifrado de comunicaciones (siguiente sección). Cambia antes la contraseña de admin.

Control de acceso por IP (lista blanca)

Limita quién puede entrar combinando allowed_hosts (por nombre) y allowed_ips (por dirección de cliente). Solo los equipos de la lista entran; el resto recibe 403.

{
  "listen": "0.0.0.0:8723",
  "allowed_hosts": ["crisol.miempresa.local"],
  "allowed_ips": ["192.168.1.50", "192.168.1.0/24"]
}
Campo Qué hace
allowed_ips Lista blanca de IPs de cliente que pueden acceder. Acepta IPs sueltas y rangos CIDR (p. ej. 192.168.1.0/24). La IP loopback (127.0.0.1/::1) siempre se permite: el propio equipo nunca se autobloquea. Vacío = sin restricción por IP. Útil para exponer en LAN solo a equipos concretos.
allowed_hosts Lista blanca por nombre de host. Se rechazan las peticiones cuyo Host no esté listado. Vacío = sin restricción por nombre.

Acceso por nombre DNS propio

Para entrar por un nombre amable en vez de por IP, pon tu nombre en allowed_hosts (p. ej. crisol.miempresa.local) y haz que ese nombre resuelva a la IP del servidor: en el DNS interno de la empresa, o en el fichero hosts de cada equipo cliente. Así el acceso pasa a ser http://crisol.miempresa.local:8723.

💡
Combina ambos: allowed_hosts fija el nombre y allowed_ips restringe las direcciones de origen. El loopback queda siempre permitido para que administres desde el propio servidor.

HTTPS opcional

Cifra las comunicaciones. Con tu certificado propio o uno automático.

{
  "listen": "0.0.0.0:8723",
  "tls_enabled": true,
  "cert_file": "",
  "key_file": ""
}
Escenario Qué poner
Certificado automático Deja cert_file y key_file vacíos: se genera uno solo. El navegador avisará la primera vez (normal en red interna).
Certificado propio Indica las rutas de tu certificado y su clave en cert_file y key_file.
💡
Bajo HTTPS, el acceso es por https://<IP>:8723 y las cookies se marcan seguras automáticamente.

Detrás de un proxy (nginx / Caddy)

Si sirves Crisol-RX detrás de un reverse proxy, activa trust_proxy en crisol.json para que el registro de actividad y la página de error muestren la IP real del visitante en vez de la del proxy.

{
  "secure_cookies": true,
  "trust_proxy": true
}

Importante: esto solo afecta a la IP que se muestra. La seguridad (lista blanca de IPs, límite de intentos de login) usa siempre la IP real de la conexión, que no se puede falsear con cabeceras. Déjalo en false si no usas proxy.

Configuración recomendada (red privada)

Ejemplo de crisol.json para exponer la instancia en una red interna con la mínima superficie: acceso restringido por IP/host, TLS, cifrado en reposo y copias cifradas.

Opción A — Detrás de un proxy inverso (recomendada)

La aplicación escucha solo en 127.0.0.1; el proxy inverso (Caddy) es lo único que da la cara en la red y aporta TLS. En este modo el filtrado por IP se aplica en Caddy o en el firewall (la app solo ve la IP del proxy, por eso allowed_ips va vacío aquí).

{
  "listen": "127.0.0.1:8723",
  "db": "/opt/crisol/crisol.db",
  "org_name": "Mi organización",
  "open_browser": false,
  "secure_cookies": true,
  "trust_proxy": true,
  "allowed_hosts": ["crisol.miempresa.local"],
  "allowed_ips": [],
  "tls_enabled": false,
  "cert_file": "",
  "key_file": "",
  "encrypt_db": true,
  "db_passphrase": "",
  "backup_enabled": true,
  "backup_dir": "/var/backups/crisol",
  "backup_interval_hours": 6,
  "backup_keep": 7,
  "backup_passphrase": ""
}

Opción B — TLS propio en la LAN

Sin proxy: la aplicación sirve HTTPS directamente. Con cert_file/key_file vacíos genera un certificado autofirmado (el navegador avisa la primera vez, normal en red interna).

{
  "listen": "0.0.0.0:8723",
  "db": "/opt/crisol/crisol.db",
  "org_name": "Mi organización",
  "open_browser": false,
  "secure_cookies": true,
  "trust_proxy": false,
  "allowed_hosts": ["crisol.miempresa.local"],
  "allowed_ips": ["192.168.1.0/24"],
  "tls_enabled": true,
  "cert_file": "",
  "key_file": "",
  "encrypt_db": true,
  "db_passphrase": "",
  "backup_enabled": true,
  "backup_dir": "/var/backups/crisol",
  "backup_interval_hours": 6,
  "backup_keep": 7,
  "backup_passphrase": ""
}
⚠️
La passphrase de cifrado no se guarda en el fichero: se toma de la variable de entorno CRISOL_KEY (deja db_passphrase y backup_passphrase vacíos).

Checklist operativo

  • Cortafuegos: abrir el puerto solo a la subred (o solo 443 con proxy).
  • Permisos 600 en crisol.json y el fichero de entorno; carpeta de datos restringida.
  • Cambiar la contraseña de administrador y activar 2FA.
  • Base de datos en disco local SSD (no en recursos de red/SMB).
  • Usar la unidad systemd endurecida y guardar las copias en un volumen aparte.

Cifrado de tus datos opcional

Con la app cerrada, tus datos quedan ilegibles para terceros.

{
  "encrypt_db": true,
  "db_passphrase": "una-frase-larga-y-secreta"
}
🔑
¿No ves el archivo cifrado? Es normal: se crea al cerrar la app con Ctrl-C, no al arrancar. Mientras trabajas, los datos están descifrados; al cerrar ordenadamente se cifran y se borra la copia en claro.
🚨
Cierra siempre con Ctrl-C. Si matas el proceso de golpe, el cifrado no se ejecuta. Y guarda bien la passphrase: si la pierdes, los datos no se recuperan.
🛡️
Opción más segura: en vez de poner la passphrase en el crisol.json, déjala vacía y pásala por variable de entorno al arrancar — así no queda en disco:
CRISOL_KEY='tu-passphrase' ./crisol

Abrir y consultar tus datos a mano

# Descifrar (pide la passphrase o usa la variable CRISOL_KEY)
CRISOL_KEY='tu-passphrase' ./crisol -decrypt crisol.db.enc -out crisol.db

# Consultar con cualquier cliente SQLite
sqlite3 crisol.db ".tables"

# Volver a cifrar y borrar la copia en claro
CRISOL_KEY='tu-passphrase' ./crisol -encrypt crisol.db -out crisol.db.enc
rm -f crisol.db crisol.db-wal crisol.db-shm

Cambiar la passphrase

Cambiar la frase en el crisol.json no basta si ya hay datos cifrados: el archivo sigue cerrado con la frase anterior.

# Con el servidor PARADO:
# 1) Descifra con la frase VIEJA
CRISOL_KEY='frase-vieja' ./crisol -decrypt crisol.db.enc -out crisol.db

# 2) Re-cifra con la frase NUEVA
CRISOL_KEY='frase-nueva' ./crisol -encrypt crisol.db -out crisol.db.enc

# 3) Borra la copia en claro
rm -f crisol.db crisol.db-wal crisol.db-shm

# 4) Pon la frase NUEVA en crisol.json
💡
Si todavía no has generado el archivo cifrado (no has cerrado con Ctrl-C con el cifrado activo), basta con editar db_passphrase en el crisol.json.

Copias de seguridad automáticas

La app hace copias automáticas, cifradas con AES-256-GCM y con retención. Se configuran en crisol.json.

{
  "backup_enabled": true,
  "backup_dir": "",
  "backup_interval_hours": 24,
  "backup_keep": 7,
  "backup_passphrase": ""
}
Campo Qué hace
backup_enabled true/false. Activa las copias automáticas.
backup_dir Carpeta de destino. Vacío = <carpeta de la BD>/backups.
backup_interval_hours Horas entre copias. Por defecto 24, mínimo 1.
backup_keep Cuántas copias conservar. Por defecto 7.
backup_passphrase Si está vacío usa db_passphrase / CRISOL_KEY. Si no hay ninguna, la copia se guarda sin cifrar y se avisa.

Restaurar una copia

Con la herramienta de descifrado incluida, indicando la passphrase de la copia:

CRISOL_KEY='tu-passphrase' ./crisol -decrypt backups/crisol-AAAAMMDD-HHMMSS.db.enc -out restaurada.db
📋
Copias cifradas de extremo a extremo: te ayudan a mantener una buena práctica de respaldo y a proteger los datos en reposo.

Buenas prácticas

🔑 Cambia la contraseña inicial de admin cuanto antes.
🌐 Si lo expones a la red, usa HTTPS y solo en redes de confianza.
🔒 Si activas el cifrado, guarda la passphrase en un gestor de contraseñas y protege el crisol.json.
Cierra siempre con Ctrl-C para que el cifrado y la limpieza se completen.
🙈 No subas a ningún sitio público tus archivos de datos, el crisol.json ni los certificados.
📦 Los exports de workspace contienen datos reales de clientes: trátalos como información sensible.

Despliegue seguro (Linux y macOS)

Para un servidor: usuario dedicado, permisos mínimos, servicio del sistema y cortafuegos. Guía completa en docs/DESPLIEGUE-SEGURO.md.

1. Usuario dedicado y permisos mínimos

# Usuario de servicio sin login (Linux)
sudo useradd --system --home /opt/crisol --shell /usr/sbin/nologin crisol
sudo chown -R crisol:crisol /opt/crisol

# Solo el servicio lee la config, la clave TLS y la base
sudo chmod 600 /opt/crisol/crisol.json crisol-key.pem crisol.db*
sudo chmod 700 /opt/crisol/backups
🔑
No pongas la passphrase en el crisol.json: pásala por la variable CRISOL_KEY desde el propio servicio, así no queda en disco.

2. Servicio en Linux (systemd endurecido)

# /etc/systemd/system/crisol.service
[Service]
User=crisol
WorkingDirectory=/opt/crisol
ExecStart=/opt/crisol/crisol
EnvironmentFile=/etc/crisol/crisol.env   # CRISOL_KEY=...
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallFilter=@system-service
ReadWritePaths=/opt/crisol
UMask=0077
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now crisol
sudo journalctl -u crisol -f   # contraseña admin del 1er arranque

3. Servicio en macOS (launchd)

# /Library/LaunchDaemons/com.crisol.rx.plist (extracto)
<key>ProgramArguments</key>
<array><string>/usr/local/crisol/crisol</string><string>-no-open</string></array>
<key>UserName</key><string>_crisol</string>
<key>RunAtLoad</key><true/>
<key>EnvironmentVariables</key>
<dict><key>CRISOL_KEY</key><string>tu-passphrase</string></dict>
sudo chown root:wheel /Library/LaunchDaemons/com.crisol.rx.plist
sudo chmod 600 /Library/LaunchDaemons/com.crisol.rx.plist   # oculta la clave
sudo launchctl load -w /Library/LaunchDaemons/com.crisol.rx.plist

4. Cortafuegos y acceso

# Linux (ufw): abre el puerto solo a tu subred de confianza
sudo ufw allow from 192.168.1.0/24 to any port 8723 proto tcp

# macOS: firewall de aplicaciones
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/crisol/crisol
🛡️
Refuerza con allowed_ips en el crisol.json, activa TLS (abre por https://), encrypt_db y copias replicadas fuera del host. Activa 2FA en todas las cuentas.

Escáneres compatibles

Crisol-RX importa los resultados de estos escáneres —todas herramientas externas— detectando el formato automáticamente y deduplicando por activo. Además, tienes la nuestra:

Escáneres de terceros (externos)

Nessus Burp Suite OWASP ZAP Nmap Nuclei OpenVAS Qualys Trivy Semgrep Acunetix

Requisitos de hardware (CPU, RAM, disco)

Binario único estático (sin CGO) con SQLite embebido: no requiere servidor de base de datos ni dependencias externas. El consumo de RAM y CPU es estable e independiente del tamaño de la base de datos.

Perfil CPU RAM Disco Notas
Mínimo · 1 usuario 1 núcleo (x86-64 / ARM64) 256 MB 150 MB Uso en reposo: 30–80 MB
Recomendado · equipo pequeño 2 núcleos 1 GB 5–20 GB SSD Margen para informes y copias de seguridad
Grande · alto volumen de evidencia 2–4 núcleos 2 GB 100 GB – 1 TB SSD Escala con la evidencia y las copias

Dimensionamiento del disco

El espacio en disco depende del volumen de capturas de evidencia almacenadas y de la retención de copias de seguridad:

Disco ≈ (Σ tamaño de las capturas) + (retención de backups × tamaño de la BD) + margen
💡
Cada copia de seguridad ocupa aproximadamente el tamaño de la base de datos. Se recomienda almacenar las copias en un volumen independiente, ajustar la retención con backup_keep y ejecutar VACUUM tras eliminaciones masivas para recuperar espacio.

Despliegue seguro

Crisol-RX se distribuye como binario nativo por plataforma. Para uso en servidor se recomienda Linux (x86-64 o ARM64), con la unidad systemd endurecida y un proxy inverso (Caddy) que proporciona HTTPS automático.

Compatible con Windows (x64 / ARM64), macOS (Apple Silicon e Intel) y Linux (x64 / ARM64), con soporte ARM64 de primera clase.

Ejecute la base de datos en disco local SSD (no en recursos de red/SMB) sobre un sistema de 64 bits. Cambie la contraseña de administrador y active el cifrado de datos antes de exponer la instancia.

Despliegue paso a paso en Ubuntu / Debian

Sobre la unidad systemd endurecida del kit (arranque automático, reinicio ante caídas y sandbox estricto). El binario es estático: no instala nada en el sistema.

1. Usuario de servicio y binario en /opt/crisol:

sudo useradd --system --home /opt/crisol --shell /usr/sbin/nologin crisol
sudo mkdir -p /opt/crisol && sudo cp crisol-linux-amd64 /opt/crisol/crisol
sudo chown -R crisol:crisol /opt/crisol

2. Crea el crisol.json (usa la config de «Servidor y red») y guarda la passphrase en CRISOL_KEY, nunca en el fichero:

sudo install -d -m 700 /etc/crisol
echo 'CRISOL_KEY=<clave-larga-aleatoria>' | sudo tee /etc/crisol/crisol.env
sudo chmod 600 /etc/crisol/crisol.env /opt/crisol/crisol.json

3. Servicio systemd endurecido (incluido en deploy/):

sudo cp deploy/crisol.service /etc/systemd/system/
sudo systemctl daemon-reload && sudo systemctl enable --now crisol

4. Cortafuegos (ufw) restringido a tu subred:

sudo ufw allow from 192.168.1.0/24 to any port 8723 proto tcp

5. HTTPS con Caddy (proxy inverso, certificado automático):

sudo apt install -y caddy
sudo cp deploy/Caddyfile /etc/caddy/Caddyfile   # edita el dominio
sudo systemctl reload caddy
💡
Alternativa con contenedores: en Ubuntu/Debian usa Docker; el Dockerfile y docker-compose.yml incluidos funcionan tal cual (docker compose up -d).
🐧
Otras distros: en RHEL / Rocky / Alma / Fedora usa firewalld en vez de ufw, ten en cuenta SELinux (etiqueta el puerto o ejecútalo tras Caddy en 127.0.0.1) y Podman en vez de Docker.