Docs

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.

staged files the index scanner AKIA… ghp_… glpat- sk_live PEM blocks · JWTs user:pass@host + .toriignore [secrets] *.example · *.sample · *.template skip the gate commit written object enters history commit aborted file and line printed override with --yes torii scan --history runs the same patterns over every commit already written torii history replace-text --redact-secrets rewrites what it finds

Qué detecta

FamiliaFormasPrefijo de ejemplo
AWSclaves de acceso, de sesión, ids de rolAKIA… ASIA… AROA…
GitHubpersonales, OAuth, de servidor, de grano finoghp_ gho_ ghs_ github_pat_
GitLabtokens personales y de triggerglpat- glptt-
Pagos y correoclaves live de Stripe, SendGrid, Twilio, Brevosk_live_ SG.
Bearer peladoun valor de cabecera sin prefijo de proveedorBearer …
Claves privadasbloques PEM, claves SSH privadas-----BEGIN … PRIVATE KEY-----
Cadenas de conexiónuserinfo con un user:password@ realpostgres:// postgresql:// mysql:// mongodb:// mongodb+srv://
Genéricoalta entropía junto a un nombre que significa secretoTOKEN 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 root

Si --history encuentra algo, la clave ya es pública. Rótala primero y limpia la historia después:

torii history replace-text --redact-secrets

Falsos 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ónQué hacer
Una vez, y el hallazgo no es realtorii save -am "msg" --yes
Un fichero que va a saltar siempreuna 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.