Fase 2: 04_sanitize.py - scrubbing de secretos de skills/agentes/plans (10 secretos unicos, gate en verde)

This commit is contained in:
2026-07-29 00:35:59 +00:00
parent 21bc219f31
commit 837f91060f
79 changed files with 10153 additions and 0 deletions
@@ -0,0 +1,141 @@
# Plan: Conectar PostgreSQL de Luminarrh de forma segura y encriptada
## Contexto
Tienes una base de datos PostgreSQL (imagen `postgres:18`) corriendo en Docker en tu Synology NAS, contenida en `luminarrh/`. Actualmente:
- **Sin encriptación**: No hay SSL configurado en PostgreSQL
- **Puerto expuesto**: 5436 → 5432 sin restricción de hosts
- **Sin pg_hba.conf**: No hay control de acceso por IP ni requisito de SSL
Necesitas que la base se conecte de forma **segura y encriptada** desde:
1. **Internet** → dominio `senabed.p-lao.com`
2. **Red local** → rango `<<INTERNAL_IP_2>>/24`
Tú te encargas del enrutamiento y port forwarding del router. La contraseña se mantiene igual (`<<DB_PASSWORD_1>>`).
---
## Pasos de implementación
### 1. Generar certificado SSL
Generar un certificado SSL autofirmado para el dominio `senabed.p-lao.com`:
```bash
# Generar clave privada y certificado
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /home/aleleba/projects/synology-apps-containers/luminarrh/ssl/server.key \
-out /home/aleleba/projects/synology-apps-containers/luminarrh/ssl/server.crt \
-subj "/CN=senabed.p-lao.com" \
-addext "subjectAltName=DNS:senabed.p-lao.com"
```
Los archivos se guardan en `luminarrh/ssl/` y se montan como solo lectura en el contenedor.
### 2. Actualizar `postgresql.conf`
Agregar configuración SSL y restricciones de red:
```conf
# Conexiones
listen_addresses = '*'
max_connections = 500
# SSL
ssl = on
ssl_cert_file = '/etc/postgresql/ssl/server.crt'
ssl_key_file = '/etc/postgresql/ssl/server.key'
ssl_min_protocol_version = 'TLSv1.2'
# Memoria
shared_buffers = 2GB
maintenance_work_mem = 128MB
# Timezone
timezone = 'America/Guatemala'
log_timezone = 'America/Guatemala'
```
### 3. Crear `pg_hba.conf` con control de acceso
Crear un archivo `pg_hba.conf` que:
- **Requiera SSL** para todas las conexiones externas
- **Restrinja por IP** a `<<INTERNAL_IP_2>>/24` (red local) y la IP pública del NAS (desde internet)
- Permita conexiones locales sin SSL (dentro del contenedor)
```conf
# TYPE DATABASE USER ADDRESS METHOD
# Conexión local (dentro del contenedor) - sin SSL requerido
local all all peer
# Conexiones desde red local <<INTERNAL_IP_2>>/24 - SSL requerido
hostssl all all <<INTERNAL_IP_2>>/24 scram-sha256
# Conexiones desde internet (IP pública del NAS) - SSL requerido
hostssl all sarh2 <IP_PUBLICA_NAS>/32 scram-sha256
# Rechazar todo lo demás
host all all 0.0.0.0/0 reject
```
Se usa `hostssl` (no `host`) para que PostgreSQL **rechace automáticamente** cualquier conexión que no use SSL.
### 4. Actualizar `docker-compose.yaml`
```yaml
version: '3.8'
services:
postgres-luminarrh:
image: postgres:18
restart: always
environment:
POSTGRES_USER: sarh2
POSTGRES_PASSWORD: <<DB_PASSWORD_1>>
POSTGRES_DB: sarh_db
PGDATA: /var/lib/postgresql/18/docker
ports:
- '5436:5432/tcp'
network_mode: databases
volumes:
- /volume1/docker/postgres/postgres-luminarrh/data:/var/lib/postgresql
- /volume1/docker/projects/synology-apps-containers/luminarrh/postgresql.conf:/etc/postgresql/postgresql.conf
- /volume1/docker/projects/synology-apps-containers/luminarrh/luminarrh_demo.sql:/docker-entrypoint/initdb.d/luminarrh_demo.sql
- /volume1/docker/projects/synology-apps-containers/luminarrh/pg_hba.conf:/etc/postgresql/pg_hba.conf
- /volume1/docker/projects/synology-apps-containers/luminarrh/ssl:/etc/postgresql/ssl:ro
command: postgres -c config_file=/etc/postgresql/postgresql.conf -c hba_file=/etc/postgresql/pg_hba.conf
```
Cambios clave:
- **Eliminar puerto UDP** (5432/udp) — PostgreSQL no lo usa
- **Mount del SSL** como `ro` (solo lectura)
- **Mount del pg_hba.conf** explícito
- **Mantener contraseña** `<<DB_PASSWORD_1>>`
### 5. Crear README.md como guía de conexión
Crear `luminarrh/README.md` con instrucciones completas de cómo conectarse usando el certificado SSL.
---
## Resumen de archivos a modificar/crear
| Archivo | Acción |
|---------|--------|
| `luminarrh/postgresql.conf` | **Modificar** — agregar SSL, TLS min version |
| `luminarrh/pg_hba.conf` | **Crear** — control de acceso por IP + SSL (hostssl) |
| `luminarrh/docker-compose.yaml` | **Modificar** — mounts SSL, eliminar UDP |
| `luminarrh/ssl/server.key` | **Crear** — clave privada SSL |
| `luminarrh/ssl/server.crt` | **Crear** — certificado SSL |
| `luminarrh/README.md` | **Crear** — guía de conexión con certificado |
---
## Verificación (la hacemos juntos)
1. **Verificar psql instalado**: `psql --version` — si no está, instalar `postgresql-client`
2. **Verificar SSL activo**: `psql "host=senabed.p-lao.com port=5436 dbname=sarh_db user=sarh2 sslmode=require sslcert=... sslkey=... sslrootcert=..."` — debe conectar sin error
3. **Verificar rechazo sin SSL**: `psql "host=senabed.p-lao.com port=5436 dbname=sarh_db user=sarh2 sslmode=disable"` — debe rechazar
4. **Verificar conexión desde red local**: intentar conectar desde un host en `<<INTERNAL_IP_2>>/24` con SSL — debe conectar
5. **Verificar logs**: revisar `/var/log/postgresql/` para ver conexiones aceptadas/rechazadas