Dinoer

El directorio cifrado de credenciales

Dónde se guardan las contraseñas, cómo llegan a un formulario sin pasar por su shell, y el error que las escribe en claro.

Sus credenciales se guardan en un directorio cifrado que usted monta, un volumen gocryptfs. Dentro están en archivos JSON sencillos, legibles solo mientras el volumen está montado. Dinoer los lee dentro del proceso que maneja el navegador, en el momento en que se rellena un campo. El valor nunca pasa por su shell, su historial de comandos ni los registros de Dinoer.

Crearlo y luego montarlo

En una instalación por clon de Git, el script de preparación crea el almacenamiento cifrado y un punto de montaje vacío, en las rutas que fijan secrets_crypt_dir y secrets_dir en dinoer.conf. --sans-chiffrement crea en su lugar un directorio en claro (modo 700), para una máquina sin gocryptfs:

bash scripts/configurer-repertoire-chiffre.sh    # desde el clon

El paquete .deb no incluye este script: cree usted mismo el volumen gocryptfs e indique su punto de montaje en secrets_dir. Después, en cualquiera de las dos vías, móntelo antes de una ejecución que lo necesite:

dinoer-monter-secrets                                     # paquete .deb
bash /opt/dinoer/scripts/monter-repertoire-chiffre.sh     # clon de Git

Nada se puede leer en el disco mientras el volumen no esté montado.

Guardar credenciales en él

Un archivo JSON por sitio, con el nombre de su dominio (target.local.json, o target.local_8443.json para un puerto concreto), en cualquier lugar bajo el directorio montado:

{
  "username": "operator",
  "password": "…",
  "totp_cle": "BASE32SEED",
  "ntfy_topic": "…",
  "origines_autorisees": ["target.local"]
}

Solo tienen que existir las claves que usan sus escenarios. totp_cle es la semilla en base32 de los códigos de doble autenticación; ntfy_topic es el canal por el que puede transmitirse un código que le envían. Sin --secrets, Dinoer elige el archivo según el dominio de la página realmente cargada: una redirección a otro sitio no encuentra ninguna credencial. Con --secrets, el archivo se indica de forma explícita: debe entonces enumerar en origines_autorisees los dominios en los que puede usarse, y ser legible solo por su propietario (chmod 600); si no, Dinoer lo rechaza.

Usarlo en un escenario

{"type": "remplir", "selecteur": "input[name=\"username\"]",
 "valeur": "depuis_secrets", "secret_cle": "username"},
{"type": "remplir", "selecteur": "input[name=\"password\"]",
 "valeur": "depuis_secrets", "secret_cle": "password"}

secret_cle es la clave dentro del archivo. El escenario nombra una clave, nunca un secreto, así que puede estar en un repositorio público sin nada que ocultar.

No haga nunca esto PASS=$(jq -r ‘.password’ ~/Vaults/…/creds.json): una credencial en una variable del shell está en el entorno de su proceso, en /proc y quizá en su historial. El directorio cifrado existe justamente para evitarlo.

Un directorio por proyecto

Dos maneras, para una ejecución puntual o como costumbre.

# Puntual
DINOER_SECRETS_DIR=~/Vaults/MyProject /opt/dinoer/venv/bin/python3 /opt/dinoer/shot.py \
  --url … --guide-version 1.6

# Habitual: un archivo de configuración en la raíz del proyecto
echo '{"secrets_dir": "../MyProject-secrets"}' > ~/git/MyProject/.dinoer.conf
export DINOER_CONF=~/git/MyProject/.dinoer.conf

Un secrets_dir relativo se resuelve desde la ubicación del archivo de configuración, de modo que el ajuste viaja con el proyecto.

--secrets <archivo> indica un archivo de credenciales para una sola ejecución sin tocar la configuración, por ejemplo cuando un mismo escenario sirve para varias cuentas.

Cuando el directorio está cerrado

Dinoer se detiene con un error explícito:

SecretsFermesError — exit code 42 (encrypted directory not mounted)
SecretsNonConfigureError — exit code 43 (no credential directory configured)

Si usted es un agente: no intente montarlo usted mismo. Pregunte al operador.

Dinoer protege también sus propias escrituras: cuando su registro de operaciones está dentro del directorio cifrado y este está cerrado, escribe en un archivo de reserva local en lugar de escribir en claro donde debería estar el almacenamiento cifrado.

El error que más cuesta

Un directorio sin montar sigue existiendo. Simplemente está vacío, y sin cifrar.

La protección de Dinoer cubre sus propias escrituras. No cubre un archivo de credenciales que usted crea con un comando o un editor mientras el directorio no está montado. Entonces escribe al lado del almacenamiento cifrado, en claro, en un directorio que parece exactamente el correcto.

Antes de crear o modificar un archivo de credenciales, compruebe que el directorio está montado: no debe estar vacío. Este error no tiene vuelta atrás.

En resumen

  • El archivo se lee dentro del proceso del navegador, nunca a través de su shell.
  • Los escenarios nombran una clave, nunca un secreto: se puede hacer commit de ellos.
  • DINOER_CONF, DINOER_SECRETS_DIR o --secrets para credenciales por proyecto y por cuenta.
  • El código 42 significa cerrado; el 43, nunca configurado. Pregunte al operador, no lo monte usted.
  • Un directorio sin montar es un directorio vacío y sin cifrar. Compruébelo antes de escribir.