# Gestión de Secretos TZZR **Versión:** 5.0 **Fecha:** 2024-12-24 --- ## Estado Actual: Triple Gestión **PROBLEMA CRÍTICO:** Actualmente existen tres fuentes de secretos sin sincronización. ``` ┌─────────────────────────────────────────────────────────────────┐ │ FUENTES DE SECRETOS │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Infisical │ │ creds_* │ │ .env │ │ │ │ (central) │ │ (PostgreSQL)│ │ (archivos) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ❌ SIN SINCRONIZACIÓN - Riesgo de inconsistencia │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## Fuente 1: Infisical **URL:** http://localhost:8082 (ARCHITECT) **Estado:** Operativo ### Configuración ```bash # Acceso a Infisical infisical login infisical secrets --env=prod ``` ### Ventajas - Centralizado - Versionado - Auditable - SDK para múltiples lenguajes ### Uso Actual - Parcial - no todos los servicios lo usan --- ## Fuente 2: Tablas creds_* (PostgreSQL) **Base de datos:** architect **Estado:** Activo ### Tablas | Tabla | Contenido | |-------|-----------| | creds_ia | APIs de IA (OpenAI, Anthropic, etc.) | | creds_runpod | API keys de RunPod | | creds_r2 | Credenciales Cloudflare R2 | | creds_gitea | Tokens Gitea | | creds_mail | Credenciales SMTP | | creds_apis | APIs externas varias | ### Schema Típico ```sql CREATE TABLE creds_ia ( id SERIAL PRIMARY KEY, servicio VARCHAR(50) NOT NULL, api_key TEXT NOT NULL, descripcion TEXT, activo BOOLEAN DEFAULT true, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` ### Acceso ```sql -- Consultar credenciales sudo -u postgres psql -d architect -c "SELECT servicio, descripcion FROM creds_ia;" ``` --- ## Fuente 3: Archivos .env **Ubicaciones:** - /opt/clara/.env - /opt/alfred/.env - /opt/margaret/.env - /opt/mason/.env - /opt/feldman/.env ### ALERTA CRÍTICA ``` Permisos actuales: 644 (legibles por todos) Permisos correctos: 600 (solo propietario) ``` ### Contenido Típico ```bash # Ejemplo .env DB_HOST=localhost DB_PORT=5432 DB_NAME=corp DB_USER=margaret DB_PASSWORD=secreto_aqui # ⚠️ Expuesto si 644 R2_ACCESS_KEY=access_key_aqui R2_SECRET_KEY=secret_key_aqui # ⚠️ Expuesto si 644 ``` --- ## Decisión D-001: Migración a Infisical ### Objetivo Infisical como **única fuente de verdad** para todos los secretos. ### Plan de Migración ``` Fase 1: Inventario ├── Catalogar todos los secretos en creds_* ├── Catalogar todos los secretos en .env └── Identificar duplicados/inconsistencias Fase 2: Centralización ├── Migrar todos los secretos a Infisical ├── Organizar por proyecto/ambiente └── Establecer políticas de acceso Fase 3: Actualización de Servicios ├── CLARA: Usar Infisical SDK ├── MARGARET: Usar Infisical SDK ├── MASON: Usar Infisical SDK ├── FELDMAN: Usar Infisical SDK └── ALFRED/JARED: Usar Infisical SDK Fase 4: Deprecación ├── Eliminar archivos .env ├── Marcar creds_* como "solo referencia" └── Documentar proceso de rotación ``` ### Implementación con SDK ```python from infisical_client import InfisicalClient client = InfisicalClient( host="http://localhost:8082", token=INFISICAL_TOKEN ) # Obtener secreto db_password = client.get_secret( secret_name="DB_PASSWORD", project_id="tzzr", environment="production" ) ``` --- ## Rotación de Secretos ### Política Propuesta | Tipo | Frecuencia | Responsable | |------|------------|-------------| | API Keys externas | 90 días | Orchestrator | | Contraseñas DB | 180 días | DBA | | SSH Keys | 365 días | SysAdmin | | Tokens Gitea | 180 días | DevOps | ### Proceso de Rotación ``` 1. Generar nuevo secreto 2. Actualizar en Infisical 3. Desplegar servicios afectados 4. Verificar funcionamiento 5. Revocar secreto anterior 6. Documentar en changelog ``` --- ## Mitigación Inmediata ### Paso 1: Permisos .env ```bash # Ejecutar en todos los servidores # DECK ssh -i ~/.ssh/tzzr root@72.62.1.113 'chmod 600 /opt/clara/.env /opt/alfred/.env' # CORP ssh -i ~/.ssh/tzzr root@92.112.181.188 'chmod 600 /opt/margaret/.env /opt/mason/.env /opt/feldman/.env' ``` ### Paso 2: Auditoría ```bash # Verificar permisos ls -la /opt/*/.env # Buscar secretos expuestos grep -r "password\|secret\|key" /opt/*/ 2>/dev/null ``` --- ## Inventario de Secretos ### APIs de IA | Servicio | Ubicación Actual | Notas | |----------|------------------|-------| | OpenAI | creds_ia | GPT-4 | | Anthropic | creds_ia | Claude | | Replicate | creds_ia | Modelos varios | | RunPod | creds_runpod | GRACE, PENNY, FACTORY | ### Infraestructura | Servicio | Ubicación Actual | Notas | |----------|------------------|-------| | PostgreSQL | .env + creds_* | Múltiples usuarios | | R2/Cloudflare | .env + creds_r2 | Access + Secret key | | Gitea | .env + creds_gitea | Read + Write tokens | | SMTP | creds_mail | Mailcow | ### Servicios Externos | Servicio | Ubicación Actual | Notas | |----------|------------------|-------| | Stripe | creds_apis | (si aplica) | | Twilio | creds_apis | (si aplica) | | AWS | creds_apis | (si aplica) | --- ## Verificación de Seguridad ### Checklist Diario - [ ] Permisos .env son 600 - [ ] No hay secretos en logs - [ ] No hay secretos en commits git - [ ] Infisical accesible ### Comandos de Verificación ```bash # Verificar permisos find /opt -name ".env" -exec ls -la {} \; # Buscar secretos en git history git log -p | grep -i "password\|secret\|key\|token" # Verificar Infisical curl -s http://localhost:8082/api/v1/health ``` --- ## Buenas Prácticas ### DO (Hacer) - Usar Infisical para todos los secretos nuevos - Rotar secretos según política - Auditar accesos regularmente - Cifrar secretos en reposo ### DON'T (No Hacer) - Hardcodear secretos en código - Commitear .env a repositorios - Compartir secretos por chat/email - Usar el mismo secreto en múltiples servicios