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 reloado 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_addressesse establece en*, se utilizarán todas las interfaces. Asegúrese de quepg_hba.confcontrole 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) (comoCREATE 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
- Actualizar
pg_hba.conf: Utilicescram-sha-256opeerpara los métodos de autenticación. - Forzar Cifrado: Establezca
ssl = onenpostgresql.confy utilice entradashostsslenpg_hba.conf. - Restringir Escucha: Configure
listen_addressessolo para las interfaces necesarias, evitando el*predeterminado si es posible. - Forzar Menor Privilegio: Limite los roles de base de datos solo a los permisos absolutamente requeridos para su función.
- Recargar Configuración: Siempre recargue o reinicie PostgreSQL después de modificar los archivos de seguridad para aplicar los cambios.