Как шифруются (хешируются) пароли в PostgreSQL?

«Как шифруются (хешируются) пароли в PostgreSQL?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PostgreSQL не шифрует, а хеширует пароли перед хранением. Метод хеширования настраивается и эволюционировал со временем. В своей работе я всегда настраиваю использование самых современных и безопасных методов.

Доступные методы (в pg_hba.conf указывается как auth-method):

  1. scram-sha-256 (РЕКОМЕНДУЕМЫЙ, начиная с PostgreSQL 10):

    • Как работает: Использует протокол SCRAM (Salted Challenge Response Authentication Mechanism) с SHA-256. Это стойкий к подбору метод, который не передаёт хэш по сети даже во время аутентификации.
    • Формат хранения: В системном каталоге pg_authid хранятся salt (соль) и iterations (количество раундов) отдельно от результата вычислений.
      -- Создание пользователя с паролем (будет использован scram-sha-256 по умолчанию, если задан password_encryption)
      CREATE ROLE app_user WITH LOGIN PASSWORD 'StrongPass123!';
  2. md5 (УСТАРЕВШИЙ, следует избегать):

    • Как работает: Хранит MD5-хеш от конкатенации пароля и имени пользователя. Уязвим к атакам перебором.
    • Почему не использовать: Алгоритм MD5 криптографически сломан.
  3. password (ОПАСНЫЙ, только для legacy):

    • Как работает: Передаёт и может хранить пароль в открытом виде.
    • Никогда не используйте в production.

Критически важная настройка password_encryption: Этот параметр в postgresql.conf определяет, какой алгоритм будет использоваться по умолчанию при задании пароля командой CREATE/ALTER ROLE ... PASSWORD.

# postgresql.conf
password_encryption = scram-sha-256  # Устанавливаем самый безопасный метод по умолчанию

После изменения конфига требуется перезагрузка (pg_reload_conf()).

Настройка аутентификации в pg_hba.conf:

# pg_hba.conf
# Разрешаем подключения с локального хоста только по SCRAM-SHA-256
host    all             all             127.0.0.1/32            scram-sha-256
# Для хостов из доверенной сети можно использовать 'trust', но не для паролей!

Мой подход: В новых кластерах я сразу устанавливаю password_encryption = scram-sha-256 и в pg_hba.conf указываю только scram-sha-256 для парольной аутентификации, полностью отказываясь от md5.