Files
system-docs/04_SEGURIDAD/secretos.md
ARCHITECT 6d15abcb1a docs(v5): Complete system documentation
Comprehensive documentation for TZZR system v5 including:

- 00_VISION: Glossary and foundational philosophy
- 01_ARQUITECTURA: System overview and server specs
- 02_MODELO_DATOS: Entity definitions and data planes (T0, MST, BCK)
- 03_COMPONENTES: Agent docs (CLARA, MARGARET, FELDMAN, GRACE)
- 04_SEGURIDAD: Threat model and secrets management
- 05_OPERACIONES: Infrastructure and backup/recovery
- 06_INTEGRACIONES: GPU services (RunPod status: blocked)
- 99_ANEXOS: Repository inventory (24 repos)

Key findings documented:
- CRITICAL: UFW inactive on CORP/HST
- CRITICAL: PostgreSQL 5432 exposed
- CRITICAL: .env files with 644 permissions
- RunPod workers not starting (code ready in R2)
- Infisical designated as single source of secrets (D-001)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 17:58:03 +00:00

7.1 KiB

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

# 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

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

-- 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

# 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

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

# 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

# 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

# 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