ARCHITECT is the constructor, DECK/CORP are autonomous instances. Each instance must operate independently at runtime. Architecture: - Infisical (ARCHITECT): Central management, source of truth - Vaultwarden (DECK :8085): Local secrets for autonomous operation - Vaultwarden (CORP :8081): Local secrets for autonomous operation - Sync: Infisical → Vaultwarden propagation Key principle: Instances never depend on ARCHITECT at runtime. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
345 lines
10 KiB
Markdown
345 lines
10 KiB
Markdown
# Gestión de Secretos TZZR
|
|
|
|
**Versión:** 5.0
|
|
**Fecha:** 2024-12-24
|
|
|
|
---
|
|
|
|
## Arquitectura de Secretos
|
|
|
|
### Principio Fundamental
|
|
|
|
> **DECK y CORP son instancias autónomas. Deben operar independientemente de ARCHITECT.**
|
|
|
|
ARCHITECT es el constructor/coordinador. DECK y CORP son instancias diseñadas para trabajar solas.
|
|
|
|
### Modelo de Gestión
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ ARCHITECT │
|
|
│ (Constructor) │
|
|
│ │
|
|
│ ┌──────────────┐ │
|
|
│ │ Infisical │ ← Gestión centralizada │
|
|
│ │ :8082 │ Single source of truth │
|
|
│ └──────┬───────┘ │
|
|
│ │ │
|
|
└───────────────────────────┼─────────────────────────────────────┘
|
|
│
|
|
sync/push │ (en deploy o periódico)
|
|
│
|
|
┌────────────────┴────────────────┐
|
|
▼ ▼
|
|
┌──────────────────────┐ ┌──────────────────────┐
|
|
│ DECK │ │ CORP │
|
|
│ (Instancia) │ │ (Instancia) │
|
|
│ │ │ │
|
|
│ ┌──────────────┐ │ │ ┌──────────────┐ │
|
|
│ │ Vaultwarden │ │ │ │ Vaultwarden │ │
|
|
│ │ :8085 │ │ │ │ :8081 │ │
|
|
│ └──────┬───────┘ │ │ └──────┬───────┘ │
|
|
│ │ │ │ │ │
|
|
│ ▼ │ │ ▼ │
|
|
│ CLARA, ALFRED │ │ MARGARET, JARED │
|
|
│ leen de aquí │ │ MASON, FELDMAN │
|
|
│ │ │ leen de aquí │
|
|
└──────────────────────┘ └──────────────────────┘
|
|
```
|
|
|
|
### Gestores por Servidor
|
|
|
|
| Servidor | Gestor | Puerto | Rol |
|
|
|----------|--------|--------|-----|
|
|
| ARCHITECT | Infisical | 8082 | Gestión central, source of truth |
|
|
| DECK | Vaultwarden | 8085 | Operación autónoma DECK |
|
|
| CORP | Vaultwarden | 8081 | Operación autónoma CORP |
|
|
|
|
---
|
|
|
|
## Flujo de Secretos
|
|
|
|
### Administración (en ARCHITECT)
|
|
|
|
```
|
|
Administrador
|
|
│
|
|
▼
|
|
┌─────────────┐
|
|
│ Infisical │ ← Crear/modificar/rotar secretos aquí
|
|
│ (central) │
|
|
└─────────────┘
|
|
```
|
|
|
|
### Sincronización (ARCHITECT → Instancias)
|
|
|
|
```
|
|
Infisical (ARCHITECT)
|
|
│
|
|
│ Script de sync / deploy
|
|
│
|
|
├────────────────┬────────────────┐
|
|
▼ ▼ ▼
|
|
Vaultwarden Vaultwarden (otras instancias
|
|
DECK CORP futuras)
|
|
```
|
|
|
|
### Operación (en cada instancia)
|
|
|
|
```
|
|
┌──────────────────────────────────────┐
|
|
│ DECK │
|
|
│ │
|
|
│ CLARA ──────► Vaultwarden ◄─────── ALFRED
|
|
│ :8085 │
|
|
│ │
|
|
│ ✅ No depende de ARCHITECT │
|
|
│ ✅ Opera si ARCHITECT está caído │
|
|
└──────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Estado Actual: Problema
|
|
|
|
**Triple gestión sin sincronización:**
|
|
|
|
| Fuente | Ubicación | Estado |
|
|
|--------|-----------|--------|
|
|
| Infisical | ARCHITECT :8082 | Parcialmente usado |
|
|
| creds_* | PostgreSQL ARCHITECT | Activo |
|
|
| .env | /opt/*/.env en cada servidor | Activo, **permisos 644** |
|
|
|
|
**Problemas:**
|
|
- Secretos duplicados en múltiples lugares
|
|
- Sin sincronización entre fuentes
|
|
- .env legibles por todos (644)
|
|
- Vaultwarden de DECK/CORP no integrados
|
|
|
|
---
|
|
|
|
## Decisión D-001: Arquitectura de Secretos
|
|
|
|
### Objetivo
|
|
|
|
1. **Infisical** (ARCHITECT): Única fuente de verdad para administración
|
|
2. **Vaultwarden** (DECK/CORP): Gestores locales para operación autónoma
|
|
3. **Sync**: Mecanismo de propagación Infisical → Vaultwarden
|
|
|
|
### División de Responsabilidades
|
|
|
|
| Tipo de Secreto | Gestión en | Operación en |
|
|
|-----------------|------------|--------------|
|
|
| API keys externas (OpenAI, etc.) | Infisical | Vaultwarden local |
|
|
| R2 credentials | Infisical | Vaultwarden local |
|
|
| Gitea tokens | Infisical | Vaultwarden local |
|
|
| DB password DECK | Infisical | Vaultwarden DECK |
|
|
| DB password CORP | Infisical | Vaultwarden CORP |
|
|
| Tokens internos DECK | Infisical | Vaultwarden DECK |
|
|
| Tokens internos CORP | Infisical | Vaultwarden CORP |
|
|
|
|
### Flujo de Trabajo
|
|
|
|
```
|
|
1. Admin modifica secreto en Infisical (ARCHITECT)
|
|
│
|
|
▼
|
|
2. Script de sync detecta cambio
|
|
│
|
|
▼
|
|
3. Propaga a Vaultwarden de DECK y/o CORP
|
|
│
|
|
▼
|
|
4. Servicios locales usan Vaultwarden local
|
|
│
|
|
▼
|
|
5. ARCHITECT puede caer → DECK/CORP siguen operando
|
|
```
|
|
|
|
---
|
|
|
|
## Plan de Migración
|
|
|
|
### Fase 1: Inventario
|
|
|
|
```
|
|
├── Catalogar todos los secretos en creds_*
|
|
├── Catalogar todos los secretos en .env
|
|
├── Identificar duplicados/inconsistencias
|
|
└── Mapear qué secretos necesita cada instancia
|
|
```
|
|
|
|
### Fase 2: Centralización en Infisical
|
|
|
|
```
|
|
├── Migrar todos los secretos a Infisical
|
|
├── Organizar por instancia (DECK, CORP)
|
|
├── Establecer políticas de acceso
|
|
└── Documentar cada secreto
|
|
```
|
|
|
|
### Fase 3: Configurar Vaultwarden en Instancias
|
|
|
|
```
|
|
├── DECK: Configurar Vaultwarden :8085
|
|
│ ├── Crear organización "DECK"
|
|
│ ├── Importar secretos de DECK desde Infisical
|
|
│ └── Configurar acceso para servicios
|
|
│
|
|
└── CORP: Configurar Vaultwarden :8081
|
|
├── Crear organización "CORP"
|
|
├── Importar secretos de CORP desde Infisical
|
|
└── Configurar acceso para servicios
|
|
```
|
|
|
|
### Fase 4: Implementar Sync
|
|
|
|
```
|
|
├── Crear script de sincronización
|
|
│ └── infisical export → vaultwarden import
|
|
├── Configurar trigger (manual, cron, o webhook)
|
|
└── Probar sync en ambas direcciones
|
|
```
|
|
|
|
### Fase 5: Actualizar Servicios
|
|
|
|
```
|
|
├── CLARA: Leer de Vaultwarden DECK
|
|
├── ALFRED: Leer de Vaultwarden DECK
|
|
├── MARGARET: Leer de Vaultwarden CORP
|
|
├── JARED: Leer de Vaultwarden CORP
|
|
├── MASON: Leer de Vaultwarden CORP
|
|
└── FELDMAN: Leer de Vaultwarden CORP
|
|
```
|
|
|
|
### Fase 6: Deprecación
|
|
|
|
```
|
|
├── Eliminar archivos .env
|
|
├── Marcar creds_* como "solo referencia histórica"
|
|
└── Documentar proceso completo
|
|
```
|
|
|
|
---
|
|
|
|
## Implementación
|
|
|
|
### Lectura desde Vaultwarden (Python)
|
|
|
|
```python
|
|
import requests
|
|
|
|
VAULTWARDEN_URL = "http://localhost:8085" # DECK
|
|
# VAULTWARDEN_URL = "http://localhost:8081" # CORP
|
|
|
|
def get_secret(name: str) -> str:
|
|
"""Obtiene secreto de Vaultwarden local."""
|
|
# Implementar según API de Vaultwarden/Bitwarden
|
|
pass
|
|
```
|
|
|
|
### Script de Sync (Infisical → Vaultwarden)
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# /opt/scripts/sync_secrets.sh
|
|
|
|
# Exportar desde Infisical
|
|
infisical export --env=deck --format=json > /tmp/deck_secrets.json
|
|
infisical export --env=corp --format=json > /tmp/corp_secrets.json
|
|
|
|
# Importar a Vaultwarden DECK
|
|
ssh deck 'bw import --format json /tmp/deck_secrets.json'
|
|
|
|
# Importar a Vaultwarden CORP
|
|
ssh corp 'bw import --format json /tmp/corp_secrets.json'
|
|
|
|
# Cleanup
|
|
rm /tmp/*_secrets.json
|
|
```
|
|
|
|
---
|
|
|
|
## Mitigación Inmediata
|
|
|
|
### Paso 1: Permisos .env (URGENTE)
|
|
|
|
```bash
|
|
# 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: Verificar Vaultwarden
|
|
|
|
```bash
|
|
# DECK
|
|
curl -s http://72.62.1.113:8085/api/health
|
|
|
|
# CORP
|
|
curl -s http://92.112.181.188:8081/api/health
|
|
```
|
|
|
|
---
|
|
|
|
## Rotación de Secretos
|
|
|
|
### Política
|
|
|
|
| Tipo | Frecuencia | Responsable |
|
|
|------|------------|-------------|
|
|
| API Keys externas | 90 días | Admin vía Infisical |
|
|
| Contraseñas DB | 180 días | Admin vía Infisical |
|
|
| SSH Keys | 365 días | Admin vía Infisical |
|
|
| Tokens Gitea | 180 días | Admin vía Infisical |
|
|
|
|
### Proceso
|
|
|
|
```
|
|
1. Rotar en Infisical (ARCHITECT)
|
|
2. Ejecutar sync a Vaultwarden (DECK/CORP)
|
|
3. Verificar servicios operando
|
|
4. Documentar rotación
|
|
```
|
|
|
|
---
|
|
|
|
## Verificación
|
|
|
|
### Checklist
|
|
|
|
- [ ] Infisical operativo en ARCHITECT
|
|
- [ ] Vaultwarden operativo en DECK (:8085)
|
|
- [ ] Vaultwarden operativo en CORP (:8081)
|
|
- [ ] Sync configurado y probado
|
|
- [ ] Servicios leen de Vaultwarden local
|
|
- [ ] .env eliminados o con permisos 600
|
|
- [ ] DECK opera si ARCHITECT cae
|
|
- [ ] CORP opera si ARCHITECT cae
|
|
|
|
### Test de Autonomía
|
|
|
|
```bash
|
|
# 1. Detener ARCHITECT (simulado)
|
|
# 2. Verificar DECK sigue operando
|
|
curl http://72.62.1.113:5051/health # CLARA
|
|
|
|
# 3. Verificar CORP sigue operando
|
|
curl http://92.112.181.188:5051/health # MARGARET
|
|
```
|
|
|
|
---
|
|
|
|
## Resumen
|
|
|
|
| Componente | Rol |
|
|
|------------|-----|
|
|
| **Infisical (ARCHITECT)** | Gestión centralizada, source of truth |
|
|
| **Vaultwarden (DECK)** | Operación autónoma instancia personal |
|
|
| **Vaultwarden (CORP)** | Operación autónoma instancia empresarial |
|
|
| **Sync** | Propagación de cambios |
|
|
|
|
**Principio clave:** Las instancias (DECK, CORP) nunca dependen de ARCHITECT en runtime.
|