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