Files
qwen3-6-lora/data/raw/sanitized/plans/puedes-leer-el-plan-sprightly-pearl.md
T

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) |