Nueve issues nuevos cubriendo deudas tecnicas descubiertas tras ejecutar fn doctor por primera vez: - 0054 deploy_server: reimplementa SSH/systemd/rsync inline en lugar de usar funciones del registry (alta). - 0055 docker_tui: usa docker CLI directo via shell en lugar de docker_* del registry (alta). - 0056 audit_uses_functions: heuristica Python no detecta `from pkg.subpkg import X` (media). - 0057 audit_uses_functions: deteccion de simbolos Go con abreviaturas falla en algunos casos (baja). - 0058 kanban uses_functions sync deferido por WIP en curso (baja). - 0059 doble tracking de apps/*/app.md (fn_registry + sub-repo) inconsistencia (media). - 0060 fn doctor secrets: subcomando para audit secrets en TODOS los repos (media). - 0061 integrar notify_telegram en deploy_server + bucle reactivo (media, depende de 0054). - 0062 politica de deprecacion para 704 funciones sin consumidores (baja, research). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.6 KiB
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.