Fase 2: 04_sanitize.py - scrubbing de secretos de skills/agentes/plans (10 secretos unicos, gate en verde)
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
# 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 `<<INTERNAL_IP_2>>/24`
|
||||
|
||||
Tú te encargas del enrutamiento y port forwarding del router. La contraseña se mantiene igual (`<<DB_PASSWORD_1>>`).
|
||||
|
||||
---
|
||||
|
||||
## 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 `<<INTERNAL_IP_2>>/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 <<INTERNAL_IP_2>>/24 - SSL requerido
|
||||
hostssl all all <<INTERNAL_IP_2>>/24 scram-sha256
|
||||
|
||||
# Conexiones desde internet (IP pública del NAS) - SSL requerido
|
||||
hostssl all sarh2 <IP_PUBLICA_NAS>/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: <<DB_PASSWORD_1>>
|
||||
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** `<<DB_PASSWORD_1>>`
|
||||
|
||||
### 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 `<<INTERNAL_IP_2>>/24` con SSL — debe conectar
|
||||
5. **Verificar logs**: revisar `/var/log/postgresql/` para ver conexiones aceptadas/rechazadas
|
||||
Reference in New Issue
Block a user