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 con sudo systemctl reload postgresql o SELECT 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_addresses está configurado como *, se usarán todas las interfaces. Asegúrate de que pg_hba.conf controle 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), como CREATE TABLE y ALTER 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

  1. Actualiza pg_hba.conf: Usa scram-sha-256 o peer para los métodos de autenticación.
  2. Aplica Cifrado: Configura ssl = on en postgresql.conf y usa entradas hostssl en pg_hba.conf.
  3. Restringe la Escucha: Configura listen_addresses solo a las interfaces necesarias, evitando el * predeterminado si es posible.
  4. Aplica Privilegio Mínimo: Limita los roles de la base de datos solo a los permisos absolutamente requeridos para su función.
  5. 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.