Escáner de secretos
El escáner corre antes de cada torii save. No es un hook que instalas, ni un job de CI que te avisa una hora tarde, ni algo que se te pueda olvidar activar en una máquina nueva.
Qué detecta
| Familia | Formas | Prefijo de ejemplo |
|---|---|---|
| AWS | claves de acceso, de sesión, ids de rol | AKIA… ASIA… AROA… |
| GitHub | personales, OAuth, de servidor, de grano fino | ghp_ gho_ ghs_ github_pat_ |
| GitLab | tokens personales y de trigger | glpat- glptt- |
| Pagos y correo | claves live de Stripe, SendGrid, Twilio, Brevo | sk_live_ SG. |
| Bearer pelado | un valor de cabecera sin prefijo de proveedor | Bearer … |
| Claves privadas | bloques PEM, claves SSH privadas | -----BEGIN … PRIVATE KEY----- |
| Cadenas de conexión | userinfo con un user:password@ real | postgres:// postgresql:// mysql:// mongodb:// mongodb+srv:// |
| Genérico | alta entropía junto a un nombre que significa secreto | TOKEN SECRET API_KEY PASSWORD |
Los ficheros llamados *.example, *.sample o *.template se saltan siempre.
La detección casa con la forma en la que una clave aparece de verdad, no solo con un token suelto como palabra. KEY=ghp_… sin espacios alrededor — la forma que usa cada fichero .env y cada argumento -e KEY=value de contenedor — es el caso que se colaba antes de 0.13.0, y alrededor del cual se reescribieron los patrones actuales.
Escanear lo ya commiteado
torii scan # staged files
torii scan --history # every commit, from the rootSi --history encuentra algo, la clave ya es pública. Rótala primero y limpia la historia después:
torii history replace-text --redact-secretsFalsos positivos
Solo se excluyen los placeholders sintácticos — ${VAR}, $VAR, <placeholder>. Los que tienen forma de palabra como password o changeme no, porque una contraseña débil real colisiona con ellos. Así que un ejemplo de documentación con user:pass@localhost saltará.
| Situación | Qué hacer |
|---|---|
| Una vez, y el hallazgo no es real | torii save -am "msg" --yes |
| Un fichero que va a saltar siempre | una entrada allow: bajo [secrets] en .toriignore |
| Una línea, ya revisada | // torii:allow-secret en esa línea |
| CI, o cualquier ejecución sin terminal | --yes es obligatorio: el escáner no puede preguntar y se niega a colgarse |
Tus propios patrones
torii ignore secret 'PROP_[a-z]{20}' --name internal # lands in .toriignore.local
torii ignore secret 'AKIA[0-9A-Z]{16}' --public # lands in .toriignore, with a warning
torii ignore list # the effective, merged rules.toriignore.local es privado de tu máquina y se gitignora automáticamente. Es donde debe estar un patrón cuando el patrón en sí es una pista: un formato de clave propietario, una ruta interna, una regex de auditoría. Publicar la regex que casa con tus tokens internos le dice a un atacante qué buscar.