# 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 `<>/24` Tú te encargas del enrutamiento y port forwarding del router. La contraseña se mantiene igual (`<>`). --- ## 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 `<>/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 <>/24 - SSL requerido hostssl all all <>/24 scram-sha256 # Conexiones desde internet (IP pública del NAS) - SSL requerido hostssl all sarh2 /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: <> 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** `<>` ### 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 `<>/24` con SSL — debe conectar 5. **Verificar logs**: revisar `/var/log/postgresql/` para ver conexiones aceptadas/rechazadas