Configuraciones Esenciales para Asegurar Su Base de Datos PostgreSQL

Esta guía detalla las configuraciones esenciales para fortalecer la seguridad de PostgreSQL. Aprenda a aplicar la autenticación moderna utilizando `pg_hba.conf` (SCRAM-SHA-256), a implementar el cifrado SSL/TLS obligatorio y a minimizar la superficie de ataque restringiendo los oyentes de red. Esencial para la estabilidad de producción y el cumplimiento.

37 vistas

Configuración Esencial para Proteger su Base de Datos PostgreSQL

La seguridad de una base de datos PostgreSQL es primordial para proteger datos sensibles y garantizar el cumplimiento normativo. Como base de datos relacional avanzada y de código abierto, PostgreSQL ofrece robustos mecanismos de configuración para controlar el acceso, cifrar la comunicación y minimizar vulnerabilidades potenciales. Esta guía profundiza en los archivos y parámetros de configuración críticos necesarios para establecer una postura de seguridad reforzada para entornos de producción.

La seguridad efectiva de PostgreSQL se basa en dos pilares principales: controlar quién puede conectarse y cómo se conectan. Exploraremos configuraciones vitales dentro de postgresql.conf y el crucial archivo de autenticación de clientes, pg_hba.conf, además de implementar el cifrado obligatorio utilizando SSL/TLS.

1. Reforzando 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, con qué usuarios de PostgreSQL pueden conectarse, a 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 DIRECCION METODO [OPCIONES]

  • TIPO: Tipo de conexión (por ejemplo, local, host, hostnossl, hostssl).
  • BASE_DE_DATOS: Nombre(s) de la base de datos de destino.
  • USUARIO: Rol(es) de base de datos de destino.
  • DIRECCION: Rango de direcciones IP del cliente.
  • METODO: Mecanismo de autenticación (por ejemplo, scram-sha-256, md5, reject, trust).

Mejores Prácticas para Métodos de Autenticación

Nunca utilice el método trust en producción, ya que permite que cualquiera que coincida con los criterios de conexión acceda sin contraseña. Los métodos de autenticación modernos recomendados son:

Recomendado: scram-sha-256

SCRAM (Salted Challenge Response Authentication Mechanism) ofrece mejoras significativas sobre métodos de contraseña antiguos como md5 al utilizar un hash más fuerte y prevenir ataques de repetición. Esta debería ser su opción predeterminada para conexiones remotas.

# Forzar SCRAM para todas las conexiones remotas en el puerto 5432
host    all     all     0.0.0.0/0       scram-sha-256

Conexiones Locales

Para conexiones que se originan desde el propio servidor (por ejemplo, aplicaciones que se ejecutan en la misma máquina), utilice 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

Rechazo Explícito de Conexiones

Utilice el método reject para bloquear explícitamente las conexiones de redes peligrosas o no confiables.

# Bloquear todas las conexiones de un rango de IP conocido como inseguro
host    all     all     192.168.1.0/24  reject

Consejo Práctico: Después de modificar pg_hba.conf, debe recargar la configuración para que los cambios surtan efecto (por ejemplo, pg_ctl reload o enviando una señal SIGHUP al proceso postmaster).

2. Implementando Cifrado SSL/TLS

Para evitar que datos sensibles (incluidas contraseñas) sean interceptados a través de la red, es obligatorio forzar el cifrado SSL/TLS para todas las conexiones remotas.

Configuración en postgresql.conf

Asegúrese de que estos parámetros estén configurados correctamente en su archivo de configuración principal:

  • ssl = on: Habilita el soporte SSL globalmente.
  • ssl_cert_file: Ruta al archivo del certificado del servidor (por ejemplo, server.crt).
  • ssl_key_file: Ruta al archivo de la clave privada del servidor (por ejemplo, server.key).

Forzando SSL en pg_hba.conf

Para forzar a los clientes a usar SSL, cambie el tipo de conexión en pg_hba.conf de host a hostssl:

# Permitir solo conexiones a través de SSL/TLS
hostssl all     all     0.0.0.0/0       scram-sha-256

Si tiene clientes heredados que no pueden soportar SSL, puede permitir explícitamente conexiones no SSL pero restringirlas solo a operaciones no sensibles, aunque el rechazo general es preferible.

3. Minimizando 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 deshabilitación de funciones innecesarias.

Limitando la Dirección de Escucha de Red

Por defecto, PostgreSQL puede escuchar en todas las interfaces de red (listen_addresses = '*'). Para una mayor seguridad, configúrelo explícitamente para que solo escuche en las interfaces específicas que requieren acceso externo, o 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 se establece en *, se utilizarán todas las interfaces. Asegúrese de que pg_hba.conf controle estrictamente qué rangos de IP pueden conectarse.

Deshabilitando Extensiones y Funciones Innecesarias

Cada extensión habilitada agrega complejidad y vectores de ataque potenciales. Audite regularmente las extensiones instaladas y elimine aquellas que no se utilicen activamente para su carga de trabajo de producción. Esto minimiza la superficie de ataque general.

Seguridad de Contraseñas y Roles

Asegúrese de que todos los roles administrativos (como el usuario predeterminado postgres) tengan contraseñas fuertes y complejas establecidas usando ALTER USER:

ALTER USER postgres WITH PASSWORD 'SuContrasenaFuerteYCompleja123!';

Utilice el principio de menor privilegio: los usuarios de aplicaciones solo deben tener permisos SELECT, INSERT, UPDATE y DELETE sobre las tablas específicas que necesitan, en lugar de privilegios 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. Configure 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, ALTER USER). Establezca en 'all' temporalmente durante las revisiones de seguridad, pero tenga en cuenta el impacto en el rendimiento.
  • log_connections = on: Registra cada intento de conexión exitoso.
  • log_disconnections = on: Registra cuándo se desconectan los clientes.
  • log_duration = on: Registra el tiempo de ejecución de todas las sentencias, lo que a veces puede revelar patrones de actividad inusuales.

Al combinar reglas de acceso estrictas en pg_hba.conf, cifrado forzado a través de SSL, una dirección de escucha restringida y un registro completo, establece una base sólida para proteger su despliegue de PostgreSQL.

Resumen de Pasos de Seguridad Esenciales

  1. Actualizar pg_hba.conf: Utilice scram-sha-256 o peer para los métodos de autenticación.
  2. Forzar Cifrado: Establezca ssl = on en postgresql.conf y utilice entradas hostssl en pg_hba.conf.
  3. Restringir Escucha: Configure listen_addresses solo para las interfaces necesarias, evitando el * predeterminado si es posible.
  4. Forzar Menor Privilegio: Limite los roles de base de datos solo a los permisos absolutamente requeridos para su función.
  5. Recargar Configuración: Siempre recargue o reinicie PostgreSQL después de modificar los archivos de seguridad para aplicar los cambios.