Перейти к основному содержимому

Двухфакторная аутентификация

Двухфакторная аутентификация – это технология, обеспечивающая идентификацию пользователей при помощи запроса аутентификационных данных двух разных типов. Она обеспечивает двухслойную, а значит, более эффективную защиту СУБД от несанкционированного проникновения.

Подключение пользователя к СУБД с помощью двухфакторной аутентификации может осуществляться:

Для реализации механизма двухфакторной аутентификации требуется:

  1. Настроить режим взаимодействия с клиентами по TLS.

    Вторым фактором проверки в двухфакторной аутентификации всегда является проверка сертификата клиента.

    Сертификат безопасности клиента должен содержать поле CN, содержащее логин клиента и, опционально, поле SubjectAltName, содержащее один или несколько IP-адресов (возможен вариант указания подсети) и (или) DNS-имен клиента.

  2. Указать в конфигурации один из специальных методов аутентификации: 2f-scram-sha-256, 2f-ldap, 2f-md5 и 2f-password.

    Внимание!

    Необходимо учитывать, что разрешенными по умолчанию механизмами двухфакторной аутентификации являются 2f-scram-sha-256 и 2f-ldap.

    При необходимости использования методов аутентификации 2f-md5 и 2f-password нужно добавить эти методы в параметр enabled_extra_auth_methods в конфигурационном файле:

    • postgresql.conf для конфигурации сервера standalone;

    • postgres.yml для конфигурации cluster.

    Например:

    enabled_extra_auth_methods = '2f-md5, 2f-password'

Описание механизма

Алгоритм выполнения двухфакторной аутентификации:

  1. Сверка IP-адреса (при наличии IP/DNS в клиентском сертификате) и сверка логина:
  • сверка IP-адреса, закодированного в атрибуте SubjectAltName сертификата, используемого клиентом для установления соединения по TLS/SSL с фактическим IP-адресом клиента. Сверка IP-адреса не выполняется в случае, если в сертификате нет атрибута SubjectAltName или он не содержит IP/DNS. Атрибут SubjectAltName может содержать и другие значения, например DNS;
  • сверка логина, закодированного в атрибуте CN сертификата, используемого клиентом для установления соединения по TLS/SSL, c логином из первого фактора;
  1. Аутентификация по паролю с методами: md5, scram-sha-256.

Общая схема выполнения двухфакторной аутентификации:

Процесс двухфакторной аутентификации

Прямое подключение к Pangolin

В данном разделе будет рассмотрен пример настройки двухфакторной аутентификации при подключении пользователя напрямую к СУБД Pangolin.

Для прямого подключения к СУБД необходимо выполнить настройку Pangolin для двухфакторной аутентификации:

  1. Создайте сертификаты, удовлетворяющие требованиям двухфакторной аутентификации (root или ca, server и client). Информация по генерации представлена в разделах «Генерация сертификатов» и «Использование сертификатов PKCS#12 в кластере Pangolin».

  2. В файле postgresql.conf/postgres.yaml включите SSL-режим и укажите пути к корневому и серверному сертификатам. Далее приведен пример настройки параметров с обычными сертификатами:

    # Включить SSL-режим
    ssl = on
    # Путь в Root/CA-сертификату
    ssl_ca_file = './root.crt'
    # Путь к SSL-сертификату сервера
    ssl_cert_file = './server.crt'
    # Путь к SSL-ключу сервера
    ssl_key_file = './server.key'
  3. В файле pg_hba.conf (или секции pg_hba конфигурационного файла postgres.yml, в случае кластерной конфигурации) укажите:

    • тип соединения - hostssl;

    • метод аутентификации: 2f-scram-sha-256, 2f-md5, 2f-password или 2f-ldap. Пример:

      # TYPE   DATABASE         USER              ADDRESS             METHOD
      hostssl test test1 127.0.0.1/32 2f-md5
      hostssl test test1 hostname 2f-scram-sha-256
  4. Перечитайте конфигурацию сервера (reload).

Пример подключения

Для подключения к серверу баз данных с использованием двухфакторной аутентификации необходимо в строке подключения передать параметр SSL-соединения и пути к серверному сертификату и ключу. Пример команды:

$ psql "host=127.0.0.1 port=5432 user=test_cert_user dbname=postgres sslmode=require sslcert=/pg_ssl/test_cert_user.crt sslkey=/pg_ssl/test_cert_user.key"

Введите пароль при возникновении запроса:

Password for user test_cert_user: 

Ожидаемый результат:

psql (17.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Схема процесса

Двухфакторная аутентификация без использования Pangolin Pooler

  1. Пользователь осуществляет попытку аутентификации по паре логин/пароль.
  2. SSL-сертификат пользователя, а так же его параметры подключения передаются в Pangolin.
  3. Выполняется сверка IP-адреса и логина пользователя из сертификата с IP-адресом и логином параметров подключения.
  4. В случае успешной аутентификации, открывается соединение к БД. В противном случае происходит разрыв соединения, выводится сообщение о причине отказа.

Подключение к Pangolin через Pangolin Pooler с включенной сквозной аутентификацией

Для подключения к Pangolin через Pangolin Pooler с включенной сквозной аутентификацией

  1. Создайте сертификаты удовлетворяющие требованиям двухфакторной аутентификации (root или ca, server и client сертификаты).

  2. Настройте сквозную аутентификацию:

    • в конфигурационном файле СУБД Pangolin (postgresql.conf/postgres.yaml) укажите:

      • authentication_proxy = on;
      • authentication_port = {AUTHPORT};

      Пример:

      port = 5432
      ...
      authentication_port = 5544
      authentication_timeout = 60 # sec
      auth_activity_period = 10 # sec
    • в конфигурационном файле Pangolin Pooler укажите:

      • auth_port={AUTHPORT};
      • auth_proxy = on.

      Пример:

      [pgbouncer]
      auth_proxy = on

      ...

      [databases]
      * = host=localhost port=5432 auth_port=5544 auth_pool_size=1
  3. Выполните настройку СУБД Pangolin для двухфакторной аутентификации:

    • в файле postgresql.conf/postgres.yaml - включите SSL режим и укажите пути к корневому, серверному сертификатам и ключу:

      ssl = on
      ssl_ca_file = './root.crt'
      ssl_cert_file = './server.crt'
      ssl_key_file = './server.key'
    • в файле pg_hba.conf (или секции pg_hba, конфигурационного файла postgres.yml кластерной конфигурации) укажите:

      • тип соединения - hostssl;

      • метод аутентификации: 2f-scram-sha-256, 2f-md5, 2f-password или 2f-ldap. Пример настройки:

        # TYPE   DATABASE         USER              ADDRESS             METHOD
        hostssl test test_user 127.0.0.1/32 2f-md5
        hostssl test test_user hostname 2f-scram-sha-256
  4. Перечитайте конфигурацию сервера (reload).

Пример подключения

Пример команды подключения к Pangolin с использованием механизма сквозной аутентификации:

psql 'host=<server_IP> port=6544 user=user1 sslmode=verify-ca sslcert=client-user1.crt sslkey=client-user1.key sslrootcert=root.crt'

Пример команды при использовании метода 2f-ldap:

psql 'host=<server_IP> port=6544 user=<username> sslmode=verify-ca sslcert=client-ldap-ip.crt sslkey=client-ldap-ip.key sslrootcert=root.crt'

Введите пароль при возникновении запроса:

Password for user user1: 

Ожидаемый результат:

psql (17.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Схема процесса

Двухфакторная аутентификация с использованием сквозной аутентификации

  1. Пользователь осуществляет попытку аутентификации по паре логин/пароль.
  2. SSL-сертификат пользователя, а так же его параметры подключения передаются в Pangolin Pooler. Инициируется процесс аутентификации пользователя.
  3. Pangolin Pooler передает данные SSL-сертификата, параметры подключения, данные аутентификации в Pangolin.
  4. Выполняется сверка IP-адреса из сертификата с IP-адресом параметров подключения. В случае успешной сверки осуществляется переход к следующему шагу, иначе соединение разрывается по причине несовпадения IP-адреса, выводится сообщение о причине отказа.
  5. Выполняется сверка логина из сертификата с логином параметров подключения. При успешной сверке осуществляется переход к следующему шагу, иначе соединение разрывается по причине несовпадения логина, выводится сообщение о причине отказа.
  6. Выполняется попытка аутентификации по паре логин\пароль. При успешной сверке аутентификации осуществляется переход к следующему шагу, иначе соединение разрывается по причине не верного пароля, выводится сообщение о причине отказа.
  7. Аутентификация выполнена, происходит сохранение auth-статуса в контексте аутентификации. Pangolin информирует Pangolin Pooler о выполнении аутентификации. В Pangolin Pooler передаются auth-статус, token, verifier.
  8. Pangolin Pooler принимает auth-статус, token, verifier, анализируется auth-статус. В случае статуса Active, в контексте аутентификации сохраняется auth-статус, token, verifier, устанавливается период активности аутентификации, происходит переход к следующему шагу. При других статусах выполняется отказ в открытии доступа к БД и сброс соединения по причине «плохого» контекста, устанавливается период неактивности и выводится сообщение о причине отказа.
  9. В Pangolin выполняется анализ доступных соединений на основе контекста аутентификации и token, вследствие чего Pangolin Pooler либо использует свободное соединение для подключения к БД (используется ранее созданный процесс), либо открывается новое соединение для работы с БД.

Подключение к Pangolin через Pangolin Pooler с выключенной сквозной аутентификацией

Сведения

Данные настройки также влияют на подключение к интерфейсу администрирования Pangolin Pooler.

Внимание!

Аутентификация выполняется на уровне компонента Pangolin Pooler. В Pangolin Pooler с выключенной сквозной аутентификацией не поддерживается аутентификация LDAP, поэтому 2f-ldap так же не поддерживается.

Для подключения к серверу Pangolin через Pangolin Pooler с использованием двухфакторной аутентификации необходимо:

  1. Создайте сертификаты, удовлетворяющие требованиям двухфакторной аутентификации (root или ca, server и client).

  2. В файле конфигурации pangolin-pooler.ini укажите:

    • параметры подключения SSL/TLS;

    • метод аутентификации: 2f-scram-sha-256, 2f-password или 2f-md5.

      Внимание!

      Методы 2f-password или 2f-md5 признаны небезопасными, рекомендуется использовать 2f-scram-sha-256.

    Пример:

    [pgbouncer]
    auth_type = 2f-scram-sha-256

    ; TLS settings
    client_tls_protocols = all
    client_tls_sslmode = verify-full
    client_tls_ca_file = ./root.crt
    client_tls_cert_file = ./server.crt
    client_tls_key_file = ./server.key

    [databases]
    * = host=localhost port=5432
    Примечание

    Если на сервере используется SSL-соединение, то в pgbouncer.ini необходимо прописать настройки server_tls_*. Подробнее о конфигурационных параметров компонента Pangolin Pooler описано в разделе «Администрирование Pangolin Pooler» документа «Руководство администратора».

  3. Выполните настройку СУБД Pangolin. Определите в файле pg_hba.conf параметры для аутентификации пользователей:

    # TYPE   DATABASE         USER              ADDRESS             METHOD
    host all test_user 0.0.0.0/0 scram-sha-256

    Указать необходимо «обычный» метод аутентификации (не двухфакторный), так как защищенное соединение выполняется между клиентом и Pangolin Pooler.

  4. Перечитайте конфигурацию сервера (reload).

Пример подключения

В данном разделе рассматривается пример подключения, где аутентификация выполняется на уровне Pangolin Pooler, с использованием двухфакторной аутентификации:

psql 'host=<server_IP> port=6544 user=user1 sslmode=verify-ca sslcert=client-user1.crt sslkey=client-user1.key sslrootcert=root.crt'

Введите пароль при возникновении запроса:

Password for user user1: 

Ожидаемый результат:

psql (17.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Схема процесса двухфакторная аутентификация

Двухфакторная аутентификация с использованием Pangolin Pooler

  1. Пользователь осуществляет попытку аутентификации по паре логин/пароль.
  2. SSL-сертификат пользователя, а так же его параметры подключения передаются в Pangolin Pooler.
  3. Выполняется сверка IP-адреса и логина пользователя из сертификата с IP-адресом и логином параметров подключения. При успешной сверке осуществляется переход к следующему шагу. В случае неуспеха соединение разрывается выводится сообщение о причине отказа.
  4. Происходит аутентификация по паре логин/пароль, выполняется обмен данными аутентификации, Pangolin Pooler подключается к Pangolin. При успешной аутентификации осуществляется переход к следующему шагу. В случае неуспеха, соединение разрывается, выводится сообщение о причине отказа.
  5. Аутентификация выполнена, происходит сохранение auth-статуса в контексте аутентификации. Pangolin информирует Pangolin Pooler о выполнении аутентификации. В Pangolin Pooler передаются auth-статус, token, verifier.
  6. Pangolin Pooler принимает auth-статус, token, verifier, анализируется auth-статус. В случае статуса Active, в контексте аутентификации сохраняется auth-статус, token, verifier, устанавливается период активности аутентификации. При других статусах выполняется отказ в открытии доступа к БД и сброс соединения по причине «плохого» контекста, устанавливается период неактивности и выводится сообщение о причине отказа.
  7. В Pangolin выполняется анализ доступных соединений на основе контекста аутентификации и token, вследствие чего Pangolin Pooler либо использует свободное соединение для подключения к БД (используется ранее созданный процесс), либо открывается новое соединение для работы с БД.