Postgresql scram

Recientemente me encontraba actualizando mi repositorio de código Gitea desplegado a través de Docker a la última versión 1.23.8 y aproveché también para actualizar la obsoleta versión de la base de datos Postgres que estaba usando. La migración de la base de datos fue directa, sin embargo, el problema surgió al validar el correcto funcionamiento de Gitea, obteniendo el siguiente error:

root@pi:~ # docker compose logs -f
[...]
FATAL:  password authentication failed for user "gitea"
DETAIL:  User "gitea" does not have a valid SCRAM secret.
[...]

Parece ser que a partir de la release 14 de Postgres el método de cifrado de contraseñas pasó del ya inseguro MD5 a scram-sha-256 como puedes ver en el commit y en las notas de la versión.

  • Change the default of the password_encryption server parameter to scram-sha-256 (Peter Eisentraut) §Previously it was md5. All new passwords will be stored as SHA256 unless this server setting is changed or the password is specified in MD5 format. Also, the legacy (and undocumented) Boolean-like values which were previously synonyms for md5 are no longer accepted.

 

Reemplazando de la encriptación MD5 por SCRAM

La solución a este problema consiste en actualizar la encriptación de la contraseña del usuario gitea (y otros si existiesen). Para ello, arrancamos únicamente el servicio de postgresql en Docker y accedemos a éste:

root@pi:~# docker compose up -d postgres
root@pi:~# docker exec -it gitea_postgres bash

Y ya dentro del contenedor de Postgres nos conectamos con nuestro usuario:

root@184e41047ba3:/# psql -U gitea

y ejecutamos la siguiente consulta:

SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS scram_pw FROM pg_authid WHERE rolcanlogin;

El resultado obtenido será algo similar a lo siguiente, en el que podremos ver que efectivamente las credenciales de nuestro usuario gitea no está incriptada con scram:

gitea=# SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS scram_pw FROM pg_authid WHERE rolcanlogin;
 rolname | scram_pw 
---------+--------------
 gitea   | f

Como sólo tenemos un usuario, para actualizar la encriptación tan solo nos bastará con volver a establecer la contraseña:

gitea=# \password gitea
Enter new password for user "gitea": 
Enter it again:

Ahora, si volvemos a ejecutar la consulta anterior, podremos ver que la contraseña está encriptada usando scram:

gitea=# SELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS scram_pw FROM pg_authid WHERE rolcanlogin;
 rolname | scram_pw 
---------+--------------
 gitea   | t

Tras este cambio, y al volver a arrancar el servicio de Gitea, éste pudo volver a iniciarse sin problemas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *