Configuraciones Esenciales para Asegurar tu Base de Datos PostgreSQL
Asegura PostgreSQL con reglas pg_hba.conf, autenticación SCRAM, aplicación de TLS, oyentes limitados, privilegios mínimos y registros de auditoría.
Configuraciones Esenciales para Asegurar tu Base de Datos PostgreSQL
Asegurar PostgreSQL comienza con una pregunta simple: ¿quién puede conectarse, desde dónde y con qué método de autenticación? Si pg_hba.conf es demasiado amplio o el servidor escucha en más interfaces de las necesarias, tu base de datos tiene una superficie de ataque mayor de la necesaria.
Esta guía cubre las configuraciones de seguridad de PostgreSQL que debes revisar primero: pg_hba.conf, autenticación de contraseña SCRAM, TLS, oyentes de red, permisos de roles y registros.
1. Endurecimiento de la Autenticación de Clientes con pg_hba.conf
El archivo de Autenticación Basada en Host (pg_hba.conf) dicta qué hosts pueden conectarse, qué usuarios de PostgreSQL pueden usar, qué bases de datos pueden acceder y, lo más importante, el método de autenticación requerido para esa conexión.
Entendiendo la Estructura de pg_hba.conf
Cada línea en pg_hba.conf sigue un formato específico:
TIPO BASE_DE_DATOS USUARIO DIRECCIÓN MÉTODO [OPCIONES]
- TIPO: Tipo de conexión (por ejemplo,
local,host,hostnossl,hostssl). - BASE_DE_DATOS: Nombre(s) de la base de datos objetivo.
- USUARIO: Rol(es) de la base de datos objetivo.
- DIRECCIÓN: Rango de direcciones IP del cliente.
- MÉTODO: Mecanismo de autenticación (por ejemplo,
scram-sha-256,md5,reject,trust).
Mejores Prácticas para Métodos de Autenticación
Nunca uses el método trust en producción, ya que permite que cualquiera que cumpla con los criterios de conexión se conecte sin contraseña. Los métodos de autenticación modernos recomendados son:
Recomendado: scram-sha-256
SCRAM (Mecanismo de Autenticación de Respuesta a Desafío Salado) ofrece mejoras significativas sobre métodos de contraseña más antiguos como md5 al usar un hash más fuerte y prevenir ataques de repetición. Esta debería ser tu opción predeterminada para conexiones remotas.
# Aplicar SCRAM para conexiones remotas desde una subred de aplicación
host appdb app_user 10.20.30.0/24 scram-sha-256
Establece password_encryption = 'scram-sha-256' en postgresql.conf antes de crear o rotar contraseñas. Las contraseñas existentes almacenadas con hashes más antiguos no se convierten automáticamente; restablécelas después de habilitar SCRAM.
password_encryption = 'scram-sha-256'
Evita reglas amplias como esta a menos que otro control de red ya restrinja el acceso:
host all all 0.0.0.0/0 scram-sha-256
Conexiones Locales
Para conexiones originadas desde el propio servidor (por ejemplo, aplicaciones que se ejecutan en la misma máquina), usa sockets locales. La configuración más segura suele ser peer (para sockets de dominio Unix) o scram-sha-256 si los sockets están deshabilitados o restringidos.
# Usar autenticación peer para conexiones locales a través de socket Unix
local all all peer
Rechazar Conexiones Explícitamente
Usa el método reject para bloquear explícitamente conexiones desde redes peligrosas o no confiables.
# Bloquear todas las conexiones desde un rango IP inseguro conocido
host all all 192.168.1.0/24 reject
Consejo Accionable: Después de modificar
pg_hba.conf, recarga PostgreSQL para que los cambios surtan efecto, por ejemplo consudo systemctl reload postgresqloSELECT pg_reload_conf();.
2. Implementación de Cifrado SSL/TLS
Para evitar que datos sensibles (incluyendo contraseñas) sean interceptados a través de la red, es obligatorio aplicar cifrado SSL/TLS para todas las conexiones remotas.
Configuración en postgresql.conf
Asegúrate de que estos parámetros estén configurados correctamente en tu archivo de configuración principal:
ssl = on: Habilita el soporte SSL globalmente.ssl_cert_file: Ruta al archivo de certificado del servidor (por ejemplo,server.crt).ssl_key_file: Ruta al archivo de clave privada del servidor (por ejemplo,server.key).
Aplicación de SSL en pg_hba.conf
Para forzar a los clientes a usar SSL, cambia el tipo de conexión en pg_hba.conf de host a hostssl:
# Solo permitir conexiones a través de SSL/TLS
hostssl all all 0.0.0.0/0 scram-sha-256
hostssl solo coincide con conexiones SSL. Asegúrate de no tener también una regla host posterior o anterior que permita a los mismos usuarios sin TLS. Para hacer la política obvia, agrega una regla de rechazo para conexiones no SSL:
hostnossl all all 0.0.0.0/0 reject
3. Minimización de la Superficie de Ataque
La seguridad implica reducir la exposición del servidor de base de datos a amenazas externas. Esto se gestiona principalmente a través de la configuración de red y la desactivación de características innecesarias.
Limitación de la Dirección de Escucha de Red
PostgreSQL comúnmente predetermina escuchar en localhost, pero las implementaciones empaquetadas y las imágenes gestionadas pueden diferir. Configúralo explícitamente para que escuche solo en la interfaz específica que requiere acceso, o mantenlo en localhost si solo se conectan aplicaciones locales.
En postgresql.conf:
# Escuchar solo en localhost (127.0.0.1) si es posible
listen_addresses = 'localhost'
# O, escuchar solo en una interfaz de red privada específica
# listen_addresses = '192.168.1.10'
Advertencia de Seguridad: Si
listen_addressesestá configurado como*, se usarán todas las interfaces. Asegúrate de quepg_hba.confcontrole estrictamente qué rangos IP pueden conectarse.
Desactivación de Extensiones y Características Innecesarias
Cada extensión habilitada agrega complejidad potencial y vectores de ataque. Audita regularmente las extensiones instaladas y elimina aquellas que no se utilicen activamente para tu carga de trabajo de producción. Esto minimiza la superficie de ataque general.
Seguridad de Contraseñas y Roles
Asegúrate de que todos los roles administrativos (como el usuario postgres predeterminado) tengan contraseñas fuertes y complejas establecidas usando ALTER USER:
ALTER USER postgres WITH PASSWORD 'TuContraseñaFuerteYCompleja123!';
Usa el principio de privilegio mínimo: los usuarios de la aplicación solo deben tener permisos SELECT, INSERT, UPDATE y DELETE en las tablas específicas que necesitan, en lugar de estado de superusuario.
4. Configuración de Auditoría y Registro
Aunque no es estrictamente un mecanismo de control de acceso, un registro robusto es crucial para detectar e investigar incidentes de seguridad. Configura los parámetros de registro en postgresql.conf para capturar eventos relevantes.
Configuraciones clave para la auditoría de seguridad:
log_statement = 'ddl'o'all': Registra todos los comandos de Lenguaje de Definición de Datos (DDL), comoCREATE TABLEyALTER USER. Usa'all'con cuidado porque puede crear un alto volumen de registros y puede capturar texto de consulta sensible.log_connections = on: Registra cada intento de conexión exitoso.log_disconnections = on: Registra cuando los clientes se desconectan.log_duration = on: Registra el tiempo de ejecución de todas las declaraciones, lo que a veces puede revelar patrones de actividad inusuales.
Al combinar reglas de acceso estrictas en pg_hba.conf, cifrado aplicado a través de SSL, una dirección de escucha restringida y un registro completo, estableces una base sólida para asegurar tu implementación de PostgreSQL.
Pasos Esenciales de Seguridad
- Actualiza
pg_hba.conf: Usascram-sha-256opeerpara los métodos de autenticación. - Aplica Cifrado: Configura
ssl = onenpostgresql.confy usa entradashostsslenpg_hba.conf. - Restringe la Escucha: Configura
listen_addressessolo a las interfaces necesarias, evitando el*predeterminado si es posible. - Aplica Privilegio Mínimo: Limita los roles de la base de datos solo a los permisos absolutamente requeridos para su función.
- Recarga la Configuración: Siempre recarga o reinicia PostgreSQL después de modificar los archivos de seguridad para aplicar los cambios.
Estas configuraciones son la base. Después de aplicarlas, prueba desde un cliente permitido, prueba desde un cliente bloqueado y verifica que los registros muestren el comportamiento de conexión que esperabas.