Bastionado de seguridad de PostgreSQL (auditoría de estado, red, TLS, autenticación, privilegios, auditoría, cifrado)
PostgreSQLNivel: IntermedioDuración: 5 min (auditoría) – 3 horas (bastionado completo)No es una guía de instalación: encuentra y cierra las brechas de seguridad de un servidor PostgreSQL en funcionamiento. Primero la Auditoría de estado, de solo lectura, enumera las brechas por gravedad e indica a qué tarjeta lleva cada hallazgo; después se cierran las áreas una a una o todas en orden: dirección de escucha, firewall y pg_hba; TLS y sslmode=verify-full en el cliente; scram-sha-256 y bloqueo del acceso de postgres por red; diseño de roles y privilegios de PUBLIC; pgaudit y log centralizado; LUKS / pgcrypto; copias de seguridad cifradas; sistema operativo; seguimiento de versiones. Al final la auditoría se ejecuta de nuevo y los hallazgos cerrados desaparecen de la lista.
Topología: Un servidor PostgreSQL + servidor de aplicación (verificación del cliente); los entornos con réplicas/Patroni se tratan en las notas
Escenarios
- Auditoría de estado: ¿qué brechas tengo? (solo lectura) — El primer análisis que se ejecuta: pg_hba, dirección de escucha, TLS, contraseñas md5, superusuarios, privilegios de PUBLIC, auditoría, permisos de archivos y firewall; no modifica nada.
- Bastionado completo (todas las áreas en orden) — Servidor recién instalado o nunca bastionado: todas las áreas se aplican en un orden seguro; PostgreSQL se reinicia una o dos veces (se necesita una ventana de mantenimiento).
- Red y conexiones: ¿quién puede conectarse y desde dónde? (listen, firewall, pg_hba) — PostgreSQL escucha en todas las interfaces, pg_hba tiene 0.0.0.0/0 o trust, el puerto está abierto a todos. Cambiar listen_addresses requiere reinicio.
- Cifrar las conexiones (TLS, sslmode=verify-full) — ssl = off o los clientes no verifican el certificado; certificado de servidor, hostssl y verify-full en el cliente. Solo requiere reload, sin interrupción del servicio.
- Autenticación y contraseñas (scram-sha-256, acceso remoto de postgres) — Método md5/password, contraseñas con hash md5, el usuario postgres puede iniciar sesión por red; migración a scram-sha-256 y cuenta personal de DBA. Sin interrupción del servicio; las contraseñas se vuelven a asignar.
- Mínimo privilegio: roles, PUBLIC y la cuenta de la aplicación — La cuenta de la aplicación es propietaria de las tablas o es superusuario, cualquiera puede escribir en el esquema public; roles de lectura/escritura/propietario e informe de privilegios. Sin interrupción del servicio.
- Auditoría: ¿quién hizo qué? (pgaudit, log centralizado) — El auditor o el equipo de seguridad exige un registro de los cambios de DDL y de roles; instalación de pgaudit y envío del log a un servidor central. Requiere un reinicio.
- Cifrar los datos en disco (LUKS / pgcrypto) — Se requiere protección frente al robo de un disco o de una copia de seguridad. PostgreSQL no tiene TDE integrado: LUKS a nivel de disco (con interrupción del servicio para el traslado) o pgcrypto a nivel de columna.
- Seguridad de las copias de seguridad (copias cifradas, permisos) — Los archivos de copia de seguridad no están cifrados o están en un directorio legible por todos; cifrado del repositorio de pgBackRest o pg_dump + GPG, .pgpass y permisos de directorio. Sin interrupción del servicio.
- Lado del sistema operativo (cuenta de servicio, permisos, core dump, SELinux) — La cuenta postgres tiene una contraseña utilizable, los permisos del directorio de datos son laxos, SELinux está en Permissive/Disabled. El ajuste de core dump se aplica en el siguiente reinicio.
- Parches y versión: ¿estoy en una versión con soporte? — Comprueba la versión, la fecha de fin de soporte y las actualizaciones menores pendientes; remite a la guía de parches para aplicarlas. Solo lectura.
Antes de empezar
- PostgreSQL … está en ejecución y es posible conectarse como postgres desde el propio servidor (sudo -iu postgres psql) sin contraseña (local all postgres peer en pg_hba). Si se instaló con la guía de instalación de PostgreSQL, esto ya está listo.
- Directorio de datos …, directorio de configuración …; psql y pg_dump están en …. Están en el PATH del login shell del usuario postgres; si los invoca como root, escriba la ruta completa.
- Hay dos sesiones SSH independientes abiertas en el servidor: en una aplica los pasos; la otra (con sudo -iu postgres psql abierto) sirve para deshacer si una regla errónea le deja fuera. Después de cada paso que restringe el acceso, pruebe la nueva conexión en una tercera sesión; no cierre las sesiones antiguas hasta ver que funciona.
- Ventana de mantenimiento: en las áreas elegidas PostgreSQL se reiniciará (listen_addresses, shared_preload_libraries, límite de core dump, traslado de disco). El equipo de la aplicación está informado.
- Tiene la lista de todas las aplicaciones que se conectan a la base de datos y sus datos de conexión (IP de los servidores, usuarios, versiones de los drivers). Antes de restringir, el paso de auditoría responde a quién se conecta desde dónde; un cliente que no esté en la lista no podrá conectarse después de la restricción.
- Existe una copia de seguridad actual con la restauración probada (pgBackRest o pg_dump). El bastionado no toca los datos, pero los cambios de roles/privilegios y el traslado de disco están expuestos a errores irreversibles.
Fases de la guía
- Auditoría de estado (solo lectura) — Listar los hallazgos dentro de la base de datos · Listar los hallazgos de esquemas y funciones en cada base de datos · Auditar el lado del sistema operativo
- Antes de empezar: punto de retorno — Copiar la configuración y los roles actuales · Activar el directorio de configuración adicional (conf.d)
- Privilegios — 1. Diagnóstico — Mostrar roles, propietarios y privilegios de PUBLIC
- Privilegios — 2. Red de seguridad — Volcar los privilegios actuales
- Privilegios — 3. Aplicación — Crear los roles de grupo y las cuentas de inicio de sesión · Asignar contraseñas a las nuevas cuentas de inicio de sesión · Configurar los privilegios de base de datos y de esquema · Traspasar al rol propietario los objetos de la cuenta de la aplicación · Informe de privilegios
- Privilegios — 4. Verificación — Verificar que la cuenta de la aplicación no puede ejecutar DDL y sí puede escribir datos
- Privilegios — 5. Seguimiento — Pasar la herramienta de migración al rol propietario
- Autenticación — 1. Diagnóstico — Mostrar hashes de contraseñas, métodos y cuentas
- Autenticación — 2. Red de seguridad — Comprobar la compatibilidad de los drivers
- Autenticación — 3. Aplicación — Guardar las nuevas contraseñas con scram-sha-256 · Cargar el ajuste y volver a asignar las contraseñas de las cuentas md5 · Cambiar en pg_hba el método md5/password a scram-sha-256 · Bloquear el acceso por red del superusuario postgres · Crear la cuenta personal de DBA
- Autenticación — 4. Verificación — Verificar los hashes y el rechazo del superusuario por red · Inicio de sesión scram desde el servidor de aplicación y rechazo de postgres
- Autenticación — 5. Seguimiento — Revisar las cuentas no usadas y caducadas
- TLS — 1. Diagnóstico — Mostrar el estado actual de SSL y los clientes sin cifrar
- TLS — 2. Red de seguridad — Preparar el directorio de certificados
- TLS — 3. Aplicación — Crear una CA de prueba y el certificado de servidor · Crear la clave y la solicitud de firma (CSR) · Colocar el certificado firmado y la cadena de la CA · Verificar el certificado, la clave y la cadena · Activar TLS en el servidor · Cargar los ajustes y verificar que TLS está activo …
- TLS — 4. Verificación — Verificar que se rechazan las conexiones sin cifrar
- TLS — 5. Seguimiento: renovación del certificado — Procedimiento de renovación del certificado
- Red — 1. Diagnóstico: ¿quién se conecta desde dónde? — Mostrar la dirección de escucha, las reglas de pg_hba y los clientes activos
- Red — 2. Red de seguridad — Mantener abierta la sesión de retorno
- Red — 3. Aplicación — Restringir la dirección de escucha · Reescribir pg_hba.conf con el mínimo acceso · Comprobar y cargar las reglas · Abrir el puerto en el firewall solo a las redes permitidas · Reiniciar PostgreSQL para la dirección de escucha
- Red — 4. Verificación — Probar desde el servidor de aplicación una conexión permitida y otra rechazada
- Red — 5. Seguimiento — Vigilar las conexiones rechazadas
- Auditoría — 1. Diagnóstico — Mostrar los ajustes de auditoría y de log
- Auditoría — 2. Red de seguridad — Comprobar la ubicación y el espacio libre del disco de log
- Auditoría — 3. Aplicación — Instalar el paquete pgaudit · Añadir pgaudit a las bibliotecas precargadas y escribir los ajustes · Reiniciar para activar pgaudit · Crear la extensión pgaudit · Reenviar el log al servidor central (rsyslog) · Retención del archivo de auditoría local (logrotate) …
- Auditoría — 4. Verificación — Hacer un cambio de DDL y otro de rol y verlos en el log
- Auditoría — 5. Seguimiento — Vigilar la desactivación de la auditoría
- Copia de seguridad — 1. Diagnóstico — Mostrar el estado de cifrado y los permisos de las copias de seguridad
- Copia de seguridad — 2. Red de seguridad — Preparar el lugar donde se guardará la clave de cifrado
- Copia de seguridad — 3. Aplicación — Definir el nuevo repositorio cifrado · Crear el repositorio cifrado y hacer la primera copia completa · Importar la clave pública GPG en el servidor · Script de copia cifrada · Directorio de copias, permisos y prueba manual · Programar la copia cifrada (cron) …