Команда pg_dumpall сохраняет ли хэши паролей пользователей в резервной копии?

Как правильно перенести базы данных с серверов PostgreSQL 10 на новые сервера с PostgreSQL 16, если при использовании команды <code>pg_dumpall</code> возникают проблемы с паролями пользователей? Я заметил, что развернутая база на PostgreSQL 16 не принимает пароли, которые были настроены на PostgreSQL 10. Я использовал команду: <br/> <code>pg_dumpall &gt; /path/to/dump.sql</code> <br/> Предположив, что причина может быть связана с различиями в методах шифрования паролей (в PostgreSQL 10 использовалось <code>md5</code>, а в PostgreSQL 16 - <code>scram-sha-256</code>), я попытался развернуть дамп на серверах с <code>md5</code>, но это не помогло. В <a href="https://postgrespro.ru/docs/postgrespro/16/app-pg-dumpall" rel="nofollow">документации</a> не нашёл информации о том, включаются ли хэши паролей при выполнении команды <code>pg_dumpall</code>. Возможно ли перенести базы данных, пользователей и хэши паролей между этими версиями PostgreSQL?
  • 13 января 2025 г. 11:04
Ответы на вопрос 2
Команда `pg_dumpall` действительно сохраняет информацию о пользователях и их паролях, однако хэшированные пароли, которые она сохраняет, будут использовать алгоритм хеширования, поддерживаемый целевой версией PostgreSQL. Ваша проблема может быть связана с тем, что метод хеширования паролей изменился между версиями PostgreSQL (как вы правильно заметили, с `md5` на `scram-sha-256`).

Когда вы переносите базу данных с PostgreSQL 10 на PostgreSQL 16, необходимо учитывать следующее:

1. **Хеширование паролей**: Если пароли пользователей были хэшированы с использованием `md5` на PostgreSQL 10, то PostgreSQL 16 не сможет их аутентифицировать, если сервер настроен на использование `scram-sha-256` по умолчанию. Это может быть одной из причин, по которой старые пароли не принимаются.

2. **Целесообразный подход**:
   - Перед переносом баз данных на новый сервер, лучше всего создать пользователей на новом сервере с теми же паролями и установить их на стороне PostgreSQL 16 в формате, который поддерживается данной версией (например, с помощью `scram-sha-256`).
   - Для этого:
     1. Создайте дамп с помощью `pg_dumpall` для всей базы данных (это включает в себя пользователей).
     2. На новом сервере, подчиняя новый формат хеширования, создайте пользователей вручную с теми же именами и паролями с использованием команды `CREATE ROLE`.
     3. После создания ролей загрузите данные из вашего дампа.

3. **Настройки сервера**:
   - Возможно, будет полезно на время откатить режим аутентификации на сервере PostgreSQL 16 на `md5`, чтобы обеспечить обратную совместимость для вашей аутентификации, а затем вы сможете в дальнейшем обновить пароли пользователей на `scram-sha-256`.

4. **Обновление паролей**:
   - После переноса данных, вы можете обновить пароли всех пользователей, чтобы они использовали новый метод хеширования, например, с помощью команды `ALTER ROLE`.

В результате, чтобы минимизировать сложности, лучше перестать полагаться на хэши паролей, создаваемые старой версией, и вручную проверить и создать пользователей в новой системе.
Список пользователей и пароли хранятся в базе postgres таблице pg_authid. 

Способ авторизации и откуда допустим доступ - задается в файле pg_hba.conf. ( Этот файл точно в файш бэкап не попадает).

Проверяете, какие таблицы были импортированы.
Смотрите, есть ли в новой базе нужные пользователи.
По логу базы смотрите, почему не проходит авторизация.
Похожие вопросы