Autenticación SCRAM
SCRAM-SHA-256 es la autenticación de contraseña predeterminada de PostgreSQL. El servidor almacena un verificador con sal, no la contraseña en texto plano, y el cliente demuestra conocimiento a través de un protocolo de desafío-respuesta. Empareje SCRAM con TLS (hostssl) para producción; agregue LDAP o IAM en la nube cuando se requiera identidad centralizada.
Receta
-- Predeterminado del servidor para contraseñas nuevas (postgresql.conf)
-- password_encryption = scram-sha-256
CREATE ROLE app_api LOGIN PASSWORD 'contraseña-secreta-generada-por-vault';# pg_hba.conf
hostssl orders app_api 10.20.0.0/16 scram-sha-256# Verificar el tipo de hash almacenado
psql -c "SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'app_api';"
# rolpassword comienza con SCRAM-SHA-256$Cuándo utilizar esto:
- Todos los roles basados en contraseña en PostgreSQL 14+
- Migración desde md5 durante una actualización o auditoría de cumplimiento
- Base antes de LDAP/SSO - incluso los flujos federados a menudo se mapean a un rol de base de datos
Ejemplo de funcionamiento
Migrar un rol md5 heredado a SCRAM y aplicarlo en las conexiones.
-- Confirmar la configuración de cifrado
SHOW password_encryption; -- scram-sha-256
-- Volver a establecer la contraseña para regenerar el verificador SCRAM
ALTER ROLE app_api PASSWORD 'nueva-contraseña-rotada-desde-vault';
-- Confirmar el formato del verificador
SELECT rolname,
left(rolpassword, 14) AS hash_prefix
FROM pg_authid
WHERE rolname = 'app_api';# pg_hba.conf - sin md5 para roles de aplicación
hostssl orders app_api 10.20.0.0/16 scram-sha-256# El cliente debe usar libpq/psql/driver con soporte SCRAM (clientes PostgreSQL 10+)
psql "host=db.internal dbname=orders user=app_api sslmode=verify-full"Lo que esto demuestra:
ALTER ROLE ... PASSWORDregenera el verificador SCRAM cuandopassword_encryption = scram-sha-256- El método
pg_hbadebe serscram-sha-256, nomd5 - JDBC/psql antiguos sin SCRAM fallarán rápidamente (actualizar clientes)
Inmersión Profunda
Cómo funciona SCRAM
- El cliente solicita autenticación para un usuario.
- El servidor envía la sal y el recuento de iteraciones del verificador almacenado.
- El cliente deriva una prueba de la contraseña + sal sin enviar la contraseña por el cable.
- El servidor verifica la prueba contra
pg_authid.rolpassword.
Resumen de la Integración LDAP
# pg_hba.conf - enlace LDAP (el directorio valida la contraseña)
hostssl all +ldap_users 10.20.0.0/16 ldap ldapserver=ldap.corp.internal ldapbasedn="dc=corp,dc=internal"-- Mapear grupo LDAP a rol (patrón)
CREATE ROLE ldap_users;
GRANT app_api TO ldap_users; -- heredar privilegios de app mediante GRANTLDAP delega las comprobaciones de contraseña a Active Directory/OpenLDAP. PostgreSQL todavía autoriza con GRANT. Use LDAPS o TLS al directorio.
Patrones de SSO / IAM en la Nube
| Patrón | Cómo funciona |
|---|---|
| Autenticación IAM de RDS | Token de corta duración como contraseña; sin secreto estático en la aplicación |
| IAM de Cloud SQL | Conector o autenticación IAM de DB con token |
| Azure AD | A menudo a través de un proxy o servidor flexible habilitado para AAD |
Las contraseñas SCRAM estáticas siguen siendo comunes para roles de migración y herramientas de BI de terceros sin soporte IAM.
Notas de PostgreSQL
-- Forzar SCRAM para cambios de contraseña de roles
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();
-- Listar roles que todavía usan md5
SELECT rolname FROM pg_authid
WHERE rolpassword LIKE 'md5%';Trampas
- Verificadores md5 después de la actualización - el inicio de sesión solo funciona si
pg_hbatodavía permite md5. Solución: volver aALTER ROLE PASSWORDpara cada rol de inicio de sesión. - Incompatibilidad de
auth_queryde PgBouncer - el pooler debe admitir SCRAM para el backend. Solución: PgBouncer 1.21+ conauth_type = scram-sha-256. - Versiones antiguas de JDBC - SCRAM no es compatible. Solución: PostgreSQL JDBC 42.2.0+.
- Contraseña compartida en la configuración del pool de conexiones - la rotación requiere un despliegue coordinado. Solución: sidecar de vault o tokens IAM por instancia.
- LDAP sin TLS - contraseña del directorio expuesta. Solución: LDAPS y
hostssla Postgres. - Registro de autenticación fallida en
log_statement = all- solo ruido; use registros de conexión y correlación externa de SIEM.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Autenticación por certificado | Identidades fijas de service mesh | Usuarios humanos y portátiles |
| GSSAPI/Kerberos | SSO empresarial ya en Kerberos | Nativas de la nube k8s sin AD |
| Autenticación de token IAM | Postgres administrado por AWS/GCP | Autoalojado sin infraestructura de tokens |
trust (socket local) | psql admin solo en el host de la DB | Cualquier conexión TCP |
Preguntas Frecuentes
¿Es SCRAM mejor que md5?
Sí. md5 es un hash único sin sal por usuario en el sentido del protocolo; SCRAM utiliza verificadores con sal e iteraciones modernas.
¿Necesito cambiar el código de la aplicación para SCRAM?
Solo si el driver es muy antiguo. Los drivers modernos de pg, JDBC, Npgsql y asyncpg admiten SCRAM de forma transparente.
¿Cómo roto las contraseñas SCRAM?
ALTER ROLE PASSWORD, actualizar vault/secreto, reiniciar pods de aplicación en cascada. No se requiere reinicio del servidor.
¿Puede PgBouncer almacenar SCRAM?
Use auth_type = scram-sha-256 y auth_file o auth_query que coincidan con los verificadores del servidor.
¿Qué pasa con los usuarios de replicación?
Los roles de replicación usan las mismas reglas SCRAM; establezca la contraseña y hostssl ... replication en pg_hba.
¿LDAP vs SCRAM para humanos?
LDAP para empleados; cuentas de servicio SCRAM para aplicaciones y roles de migración de CI.
¿RDS aplica SCRAM?
RDS admite SCRAM para autenticación de contraseñas. La autenticación IAM es separada y preferida para aplicaciones nativas de AWS.
Depuración de autenticación fallida?
Verifique el orden de pg_hba, el atributo LOGIN del rol, el requisito de SSL y el soporte SCRAM del cliente.
¿Contraseña en la URI de conexión?
Evitar en el historial del shell. Use .pgpass con permisos 0600 o variable de entorno desde el gestor de secretos.
¿Autenticación multifactor en Postgres?
No incorporada para inicio de sesión SQL. MFA en la capa VPN/SSO o autenticación basada en IAM para ofertas administradas.
Relacionado
- Conceptos básicos de seguridad - roles y concesiones
- Configuración de SSL/TLS - canal de inicio de sesión cifrado
- pg_hba.conf y autenticación - reglas de hba
- Proxies de conexión - autenticación PgBouncer
- Mejores prácticas de seguridad - higiene de credenciales
Versiones de la pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.