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).
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.
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.
|
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": ""
}
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
600encrisol.jsony 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"
}
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
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
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
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
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:
Fragua
¿Automatizar el escaneo? Fragua es un escáner web ligero (mismo autor) que analiza un activo y genera un fichero listo para importar aquí. Es un proyecto aparte y en desarrollo.
Escáneres de terceros (externos)
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
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
Dockerfile y docker-compose.yml incluidos funcionan tal cual
(docker compose up -d).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.