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

Сценарии использования

Доступ в БД через Pangolin Pooler

  1. Подключитесь в psql консоль пользователем postgres через Pangolin Pooler:

    $ psql -p 6544

    Ожидаемый результат: Вход успешный.

  2. Зайдите в консоль администрирования Pangolin Pooler:

    $ psql -p 6544 -U pgbouncer -d pgbouncer
  3. Для проверки можно выполнить команду, показывающую подключенных к базе пользователей и их количество:

    SHOW CLIENTS;

    Ожидаемый результат: Вернулся список пользователей, подключенных к базе данных через Pangolin Pooler. Пример вывода:

    -[ RECORD 4 ]-------+------------------------
    type | C
    user | postgres
    database | postgres
    state | active
    addr | {IP-Address}
    port | {port}
    local_addr | {IP-Address}
    local_port | {local_port}
    connect_time | 2024-07-29 16:40:55 MSK
    loged_in_time | 2024-07-29 17:05:30 MSK
    request_time | 2024-07-29 16:55:41 MSK
    wait | 0
    wait_us | 0
    loged_in | 0
    loged_in_us | 0
    close_needed | 0
    ptr | 0x259cf70
    link |
    remote_pid | 0
    tls |
    application_name | psql
    prepared_statements | 0

Вывод версии компонента

Для вывода версии компонента Pangolin Pooler, а также ядра компонента (PgBouncer) выполните команду:

pangolin-pooler -V

Пример вывода:

Pangolin Pooler 1.5.0
PgBouncer 1.24.0
libevent 2.1.8-stable
adns: evdns2
tls: OpenSSL 1.1.1k FIPS 25 Mar 2021
authproxy: yes
2fa: yes

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

  1. Настройте двухфакторную аутентификацию для реализации подключения к СУБД через Pangolin Pooler с включенной или выключенной сквозной аутентификацией.

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

    postgres=#CREATE ROLE test_user;
    CREATE ROLE

    postgres=#ALTER user test_user WITH LOGIN;
    ALTER ROLE

    postgres=#ALTER user test_user WITH PASSWORD '<password>';
    ALTER ROLE
  3. Подключитесь к Pangolin, выполните команду:

    psql 'host=clustername port=5433 user=test_user sslmode=verify-ca sslcert=client-test_user.crt sslkey=client-test_user.key sslrootcert=root.crt'

    Введите на запрос пароля корректный пароль, указанный при создании пользователя. В случае успеха psql перейдет в режим ожидания ввода запросов:

    Password for user test_user:

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

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

    test_user@postgres=#
  4. Проверьте, что выполняется запрос к БД, например:

    test_user@postgres=# SELECT now();

    +-------------------------------+
    | now |
    +-------------------------------+
    | 2025-06-27 17:18:22.813347+03 |
    +-------------------------------+
    (1 row)

Сброс контекста сквозной аутентификация

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

  1. Выполните запрос списка пользователей:

    PGPASSWORD='<password3>' psql -p 6544 -d pgbouncer -U pgbouncer -c "SHOW AUTHUSERS"

    Ожидаемый результат: Запрос выполнен успешно. Все значения колонки auth_state равны done. Пример вывода:

    name   |    addr     | port  | database | pool_mode | tls | auth_state
    ------+--------------+-------+----------+-----------+-----+------------
    u1 | <IP-Address> | 44246 | d1 | | yes | done
    u1 | <IP-Address> | 44260 | d2 | | yes | done
    u2 | <IP-Address> | 43228 | d2 | | yes | done
    (3 rows)
  2. Выполните сброс состояния аутентификация для всех пользователей:

    PGPASSWORD='<password3>' psql -p 6544 -d pgbouncer -U pgbouncer -c "RESET_AUTH"

    Результат: Запрос выполнен успешно:

    RESET_AUTH
  3. Повторно выполните запрос списка пользователей:

    PGPASSWORD='<password3>' psql -p 6544 -d pgbouncer -U pgbouncer -c "SHOW AUTHUSERS"

    Ожидаемый результат: Запрос выполнен успешно. Все значения колонки auth_state равны none. Пример вывода:

    name   |    addr     | port  | database | pool_mode | tls | auth_state
    ------+--------------+-------+----------+-----------+-----+------------
    u1 | <IP-Address> | 44246 | d1 | | yes | none
    u1 | <IP-Address> | 44260 | d2 | | yes | none
    u2 | <IP-Address> | 43228 | d2 | | yes | none
    (3 rows)

Исправление попытки неудачной аутентификации

  1. Выполните подключение к БД. Пример команды:

    psql "host=<IP-Address> port=<port> user=testuser dbname=testdb sslmode=require"
  2. Аутентификация завершена ошибкой:

    psql: error: FATAL
  3. Проверьте лог-файл Pangolin Pooler на наличие записи типа:

    2025-07-18 14:31:02.104 MSK [2102] FATAL testdb/testuser@<IP-Address>:<port> PgBouncer does not allow to use weak authentication type: "trust"
  4. Исправьте метод аутентификации в pg_hba на стороне СУБД, заменив trust на безопасный метод, например scram-sha-256:

    # Было:
    host all all <IP-Address>/32 trust

    # Стало:
    host all all <IP-Address>/32 scram-sha-256
  5. Перечитайте конфигурацию:

    sudo systemctl reload postgresql
  6. Повторите попытку подключения:

    psql "host=<IP-Address> port=<port> user=testuser dbname=testdb sslmode=require"
  7. Успешная аутентификация подтверждается сообщениями в логе:

    2025-07-18 14:34:44.412 MSK AUDIT testdb/testuser@<IP-Address>:<port> login attempt tls=yes
    2025-07-18 14:34:44.416 MSK AUDIT testdb/testuser@<IP-Address>:<port> send auth startup packet
    2025-07-18 14:34:44.491 MSK AUDIT testdb/testuser@<IP-Address>:<port> auth server login ok

Определение клиентского IP-адреса, подключенного к СУБД через Pangolin Pooler

Вне зависимости от использования сквозной аутентификации, определить клиентский IP-адрес можно следующим образом:

  1. Выполните запрос для поиска целевого подключения и его параметров. Пример:

    postgres=# SELECT * FROM pg_stat_activity WHERE datname = 'tst1'\gx

    -[ RECORD 1 ]----+-------------------------------------------------------------------
    datid | 16734
    datname | tst1
    pid | 2366
    usesysid | 10
    usename | postgres
    application_name | pgAdmin 4 - CONN:9435271
    client_addr |
    client_hostname |
    client_port |
    backend_start | 2023-11-13 11:57:06.347595+03
    xact_start | 2023-11-13 11:57:58.16217+03
    query_start | 2023-11-13 11:57:58.16217+03
    state_change | 2023-11-13 11:57:58.162323+03
    wait_event_type | Client
    wait_event | ClientRead
    state | idle in transaction
    query | begin;
    | select 1;
    backend_type | client backend

    Значения pid и client_port, которые будут использоваться далее: pid = 2366, client_port = 54406.

  2. Подключитесь к административной БД pgbouncer:

    $ psql -p 6544 -U pgbouncer -d pgbouncer
  3. Выполните команду SHOW SERVERS и по значениям remote_pid и local_port найдите нужную запись:

    pgbouncer=# SHOW SERVERS\gx 

    -[ RECORD 3 ]-+------------------------
    type | S
    user | postgres
    database | tst1
    state | active
    addr | <IP-Address>
    port | <port>
    local_addr | <IP-Address>
    local_port | <port>
    connect_time | 2023-11-13 11:57:06 MSK
    loged_in_time | 2023-11-13 11:57:06 MSK
    request_time | 2023-11-13 11:57:58 MSK
    remote_pid | 2366
    link | 0x179d6b0

    Значение link, равное 0x179d6b0, потребуется на следующем шаге.

  4. Выполните SHOW CLIENTS и найдите запись, где ptr совпадает с link из предыдущего шага:

    pgbouncer=# SHOW CLIENTS\gx

    -[ RECORD 3 ]-+------------------------
    type | C
    user | postgres
    database | tst1
    state | active
    addr | <IP-Address_client>
    port | <port>
    local_addr | <IP-Address>
    local_port | <port>
    connect_time | 2023-11-13 11:57:28 MSK
    loged_in_time | 2023-11-13 13:30:22 MSK
    request_time | 2023-11-13 11:57:58 MSK
    ptr | 0x179d6b0

    В поле addr указано значение IP-адреса клиента, а в port — клиентский порт подключения к pgbouncer.

  5. Дополнительно можно включить расширенное логирование, чтобы видеть IP-адрес клиента и его порт в логах. Для этого в конфигурационный файл pangolin-pooler.ini добавьте параметр log_audit в значении 1:

    log_audit = 1