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

Настройка
-
Установите rpm\deb-пакет расширения
login_hook:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-login-hook-{version_component}-{OS}.x86_64.rpmsudo apt install pangolin-login-hook-{version_component}_amd64.debsudo apt-get 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.6.x86_64.rpm -
Добавьте расширение в параметр
session_preload_libraries:session_preload_libraries = 'login_hook' -
Перечитайте конфигурацию:
SELECT pg_reload_conf(); -
Подключитесь к базе данных и создайте расширение:
CREATE EXTENSION login_hook; -
Создайте функцию
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;