293 lines
7.1 KiB
Markdown
293 lines
7.1 KiB
Markdown
|
|
# 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
|