# 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/`. **Estado inicial:** - Sin encriptación SSL configurada - Puerto 5436 expuesto sin restricción de hosts - Sin control de acceso por IP **Estado actual (implementado):** - SSL/TLS obligatorio para todas las conexiones externas - Autenticación `scram-sha256` (hash fuerte) - TLS 1.2 mínimo - Cualquier IP puede conectar desde internet, pero **solo con SSL + credenciales** - Red local `<>/24` también con SSL obligatorio --- ## Archivos implementados ### 1. `luminarrh/postgresql.conf` — SSL activado ```conf listen_addresses = '*' max_connections = 500 ssl = on ssl_cert_file = '/etc/postgresql/ssl/server.crt' ssl_key_file = '/etc/postgresql/ssl/server.key' ssl_min_protocol_version = 'TLSv1.2' shared_buffers = 2GB maintenance_work_mem = 128MB timezone = 'America/Guatemala' log_timezone = 'America/Guatemala' ``` ### 2. `luminarrh/pg_hba.conf` — Control de acceso ```conf # Conexión local (dentro del contenedor) — sin SSL requerido local all all peer # Red local <>/24 — SSL obligatorio hostssl all all <>/24 scram-sha256 # Internet — SSL obligatorio para cualquier IP hostssl all all 0.0.0.0/0 scram-sha256 # Rechazar todo lo demás sin SSL host all all 0.0.0.0/0 reject ``` Clave: `hostssl` exige SSL. `host` sin SSL es rechazado. No hay reglas `trust`. ### 3. `luminarrh/docker-compose.yaml` — Mounts SSL - Puerto solo TCP (`5436:5432/tcp`) — sin UDP - Mount del `pg_hba.conf` explícito - Mount del SSL como `ro` (solo lectura) - Command explícito para config_file y hba_file ### 4. `luminarrh/ssl/server.crt` + `server.key` Certificado autofirmado para `senabed.p-lao.com`, generado con OpenSSL RSA 2048. ### 5. `luminarrh/README.md` Guía completa de conexión con SSL para Linux, macOS, Windows, Python (psycopg2), Node.js (pg). --- ## Verificación 1. **DNS**: `senabed.p-lao.com` → `181.209.153.86` ✅ 2. **Conexión sin SSL es rechazada**: `sslmode=disable` → `pg_hba.conf rejects connection` ✅ 3. **Conexión con SSL**: requiere `sslmode=require` + certificado + contraseña ✅ 4. **Cualquier IP con SSL puede conectar** ✅ 5. **Red local `<>/24` con SSL puede conectar** ✅ --- ## Notas de seguridad | Aspecto | Estado | |---------|--------| | SSL/TLS obligatorio | ✅ hostssl + TLS 1.2 mínimo | | Autenticación | ✅ scram-sha256 | | Control de acceso | ✅ hostssl + reject | | Contraseña | ⚠️ `<>` (débil) | | Certificado | ⚠️ Autofirmado (no verifica identidad) |