pg_hba.conf y Autenticación
pg_hba.conf (autenticación basada en host) decide qué clientes pueden conectarse, desde qué direcciones, a qué bases de datos, utilizando qué método de autenticación. Es tu primer cortafuegos de red e identidad.
Receta
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
hostssl myapp app_user 10.0.0.0/8 scram-sha-256# Validar sintaxis y recargar
sudo -u postgres pg_ctl reload -D /var/lib/postgresql/18/mainCuándo usar esto: Cada vez que abras Postgres más allá de localhost, añadas un rol de aplicación o rotes métodos de autenticación.
Ejemplo de Trabajo
# Rechazar por defecto - solo permitir explícitamente
host all all 0.0.0.0/0 reject
# Subred de nivel de aplicación
hostssl myapp_prod app_rw 10.10.1.0/24 scram-sha-256
hostssl myapp_prod app_ro 10.10.2.0/24 scram-sha-256
# Replicación desde subred de standby
host replication replicator 10.10.3.10/32 scram-sha-256
# Socket de administración local
local all postgres peer-- Crear roles de inicio de sesión con contraseñas (almacenadas como verificador SCRAM)
CREATE ROLE app_rw LOGIN PASSWORD 'rotate-me-via-vault';
CREATE ROLE app_ro LOGIN PASSWORD 'rotate-me-via-vault';
GRANT CONNECT ON DATABASE myapp_prod TO app_rw, app_ro;Lo que esto demuestra:
hostsslrequiere TLS - usar para conexiones de aplicaciones remotas- Roles y subredes separadas para lectura-escritura vs. solo lectura
rejectcomo comodín después de reglas específicas (el orden importa - la primera coincidencia gana)replicationes una pseudo-base de datos para conexiones de replicación física
Análisis Profundo
Campos de Regla
| Campo | Valores | Significado |
|---|---|---|
| TYPE | local, host, hostssl, hostnossl | Socket vs TCP; Requisito de TLS |
| DATABASE | nombre, all, sameuser, replication | Base de datos de destino |
| USER | nombre, all, +group | El prefijo + coincide con roles de grupo |
| ADDRESS | CIDR, nombre de host | Omitir para local |
| METHOD | scram-sha-256, cert, peer, reject | Cómo se verifica la identidad |
Métodos de Autenticación (Producción)
# Preferido para autenticación por contraseña (PG 10+)
password_encryption = scram-sha-256 # en postgresql.conf
# Autenticación por certificado (mTLS)
hostssl all app_user 0.0.0.0/0 cert clientcert=verify-fullmd5es obsoleto - migrar ascram-sha-256.trustypassword(texto plano) son fallos de auditoría - nunca en redes.peermapea el usuario del sistema operativo al usuario de la base de datos en sockets Unix - bueno para la administración local depostgres.
Reglas de Red de Mínimo Privilegio
- Un CIDR por zona de seguridad (aplicación, batch, BI, bastion de administración).
- Estrechar
DATABASEyUSER- evitarall allen CIDRs amplios. - Usar oyentes separados:
listen_addressessolo en NICs internas cuando sea posible.
Comportamiento de Recarga
- Los cambios en
pg_hba.confse aplican con una recargaSIGHUP- sin reinicio. - Los errores de sintaxis en la recarga mantienen el archivo anterior activo - probar con la vista
pg_hba_file_rules(PG 12+):
SELECT line_number, error FROM pg_hba_file_rules WHERE error IS NOT NULL;Trampas Comunes
- Sorpresas en el orden de las reglas - La primera línea coincidente gana; un
host all all 0.0.0.0/0 scramamplio antes de unrejectnunca llega alreject. Solución: Reglas más específicas primero,rejectal final. - Olvidó
hostsslen redes públicas - La contraseña sin TLS es susceptible de ser espiada. Solución:hostssl+ certificado de servidor válido, o solo VPN/enlace privado. - Autenticación
peersobre TCP -peersolo funciona para conexiones de socketlocal. Solución: Usarscram-sha-256ocertpara entradashost. - Regla de replicación faltante - El standby no puede conectarse con reglas solo para aplicaciones. Solución:
host replication replicator <standby-ip>/32 scram-sha-256. - IPv6 pasado por alto -
::1abierto contrustmientras IPv4 está bloqueado. Solución: Reflejar políticas para::1/128o deshabilitar el oyente de IPv6.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Autenticación de cliente cert | Service mesh mTLS, sin contraseñas compartidas | Los clientes no pueden gestionar la rotación de certificados |
| Grupos de seguridad de RDS | ACL de red gestionada en la nube | Servidores físicos autoalojados |
| Túnel SSH a localhost | Acceso de administración de emergencia | Ruta de estado estable de la aplicación de producción |
Preguntas Frecuentes
¿Dónde está pg_hba.conf?
SHOW hba_file; o pg_config --hbafile en algunas instalaciones. Generalmente junto a postgresql.conf en PGDATA.
¿Por qué se rechaza la conexión sin ninguna pista?
Comprueba el registro del servidor después de log_connections = on. Causas comunes: ninguna regla coincidente, error tipográfico en pg_hba.conf, o se requiere SSL pero el cliente usa conexión simple.
¿scram-sha-256 vs md5?
SCRAM almacena verificadores salados y no envía hashes de contraseña reutilizables por el cable. Migra roles con ALTER ROLE ... PASSWORD 'new'.
¿Puedo usar LDAP?
Sí, a través de los métodos ldap o radius - común en empresas. Aún así, mantén reglas CIDR estrechas.
¿La recarga descarta las conexiones?
No. Las sesiones existentes conservan su contexto de autenticación original; las nuevas conexiones utilizan el archivo actualizado.
Relacionado
- Conceptos Básicos de Instalación - instalar antes de endurecer la autenticación
- Conceptos Básicos de Roles - roles referenciados en reglas hba
- Autenticación SCRAM - profundidad del almacenamiento de contraseñas
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.