Volver a la wiki

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)

CredencialTipoSistemaDónde viveCriticidad
DJANGO_SECRET_KEYclave firma/cifradoDjangoDokploy env (base.py)🔴
CREDENTIAL_ENCRYPTION_KEYclave cifrado at-restcreds SSH/SNMP de clienteDokploy env🔴 (difiere STAGE≠PROD a propósito)
CREDENTIAL_ENCRYPTION_KEY_OLDclave previa (rotación)igualDokploy env🟡
POSTGRES_PASSWORDpassword DB superuser (solo administración desde s215)PostgreSQL 18Dokploy env + DATABASE_URL pgbouncer🔴
APP_DB_USER / APP_DB_PASSWORDrol de la APP crearack_app (NOSUPERUSER NOBYPASSRLS — el que activa RLS; auditoría 2026-07, ventana 1g)PostgreSQL 18Dokploy env PROD (STAGE pendiente, task #191); difiere STAGE≠PROD a propósito🔴
REDIS_PASSWORDpasswordValkeyDokploy env🔴
dani_readonlypassword DB SELECT-onlyPostgreSQLDB PROD (túnel SSH)🟡
AGENT_JWT_SECRETclave firma JWTLocal AgentDokploy env🔴
INTERNAL_TOOLS_TOKENBearerendpoints internosDokploy env🟡

2 · IA / LLM

CredencialTipoSistemaDónde viveCriticidad
GEMINI_API_KEYAPI keyGoogle AI Studio (SaaS)Dokploy env🔴
GOOGLE_AI_API_KEYAPI keyGoogle AI Studio (workspace/Oráculo)CF Pages env + Worker🔴
ANTHROPIC_API_KEYAPI keyAnthropic (Bibliotecario-Ingest)Dokploy + GH Secrets ×2 + CF Pages🟡 (coste)
Planes Claude Max ×3suscripciónAnthropiccuentas personales Edu/Dani/Txell🟡

Ojo: GEMINI_API_KEY y GOOGLE_AI_API_KEY = misma cuenta GCP, posiblemente dos keys distintas. Confirmar y documentar por separado (rotar una no debe romper la otra).

3 · Cloudflare

CredencialTipoDónde viveCriticidad
CF_ACCESS_CLIENT_ID / _SECRETservice token (compartido)env User ×3 + GH Secrets ×2 + Dokploy + Hetzner /opt/*/.cf-access🔴
CLOUDFLARE_API_TOKENAPI 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_TOKENAPI token (D1)GH Secrets workspace🟡
Login Cloudflare + 2FApasswordgestor de Edu🔴 break-glass

4 · Hetzner / servidores / backups

CredencialTipoDónde viveCriticidad
Login Hetzner + 2FApasswordgestor de Edu🔴 break-glass
HETZNER_API_TOKENAPI tokenCF Pages env🟡
rclone [hetzner] S3 (key id+secret)S3 creds/root/.config/rclone/rclone.conf PROD🔴 (backups)
rclone gdriveOAuthrclone config STAGE🟡
SSH keys Ed25519 ×3clave SSH root~/.ssh de cada dev🔴 break-glass (personales)
SSH+sudo DCA (62.238.33.149)clave+passwordgestor de Edu🟡 (otro proyecto)
NetBird setup key + SSOsetup keypanel NetBird🟡 (puerta red interna)
Login Dokploy + 2FA (TOTP)user+pass+TOTPpersonal🔴 break-glass
Basic Auth mirror DR (admindomo)user/password htpasswd/etc/nginx/.htpasswd + bóveda🟡 (rotada 02-07-2026)

5 · MCP / Workspace / Harness

CredencialTipoDónde viveCriticidad
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_SECRETHMACCF Pages env🔴
MCP_READONLY_TOKENStokens read-onlyCF Pages env🟡
BIB_MCP_TOKEN (parte per-user de MCP_TOKENS)Bearerenv User Windows ×3🟡
MAINTENANCE_AGENT_TOKENBearerCF Pages env🟡
METHOD_DOCTOR_TOKENBearerenv User ×3 (Edu/Dani/Txell) + CF Pages🟢
DR_MAINTENANCE_TOKENBearer (acotado a /api/maintenance/*)CF Pages env + /opt/dr-backups/.token STAGE🟡
CURATOR_CRON_TOKENBearerCF Pages env🟢
AGENT_JWT_SECRET · WORKSPACE_API_KEY · WORKSPACE_MCP_TOKENver Grupo 1 / integración Pro↔WSDokploy + CF Pages🟡
.cf-access (id+secret)CF Access service tokenficheros STAGE (chmod 600)referencia de CF_ACCESS_*

s185: el token DR del cron de backup se desacopló de MCP_TOKENS a su propia var DR_MAINTENANCE_TOKEN (acotada a los endpoints de backup). El par DR: 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 par DR: quedó por fin ELIMINADO también del valor (la neutralización por código se mantiene como defensa).

6 · GitHub

CredencialTipoDónde viveCaducaCriticidad
GH_PATPATCF Pages env + GH Secretssí (fecha no doc.)🔴
GITHUB_TOKEN (app Dokploy)token/PATDokploy envsi PAT🟡
WORKSPACE_REPO_TOKEN/_PATPAT fine-grainedGH Secrets Prosin fecha🟡
ATLAS_CHECK_PATPATGH Secrets workspace⚠️ sin fecha🟡
CLAUDE_METHOD_DEPLOY_KEYdeploy key SSHGH Secrets workspace—🟡
routine-maintenance-weeklyPAT read-only (inactivo)gestor de Edu~13-05-2027🟢
gh-actions-watchdogPAT 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 + 2FApasswordgestor 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

CredencialTipoDónde viveCriticidad
RESEND_API_KEYAPI keyDokploy + CF Pages + fichero Alertmanager🟡
ZOHO_CLIENT_ID/_SECRET/ZOHO_TOKEN_KEYOAuth + clave AES-GCMCF Pages env🟡
Zoho refresh_token per-userOAuth refreshD1 zoho_oauth_tokens (cifrados)🟡
Buzones Zoho staff + 8 grupospasswordgestor de cada persona (factu/legal = Txell)🟡
HOLDED_API_KEYAPI keyCF Pages env🔴 (financiero)
Login Holdedpasswordgestor de Txell (owner)🟡
UPTIMEROBOT_API_KEY + loginAPI key + passwordCF 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)

Credenciales multi-ubicación (rotar TODOS sus puntos a la vez)

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)

  1. ✅ 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 par DR: viejo quedó neutralizado por código y /opt/dr-backups/.token de STAGE actualizado. El valor viejo ya no valida.
  2. POSTGRES_PASSWORD dev hardcodeado en compose.yml (solo dev; sacar a .env no versionado).
  3. Verificar que PROD nunca cae al fallback de DJANGO_SECRET_KEY (base.py).
  4. Copia única de los 12 secrets de PROD (solo BD de Dokploy) → Bitwarden lo cierra.
  5. ✅ METHOD_DOCTOR_TOKEN provisionado en los 3 perfiles (verificado s187, 02-07-2026) — el rollup de paridad muestra edu/dani/txell en verde.

Véase también

Subir