Inventario de Secretos — mapa técnico SIN valores (para Bitwarden + DR)
Inventario de Secretos — mapa técnico (SIN valores)
Qué es: el mapa completo de credenciales/tokens/claves del ecosistema — solo nombre técnico, dónde vive y metadatos, NUNCA el valor. Sirve para (a) migrar a la bóveda (Bitwarden Teams, task #33), (b) el plan de DR (saber qué regenerar), (c) onboarding/offboarding (qué provisionar/revocar), (d) rotación (qué puntos tocar por credencial). Generado en la auditoría s185 (02-07-2026) por barrido de compose/wrangler/workflows/settings/memorias. Los VALORES viven solo en la bóveda del equipo.
Complemento de [[crearack-tech—guides—seguridad-y-backups]] (el manual) y [[entity—ops—catalogo-servicios-externos]] (los servicios). 63 credenciales activas + 3 retiradas.
Cómo leer la criticidad
🔴 su pérdida/compromiso rompe algo grave o da acceso raíz · 🟡 impacto medio (coste, un servicio) · 🟢 bajo (degrada limpio).
1 · Núcleo cripto / datos del SaaS (Dokploy PROD, compose.prod.yml)
| Credencial | Tipo | Sistema | Dónde vive | Criticidad |
|---|---|---|---|---|
DJANGO_SECRET_KEY | clave firma/cifrado | Django | Dokploy env (base.py) | 🔴 |
CREDENTIAL_ENCRYPTION_KEY | clave cifrado at-rest | creds SSH/SNMP de cliente | Dokploy env | 🔴 (difiere STAGE≠PROD a propósito) |
CREDENTIAL_ENCRYPTION_KEY_OLD | clave previa (rotación) | igual | Dokploy env | 🟡 |
POSTGRES_PASSWORD | password DB superuser (solo administración desde s215) | PostgreSQL 18 | Dokploy env + DATABASE_URL pgbouncer | 🔴 |
APP_DB_USER / APP_DB_PASSWORD | rol de la APP crearack_app (NOSUPERUSER NOBYPASSRLS — el que activa RLS; auditoría 2026-07, ventana 1g) | PostgreSQL 18 | Dokploy env PROD (STAGE pendiente, task #191); difiere STAGE≠PROD a propósito | 🔴 |
REDIS_PASSWORD | password | Valkey | Dokploy env | 🔴 |
dani_readonly | password DB SELECT-only | PostgreSQL | DB PROD (túnel SSH) | 🟡 |
AGENT_JWT_SECRET | clave firma JWT | Local Agent | Dokploy env | 🔴 |
INTERNAL_TOOLS_TOKEN | Bearer | endpoints internos | Dokploy env | 🟡 |
2 · IA / LLM
| Credencial | Tipo | Sistema | Dónde vive | Criticidad |
|---|---|---|---|---|
GEMINI_API_KEY | API key | Google AI Studio (SaaS) | Dokploy env | 🔴 |
GOOGLE_AI_API_KEY | API key | Google AI Studio (workspace/Oráculo) | CF Pages env + Worker | 🔴 |
ANTHROPIC_API_KEY | API key | Anthropic (Bibliotecario-Ingest) | Dokploy + GH Secrets ×2 + CF Pages | 🟡 (coste) |
| Planes Claude Max ×3 | suscripción | Anthropic | cuentas personales Edu/Dani/Txell | 🟡 |
Ojo:
GEMINI_API_KEYyGOOGLE_AI_API_KEY= misma cuenta GCP, posiblemente dos keys distintas. Confirmar y documentar por separado (rotar una no debe romper la otra).
3 · Cloudflare
| Credencial | Tipo | Dónde vive | Criticidad |
|---|---|---|---|
CF_ACCESS_CLIENT_ID / _SECRET | service token (compartido) | env User ×3 + GH Secrets ×2 + Dokploy + Hetzner /opt/*/.cf-access | 🔴 |
CLOUDFLARE_API_TOKEN | API token (deploy Pages) | GH Secrets workspace | 🔴 |
hetzner-cf-pages-deploy (workspace, s188) | API token (scope Pages Write) | Hetzner STAGE /opt/cf-pages-deploy/.env (600) | 🟡 (deploy del sitio desde el Super-Cron; revocable en CF → el fallback es re-habilitar el workflow) |
ops-d1-migrations = CLOUDFLARE_D1_TOKEN (workspace, s323 · 11-09-2026) | API token (scope D1 Edit, cuenta de Edu) | OPS /opt/cf-pages-deploy/.env (600), variable propia junto al de Pages | 🟡 (aplica las migraciones D1 del workspace en el deploy; revocable en CF → el deploy queda en FAIL “falta CLOUDFLARE_D1_TOKEN” hasta reponerlo) |
CLOUDFLARE_D1_TOKEN | API token (D1) | GH Secrets workspace | 🟡 |
| Login Cloudflare + 2FA | password | gestor de Edu | 🔴 break-glass |
4 · Hetzner / servidores / backups
| Credencial | Tipo | Dónde vive | Criticidad |
|---|---|---|---|
| Login Hetzner + 2FA | password | gestor de Edu | 🔴 break-glass |
HETZNER_API_TOKEN | API token | CF Pages env | 🟡 |
rclone [hetzner] S3 (key id+secret) | S3 creds | /root/.config/rclone/rclone.conf PROD | 🔴 (backups) |
rclone gdrive | OAuth | rclone config STAGE | 🟡 |
| SSH keys Ed25519 ×3 | clave SSH root | ~/.ssh de cada dev | 🔴 break-glass (personales) |
SSH+sudo DCA (62.238.33.149) | clave+password | gestor de Edu | 🟡 (otro proyecto) |
| NetBird setup key + SSO | setup key | panel NetBird | 🟡 (puerta red interna) |
| Login Dokploy + 2FA (TOTP) | user+pass+TOTP | personal | 🔴 break-glass |
Basic Auth mirror DR (admindomo) | user/password htpasswd | /etc/nginx/.htpasswd + bóveda | 🟡 (rotada 02-07-2026) |
5 · MCP / Workspace / Harness
| Credencial | Tipo | Dónde vive | Criticidad |
|---|---|---|---|
MCP_TOKENS (Edu:/Dani:/Txell:/CI:) | Bearer per-user + token CI (Actions/crons OPS). Última rotación 13-08-2026 (onboarding estación Dani/Txell, ejecutó Edu+Claude): tokens de Dani y Txell REGENERADOS (los previos se perdieron con las VMs Proxmox destruidas), Edu y CI conservados, par legacy DR: eliminado de la var. Verificada: basura→401, Dani/Txell→200, CI→200 desde OPS. Anterior: 10-07-2026 (s216); desde entonces .mcp.json usa ${BIB_MCP_TOKEN} | CF Pages env | 🔴 |
MCP_SIGNING_SECRET | HMAC | CF Pages env | 🔴 |
MCP_READONLY_TOKENS | tokens read-only | CF Pages env | 🟡 |
BIB_MCP_TOKEN (parte per-user de MCP_TOKENS) | Bearer | env User Windows ×3 | 🟡 |
MAINTENANCE_AGENT_TOKEN | Bearer | CF Pages env | 🟡 |
METHOD_DOCTOR_TOKEN | Bearer | env User ×3 (Edu/Dani/Txell) + CF Pages | 🟢 |
DR_MAINTENANCE_TOKEN | Bearer (acotado a /api/maintenance/*) | CF Pages env + /opt/dr-backups/.token STAGE | 🟡 |
CURATOR_CRON_TOKEN | Bearer | CF Pages env | 🟢 |
AGENT_JWT_SECRET · WORKSPACE_API_KEY · WORKSPACE_MCP_TOKEN | ver Grupo 1 / integración Pro↔WS | Dokploy + CF Pages | 🟡 |
.cf-access (id+secret) | CF Access service token | ficheros STAGE (chmod 600) | referencia de CF_ACCESS_* |
s185: el token DR del cron de backup se desacopló de
MCP_TOKENSa su propia varDR_MAINTENANCE_TOKEN(acotada a los endpoints de backup). El parDR:histórico quedó neutralizado por código (_middleware.ts+mcp/index.ts). Rotar el DR ya NO obliga a tocar los tokens del equipo. 13-08-2026: al reescribir la var entera en la rotación del onboarding, el parDR:quedó por fin ELIMINADO también del valor (la neutralización por código se mantiene como defensa).
6 · GitHub
| Credencial | Tipo | Dónde vive | Caduca | Criticidad |
|---|---|---|---|---|
GH_PAT | PAT | CF Pages env + GH Secrets | sí (fecha no doc.) | 🔴 |
GITHUB_TOKEN (app Dokploy) | token/PAT | Dokploy env | si PAT | 🟡 |
WORKSPACE_REPO_TOKEN/_PAT | PAT fine-grained | GH Secrets Pro | sin fecha | 🟡 |
ATLAS_CHECK_PAT | PAT | GH Secrets workspace | ⚠️ sin fecha | 🟡 |
CLAUDE_METHOD_DEPLOY_KEY | deploy key SSH | GH Secrets workspace | — | 🟡 |
routine-maintenance-weekly | PAT read-only (inactivo) | gestor de Edu | ~13-05-2027 | 🟢 |
gh-actions-watchdog | PAT fine-grained (resource owner CreaRackSL; Actions RW + Contents RO, solo Pro+workspace) | /opt/gh-actions-watchdog/.token en OPS (chmod 600) | SIN caducidad (“no expiration” — verificado por Edu en GitHub Settings, 04-07-2026) | 🟡 |
| Login GitHub org + 2FA | password | gestor de Edu | — | 🔴 break-glass |
7 · OAuth login social (allauth)
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET / GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET — todos en Dokploy env (base.py), 🟡, rotables en su consola.
8 · Email / Zoho / negocio / monitorización
| Credencial | Tipo | Dónde vive | Criticidad |
|---|---|---|---|
RESEND_API_KEY | API key | Dokploy + CF Pages + fichero Alertmanager | 🟡 |
ZOHO_CLIENT_ID/_SECRET/ZOHO_TOKEN_KEY | OAuth + clave AES-GCM | CF Pages env | 🟡 |
Zoho refresh_token per-user | OAuth refresh | D1 zoho_oauth_tokens (cifrados) | 🟡 |
| Buzones Zoho staff + 8 grupos | password | gestor de cada persona (factu/legal = Txell) | 🟡 |
HOLDED_API_KEY | API key | CF Pages env | 🔴 (financiero) |
| Login Holded | password | gestor de Txell (owner) | 🟡 |
UPTIMEROBOT_API_KEY + login | API key + password | CF Pages env / gestor de Edu | 🟡 |
9 · Retirados / prohibidos (NO migrar)
DEEPSEEK_API_KEY (revocada 16-05-2026) · GROUPDOCS_CLIENT_ID (revocada 16-05-2026) · OPENROUTER_API_KEY (declarada en functions/types.ts sin caller, prohibida Regla 8 → limpiar del interface).
Credenciales con caducidad (registrar recordatorio)
- ~13-05-2027: PAT
routine-maintenance-weekly(hoy inactivo). - Sin fecha pero caducan → poner recordatorio al cargarlas en Bitwarden:
GH_PAT,WORKSPACE_REPO_TOKEN,ATLAS_CHECK_PAT,GITHUB_TOKENapp. - No caducan salvo revocación:
HOLDED_API_KEY,HETZNER_API_TOKEN, PATgh-actions-watchdog(verificado 04-07-2026).
Credenciales multi-ubicación (rotar TODOS sus puntos a la vez)
CF_ACCESS_CLIENT_ID/SECRET→ 5+ sitios (env User ×3, GH Secrets ×2, Dokploy PROD/STAGE, ficheros Hetzner).MCP_TOKENS/BIB_MCP_TOKEN→ CF Pages + env User ×3 + Hetzner/opt/dr-backups/.token.RESEND_API_KEY→ Dokploy + CF Pages + fichero Alertmanager.ANTHROPIC_API_KEY→ Dokploy + GH Secrets ×2 repos + CF Pages.POSTGRES_PASSWORD→ env +DATABASE_URL+ patrones deINFRA.md.
Bitwarden: en el campo de notas de cada credencial multi-ubicación, pegar su checklist de puntos de consumo.
Estructura de colecciones Bitwarden (propuesta)
00 Break-glass (logins+2FA+SSH keys+claves cripto — MFA obligatorio, visibilidad restringida) · 01 Base de datos · 02 Cloudflare · 03 Hetzner/Servidores/Backups · 04 IA · 05 MCP/Harness · 06 GitHub · 07 OAuth social · 08 Email/Comms · 09 Negocio/ERP · 10 Retirados (trazabilidad de revocación).
Marcar personales/por-persona (no compartidas): SSH keys, BIB_MCP_TOKEN, planes Max, buzones Zoho, parte propia de MCP_TOKENS.
Higiene pendiente (auditoría s185)
- ✅ Token DR rotado + desacoplado (02-07-2026) — estaba en claro en un fichero de memoria (limpiado). Se movió a
DR_MAINTENANCE_TOKEN(var propia, acotada a/api/maintenance/*), el parDR:viejo quedó neutralizado por código y/opt/dr-backups/.tokende STAGE actualizado. El valor viejo ya no valida. POSTGRES_PASSWORDdev hardcodeado encompose.yml(solo dev; sacar a.envno versionado).- Verificar que PROD nunca cae al fallback de
DJANGO_SECRET_KEY(base.py). - Copia única de los 12 secrets de PROD (solo BD de Dokploy) → Bitwarden lo cierra.
- ✅
METHOD_DOCTOR_TOKENprovisionado en los 3 perfiles (verificado s187, 02-07-2026) — el rollup de paridad muestra edu/dani/txell en verde.
Véase también
- [[crearack-tech—guides—seguridad-y-backups]]
- [[entity—ops—catalogo-servicios-externos]]
- [[runbook—infra—rotate-mcp-token]]