GitHub

Хеширование паролей

Андрей Аксенов

Роль, которая может входить в базу данных с использованием аутентификации по паролю, должна иметь пароль. Пароль задается с помощью атрибута PASSWORD при создании новой или изменении существующей роли. Чтобы обеспечить защиту паролей, Greengage DB сохраняет их MD5-хеши вместо того, чтобы хранить пароли в виде обычного текста. При необходимости вы можете изменить алгоритм хеширования паролей для улучшения безопасности.

Обзор

Когда вы создаете нового пользователя с паролем или изменяете пароль существующего пользователя, Greengage DB сохраняет хеш пароля в системном каталоге pg_authid. Хешированием паролей управляют следующие параметры конфигурации:

  • password_encryption — задает, включено ли хеширование паролей. Не рекомендуется отключать этот параметр, поскольку в этом случае пароли хранятся в виде обычного текста.

  • password_hash_algorithm — задает алгоритм, используемый для хеширования паролей.

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

Алгоритм хеширования Описание Поддерживаемые методы аутентификации

MD5 (по умолчанию)

Пароли хешируются с помощью алгоритма MD5

md5, password

SCRAM-SHA-256

Пароли хешируются с помощью алгоритма SCRAM-SHA-256

scram-sha-256, md5, password

SHA-256

Пароли хешируются с помощью алгоритма SHA-256

password

Изменение используемого алгоритма хеширования может повлиять на аутентификацию существующих пользователей. Чтобы обеспечить успешный вход этих пользователей в базу данных, необходимо:

  • Обновить метод аутентификации, заданный в файле pg_hba.conf для этих пользователей.

  • Сбросить пароли пользователей с помощью команды ALTER ROLE.

Управление хешированием паролей на глобальном уровне

Проверка текущего алгоритма хеширования

Чтобы определить, включено ли хеширование паролей, используйте параметр конфигурации password_encryption:

$ gpconfig -s password_encryption

Результат должен выглядеть так:

Values on all segments are consistent
GUC          : password_encryption
Master  value: on
Segment value: on

Чтобы узнать применяемый алгоритм хеширования, используйте параметр password_hash_algorithm:

$ gpconfig -s password_hash_algorithm

Результат должен выглядеть следующим образом:

Values on all segments are consistent
GUC          : password_hash_algorithm
Master  value: MD5
Segment value: MD5

Изменение алгоритма хеширования

Чтобы изменить алгоритм хеширования паролей на глобальном уровне, используйте параметр конфигурации password_hash_algorithm:

$ gpconfig -c password_hash_algorithm -v 'SCRAM-SHA-256'

Чтобы применить изменения, перезагрузите конфигурацию с помощью gpstop:

$ gpstop -u

Затем вы можете проверить, что используется заданный алгоритм:

$ gpconfig -s password_hash_algorithm

Результат должен выглядеть следующим образом:

Values on all segments are consistent
GUC          : password_hash_algorithm
Master  value: SCRAM-SHA-256
Segment value: SCRAM-SHA-256

Управление хешированием паролей на уровне сессии

Проверка текущего алгоритма хеширования

Чтобы определить, включено ли хеширование паролей, используйте параметр конфигурации password_encryption:

SHOW password_encryption;

Результат должен выглядеть так:

 password_encryption
---------------------
 on

Чтобы узнать текущий алгоритм хеширования, используйте параметр password_hash_algorithm:

SHOW password_hash_algorithm;

Результат должен выглядеть следующим образом:

 password_hash_algorithm
-------------------------
 MD5

Изменение алгоритма хеширования

Чтобы изменить алгоритм хеширования паролей на уровне сессии, используйте параметр конфигурации password_hash_algorithm:

SET password_hash_algorithm = 'SCRAM-SHA-256';

Затем вы можете проверить, что для данной сессии используется заданный алгоритм:

SHOW password_hash_algorithm;

Результат должен выглядеть следующим образом:

 password_hash_algorithm
-------------------------
 SCRAM-SHA-256

Пример: Изменение алгоритма хеширования в сессии

Данный пример демонстрирует, как изменить алгоритм хеширования пароля в сессии с MD5 на SCRAM-SHA-256.

  1. Создайте двух пользователей с паролями:

    CREATE ROLE alice WITH LOGIN PASSWORD '123456';
    CREATE ROLE bob WITH LOGIN PASSWORD 'foobar';
  2. Чтобы увидеть, как пароли хранятся в базе данных, получите данные из системного каталога pg_authid:

    SELECT rolname, rolpassword FROM pg_authid;

    Префикс md5 в значениях столбца rolpassword указывает, что используется алгоритм хеширования MD5:

     rolname |             rolpassword
    ---------+-------------------------------------
     gpadmin |
     alice   | md506b4475e55db6d5d87d3f690c591b5d9
     bob     | md5e104270d96d95e992cd5a0889fea9a62
  3. Измените алгоритм хеширования на SCRAM-SHA-256:

    SET password_hash_algorithm = 'SCRAM-SHA-256';
  4. Сбросьте пароль пользователя alice:

    ALTER ROLE alice WITH PASSWORD '123456';
  5. Перепроверьте данные в системном каталоге pg_authid:

    SELECT rolname, rolpassword FROM pg_authid;

    Обратите внимание, что значение rolpassword для alice теперь начинается с SCRAM-SHA-256:

     rolname |                                                              rolpassword
    ---------+---------------------------------------------------------------------------------------------------------------------------------------
     gpadmin |
     bob     | md5e104270d96d95e992cd5a0889fea9a62
     alice   | SCRAM-SHA-256$4096:KqJxVxjdp12Ndd1igeD+ig==$8akIprzpNUTIqxN9di0pz7ao7Jp14RiIEwjzkucBzqA=:HWrnwvb1/1ktYq5adswEY9dzMqTGHMMnzAg7VV6ii3U=
  6. Чтобы убедиться, что пользователь alice может успешно подключиться к базе данных, обновите файл pg_hba.conf одним из следующих способов:

    • Метод аутентификации md5 позволяет использовать оба алгоритма хеширования — MD5 и SCRAM-SHA-256:

      # connection-type  database  user   address       auth-method
      host               postgres  alice  .example.com  md5
    • Метод аутентификации scram-sha-256 может использоваться только с алгоритмом хеширования SCRAM-SHA-256:

      # connection-type  database  user   address       auth-method
      host               postgres  alice  .example.com  scram-sha-256