92 lines
2.8 KiB
Markdown
92 lines
2.8 KiB
Markdown
# 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>>/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 <<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.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 `<<INTERNAL_IP_2>>/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 | ⚠️ `<<DB_PASSWORD_1>>` (débil) |
|
|
| Certificado | ⚠️ Autofirmado (no verifica identidad) |
|