2.8 KiB
2.8 KiB
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
<<INTERNAL_IP_2>>/24también con SSL obligatorio
Archivos implementados
1. luminarrh/postgresql.conf — SSL activado
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
# Conexión local (dentro del contenedor) — sin SSL requerido
local all all peer
# Red local <<INTERNAL_IP_2>>/24 — SSL obligatorio
hostssl all all <<INTERNAL_IP_2>>/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.confexplí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
- DNS:
senabed.p-lao.com→181.209.153.86✅ - Conexión sin SSL es rechazada:
sslmode=disable→pg_hba.conf rejects connection✅ - Conexión con SSL: requiere
sslmode=require+ certificado + contraseña ✅ - Cualquier IP con SSL puede conectar ✅
- Red local
<<INTERNAL_IP_2>>/24con 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 | ⚠️ <<DB_PASSWORD_1>> (débil) |
| Certificado | ⚠️ Autofirmado (no verifica identidad) |