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

login_hook. Выполнение кода при входе пользователя в систему

Версия: 1.7

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Расширение login_hook предназначено для выполнения некоторого кода при входе пользователя в систему, аналогичное триггеру Oracle после входа в систему.

login_hook позволяет:

  • предотвращать использование пользователем определенного клиента для подключения к базе данных;
  • регистрировать события входа, записывать активность пользователя для отслеживания подозрительного поведения;
  • инициализировать данные сеанса, настраивать пользовательскую среду;
  • делать запрет на вход в определенное время, например, в ночное.

Доработка

Доработка не проводилась.

Ограничения

  1. Неправильно созданная функция триггера может запретить логин для всех пользователей. Чтобы выключить расширение и восстановить доступ, можно убрать login_hook из session_preload_libraries.
  2. В PostgreSQL 17 добавлен login event trigger. При переходе на версию Pangolin 7 и выше следует перейти на использование встроенного триггера. Поддержка open-source расширения прекратится с версии PostgreSQL 18.
  3. Необходимо убедиться, что все исключения, возникающие в функции login_hook.login(), обрабатываются должным образом, поскольку в противном случае вход в базу данных может оказаться сложной задачей. Суперпользователи получат предупреждение, но им все равно будет разрешено войти в систему, чтобы иметь возможность исправить работу функции. Обычные пользователи будут немедленно выведены из системы при сбое функции login_hook.login().
  4. Необходимо разрешение на публичное выполнение функции login_hook.login(). Чтобы эту функцию не вызывали явно, функция login_hook.is_executing_login_hook() может использоваться для проверки того, вызывается ли функция под управлением кода login_hook.

Права

Создавать функцию login_hook.login() может только суперпользователь.

Алгоритм работы login_hook

Настройка

  1. Установите rpm\deb-пакет расширения login_hook:

    sudo dnf install pangolin-login-hook-{version_component}-{OS}.x86_64.rpm

    Где:

    • {version_component} – версия поставляемого расширения;
    • {OS} – наименование операционной системы и ее версия.

    Пример заполненной команды:

    cd distributive
    tar -xzf 3rdparty/3rdparty.tar.gz -C 3rdparty/
    sudo dnf install -y 3rdparty/login_hook/pangolin-login-hook-1.7-sberlinux9.x86_64.rpm
  2. Добавьте расширение в параметр session_preload_libraries:

    session_preload_libraries = 'login_hook'
  3. Перечитайте конфигурацию:

    SELECT pg_reload_conf();
  4. Подключитесь к базе данных и создайте расширение:

    CREATE EXTENSION login_hook;
  5. Создайте функцию login_hook.login(), которая должна выполняться при входе клиента в систему. Пример:

    CREATE OR REPLACE FUNCTION login_hook.login() RETURNS VOID LANGUAGE PLPGSQL AS $$
    DECLARE
    ex_state TEXT;
    ex_message TEXT;
    ex_detail TEXT;
    ex_hint TEXT;
    ex_context TEXT;
    BEGIN
    IF NOT login_hook.is_executing_login_hook()
    THEN
    RAISE EXCEPTION 'The login_hook.login() function should only be invoked by the login_hook code';
    END IF;

    BEGIN
    -- Пример действий при входе клиента в систему:
    RAISE NOTICE 'Hello %', current_user;
    EXCEPTION
    WHEN OTHERS THEN
    GET STACKED DIAGNOSTICS ex_state = RETURNED_SQLSTATE
    , ex_message = MESSAGE_TEXT
    , ex_detail = PG_EXCEPTION_DETAIL
    , ex_hint = PG_EXCEPTION_HINT
    , ex_context = PG_EXCEPTION_CONTEXT;
    RAISE LOG e'Error in login_hook.login()\nsqlstate: %\nmessage : %\ndetail : %\nhint : %\ncontext : %'
    , ex_state
    , ex_message
    , ex_detail
    , ex_hint
    , ex_context;
    END ;
    END
    $$;
    GRANT EXECUTE ON FUNCTION login_hook.login() TO PUBLIC;

Ссылки на документацию разработчика

https://github.com/splendiddata/login_hook.