Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.9 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0060 | `fn doctor secrets`: scan de secrets en TODOS los repos | pendiente | feature | multi-app | media | 2026-05-17 | 2026-05-17 |
0060 — fn doctor secrets: scan de secrets en TODOS los repos
APP Metadata
| Campo | Valor |
|---|---|
| ID | 0060 |
| Estado | pendiente |
| Prioridad | media |
| Tipo | feature — cmd/fn/doctor.go + funcion del registry |
Dependencias
scan_secrets_in_dirty_bash_cybersecurityya existe (escanea solo dirty trees por nombres sospechosos).discover_git_repos_bash_infraya existe.- Pre-commit hook v2 invoca
scan_secrets_in_dirtypor repo.
Contexto
Hoy el escaneo de secrets ocurre solo:
- En el pre-commit hook (de cada repo, sobre dirty tree antes del commit).
- Cuando el usuario invoca manualmente
scan_secrets_in_dirty.sh.
NO hay un audit global "scan TODOS los repos en una pasada" para detectar secrets que ya esten commiteados (caso peor) o staged en repos que no se commitearon hoy. Riesgo: una key olvidada en un repo viejo puede estar pushed a Gitea desde hace meses sin que nadie lo sepa.
Objetivo
Anadir subcomando fn doctor secrets que:
- Itera TODOS los repos descubiertos por
discover_git_repos. - Por cada uno, escanea TODO el HEAD (no solo dirty) buscando:
- Nombres sospechosos (
*.env,*credentials*,*.key,*.pem,id_rsa*,*secret*,*token*.txt). - Patterns en contenido: AWS keys (
AKIA...), JWT tokens, GitHub tokens (ghp_...), Google API keys (AIza...).
- Nombres sospechosos (
- Reporta hallazgos como en otros
fn doctor(texto humano +--json). - Exit 0 si limpio, 1 si encuentra algo.
Arquitectura
Archivos afectados
- NUEVA funcion
scan_secrets_repo_bash_cybersecurity(bash/functions/cybersecurity/scan_secrets_repo.sh+.md) — version "todo el repo" del existente. - NUEVA funcion
scan_secrets_all_repos_go_cybersecurity(functions/cybersecurity/scan_secrets_all_repos.go) — orquestador Go que itera repos y compone resultado. cmd/fn/doctor.go— anadir subcomandosecretsque invoca la funcion Go..claude/rules/fn_doctor.md— anadir entrada parasecrets.
Tareas
Fase 1 — funcion bash de scan completo
1.1 Crear scan_secrets_repo_bash_cybersecurity:
- Args: <repo_dir>.
- Lista todos los archivos tracked por git (git ls-files).
- Para cada uno, aplica los filtros de nombre y luego grep -E patterns en contenido.
- Output: lineas SECRET <type> <repo>:<file>:<line> <pattern_match>.
- Exit 0 si limpio, 1 si hay matches.
Fase 2 — orquestador Go
2.1 ScanSecretsAllRepos(registryRoot string) ([]SecretFinding, error).
2.2 Llama internamente discover_git_repos (via shell-out o portar a Go).
2.3 Por cada repo, ejecuta scan_secrets_repo.sh y agrega findings.
2.4 Test con repo temporal con archivo dummy .env.
Fase 3 — CLI + docs
3.1 Anadir case secrets a cmd/fn/doctor.go.
3.2 Texto humano: tabla REPO | FILE | TYPE | MATCH.
3.3 --json: array de findings.
3.4 Anadir a fn doctor (todos los checks).
3.5 Actualizar .claude/rules/fn_doctor.md y CHANGELOG.
Riesgos
- False positives en repos con muchos archivos. Mitigacion: aplicar filtros estrictos, opcion
--ignore-filecon regex. - Lentitud: escanear todos los
git ls-filesde 32 sub-repos puede tardar segundos. Mitigacion: paralelizar por repo (goroutines). - Si encuentra secret real, exponerlo en stdout es contradictorio. Mitigacion: redactar el match (
AKIA****REDACTED****) en output.
Decisiones de diseno
- Mantener la deteccion bash (scan_secrets_repo) — es lo que usan los hooks. El orquestador Go solo agrega.
- Patterns hardcodeados al principio. Despues mover a archivo de config si crecen.
- NO integrar gitleaks/trufflehog — aumenta deps externas. Los patterns basicos cubren 95% de casos.