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

Функции интерфейса администратора безопасности

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

Действия с политиками

pm_get_policies()

Функция выводит список политик.

Синтаксис:

pm_get_policies(OUT policy_name name, OUT is_predef boolean)
RETURNS SETOF record

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Название поляТип значенияОписание
policy_namenameИмя политики
is_predefbooleanПризнак предустановленности защиты объекта

Пример использования:

SELECT * FROM pm_get_policies();

policy_name | is_predef
------------------------+-----------
securityFunctionsAdmin | t
securityCatalogAdmin | t
featureStatusFunctions | t
secAdminUser | t
test_policy | f
tuz_policy_test | f
(6 rows)

Заметки об использовании:

Поле is_predef предназначено для обозначения предустановленных объектов под защитой, не подлежащих ручной модификации, то есть в примере выше политики с признаком is_predef=t помещены под защиту и не подлежат ручной модификации.

pm_get_policy_grants()

Функция осуществляет вывод списка разрешений в составе политики.

Синтаксис:

pm_get_policy_grants(policy_name name, OUT db_oid oid, OUT db_name name, OUT namespace_oid oid, OUT object_oid oid, OUT object_name name, OUT object_kind name, OUT action name)
RETURNS SETOF record

Входные параметры:

Название параметраТип значенияОписание
policy_namenameИмя политики.

Возвращаемые значения:

Название поляТип значенияОписание
db_oidoidOID БД
db_namenameНаименование БД
namespace_oidoidOID схемы
object_oidoidOID объекта БД
object_namenameНаименование объекта
object_kindnameТип объекта
actionnameНаименование действия

Примеры использования:

  • в составе политики защиты tuz_policy_test разрешены действия ALTER и GRANT TO, которые возможно выполнить над объектом БД role='tuz_test':

    SELECT * FROM pm_get_policy_grants('tuz_policy_test');

    db_oid | db_name | namespace_oid | object_oid | object_name | object_kind | action
    -------+---------+---------------+------------+-------------+-------------+----------
    0 | | 0 | 17939 | tuz_test | role | alter
    0 | | 0 | 17939 | tuz_test | role | grant_to
    (2 rows)
  • в составе политики защиты test_policy разрешены действия SELECT и INSERT, которые возможно выполнить над объектом БД table='ext.test_table' в БД First_db:

    SELECT * FROM pm_get_policy_grants('test_policy');

    db_oid | db_name | namespace_oid | object_oid | object_name | object_kind | action
    --------+----------+---------------+------------+-----------------+-------------+--------
    16401 | First_db | 16404 | 17928 | ext.test_table | table | select
    16401 | First_db | 16404 | 17928 | ext.test_table | table | insert
    (2 rows)

pm_make_policy()

Функция реализует создание политики.

Синтаксис:

pm_make_policy(policy_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
policy_namenameИмя политики.

Возвращаемое значение:

Возвращает флаг true или false.

Пример использования:

SELECT pm_make_policy('tuz_policy_test');

pm_make_policy
----------------
t
(1 row)

pm_grant_to_policy()

Функция вносит в политику разрешение на действия над объектом.

Синтаксис:

grant_to_policy(policy_name name, object_kind name, object_name text, actions anyarray)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
policy_namenameИмя политики
object_kindnameТип объекта
object_nametextНаименование объекта.

Позволяет выдать разрешения на операции над объектами типа роль, указав специальное имя роли. Является самостоятельным правилом:
- разрешения на операции над ролью выдаются и отзываются как самостоятельные разрешения;
- разрешения на операции над ролью можно выдавать и отзывать независимо от выданных разрешений на конкретные роли;
- фактические разрешения на выполнение операций над объектами типа «роль» имеются либо когда выданы разрешения над конкретным объектом, либо над объектами с наименованием;
- отзыв разрешений на операции над ролью не отзывает явно выданные разрешения на операции над указанными ролями;
- отзыв разрешений на операции над ролью не приведет к фактическому запрету операций над ролью, если выдано разрешение на операции над этой ролью;
- после постановки под защиту новых ролей разрешения, выданные на операции над ролью, будут распространяться и на новые роли
actionsanyarrayМассив действий над объектом.

- alter_login – разрешает изменение атрибута LOGIN (команды ALTER ROLE ... WITH LOGIN и ALTER ROLE ... WITH NOLOGIN);
- alter_rename – разрешает переименование роли (команды ALTER ROLE ... RENAME ...);
- alter_password – разрешает смену пароля (команды ALTER ROLE ... WITH ... PASSWORD);
- alter_safe – разрешает другие команды ALTER ROLE;
- all – разрешает выполнение всех известных операций. Операция является самостоятельной и не состоящей из других операций:

- операция all выдается и отзывается как самостоятельная операция;
- разрешения на конкретные операции можно выдавать и отзывать независимо от выданных разрешений на операцию all;
- фактические разрешения на выполнение конкретной операции имеются когда: либо выданы разрешения на конкретную операцию, либо на новую операцию all;
- отзыв операции all не отзывает явно выданные разрешения на конкретные права;
- отзыв разрешения на конкретную операцию не приведет к фактическому запрету операции, если выдано разрешение на операцию all;
- после появления новых операций в новых версиях продукта выданные разрешения на операцию all будут распространяться и на новые виды операций

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

В политику защиты с именем test_policy добавлено разрешение на действия SELECT и INSERT в таблице ext.test_table:

SELECT pm_grant_to_policy('test_policy', 'table', 'ext.test_table', array['select','insert']::name[]);

pm_grant_to_policy
--------------------
t
(1 row)

pm_revoke_from_policy()

Функция исключает из политики разрешения на действия над объектом.

Синтаксис:

m_revoke_from_policy(policy_name name, object_kind name, object_name text, actions anyarray)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
policy_namenameИмя политики
object_kindnameТип объекта
object_nametextНаименование объекта
actionsanyarrayМассив действий над объектом

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

Из политики защиты с именем test_policy исключается разрешение на действие INSERT в таблице ext.test_table:

SELECT * FROM pm_revoke_from_policy('test_policy', 'table', 'ext.test_table', array['insert']::name[]);

pm_revoke_from_policy
-----------------------
t
(1 row)

pm_revoke_all_actions_from_policy()

Функция исключает из политики все ранее выданные разрешений для указанного объекта.

Синтаксис:

pm_revoke_all_actions_from_policy(policy_name name, object_kind name, object_name text)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
policy_namenameИмя политики
object_kindnameТип объекта
object_nametextНаименование объекта

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

Из политики защиты с именем test_policy исключаются все разрешения над таблицей ext.test_table:

SELECT * FROM pm_revoke_all_actions_from_policy('test_policy', 'table', 'ext.test_table');

pm_revoke_all_actions_from_policy
-----------------------------------
t
(1 row)

pm_suspend_object()

Функция приостанавливает действия политики защиты объектов БД.

Синтаксис:

pm_suspend_object(object_kind name, object_name text, role_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
object_kindnameТип объекта
object_nametextНаименование объекта, находящегося под защитой (для объектов схем - с указанием имени схемы)
role_namenameИмя роли, для которой приостанавливается защита объекта (значение * - для всех ролей)

Возвращаемые значения:

Возвращает флаг true или false.

Примеры использования:

  • Приостановка защиты пользователя tuz_test для администратора БД admin_test:

    SELECT pm_suspend_object('role', 'tuz_test', 'admin_test');

    pm_suspend_object
    -------------------
    t
    (1 row)
  • В случае приостановки защиты для объекта устанавливаются соответствующий флаг и роль, для которой изменено состояние защиты объекта (ниже в примере поля: state=1 и staterole (oid)=17960):

    SELECT * FROM pm_get_protected_objects() WHERE object_name='tuz_test';

    db_oid | db_name | object_oid | object_name | object_kind | is_protected | ispredef | state | staterole
    -------+-----------+------------+-------------+-------------+--------------+----------+-------+-----------
    0 | (unknown) | 17939 | tuz_test | role | t | f | 1 | 17960
    (1 row)

pm_resume_object()

Функция возобновляет действия политики защиты объектов БД.

Синтаксис:

pm_resume_object(object_kind name, object_name text)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
object_kindnameТип объекта
object_nametextНаименование объекта, находящегося под защитой (для объектов схем - с указанием имени схемы)

Возвращаемые значения:

Возвращает флаг true или false.

Примеры использования:

  • Возобновление защиты пользователя tuz_test:

    SELECT pm_resume_object('role', 'tuz_test');

    pm_resume_object
    ------------------
    t
    (1 row)
  • В случае возобновления защиты для объекта после приостановки признак обнуляется (state=0 и staterole=0: защита действует, не приостановлена):

    SELECT * FROM pm_get_protected_objects() WHERE object_name='tuz_test';

    db_oid | db_name | object_oid | object_name | object_kind | is_protected | ispredef | state | staterole
    -------+-----------+------------+-------------+-------------+--------------+----------+-------+-----------
    0 | (unknown) | 17939 | tuz_test | role | t | f | 0 | 0
    (1 row)

pm_remove_policy()

Функция производит удаление политику защиты.

Синтаксис:

pm_remove_policy(policy_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
policy_namenameИмя политики

Возвращаемые значения:

Возвращает флаг true или false.

Примеры использования:

При удалении политики защиты предварительно выполняется проверка, связана ли данная политика хотя бы с одной учетной записью:

  • в случае, если политика не связана ни с одной учетной записью, удаление политики защиты выполняется без ошибок:

    SELECT pm_remove_policy('test_policy');

    pm_remove_policy
    ------------------
    t
    (1 row)
  • в случае, если политика защиты связана хотя бы с одной учетной записью, удаление политики защиты завершится ошибкой о том, что политика назначена:

    SELECT pm_remove_policy('test_policy');

    ERROR: policy is assigned

Действия с пользователями

pm_get_assigned_policies()

Функция выводит список политик, назначенных пользователю.

Синтаксис:

pm_get_assigned_policies(user_name name, OUT policy_oid oid, OUT policy_name name)
RETURNS SETOF record

Входные параметры:

Название параметраТип значенияОписание
user_namenameИмя пользователя

Возвращаемые значения:

Название поляТип значенияОписание
policy_oidoidOID политики
policy_namenameИмя политики

Пример использования:

SELECT * FROM pm_get_assigned_policies('db_admin');

policy_oid | policy_name
------------+-----------------
17944 | tuz_policy_test
(1 row)

pm_assign_policy_to_user()

С помощью этой функции происходит назначение политики пользователю.

Синтаксис:

pm_assign_policy_to_user(user_name name, policy_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
user_namenameИмя пользователя
policy_namenameИмя политики

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_assign_policy_to_user('db_admin', 'tuz_policy_test');
pm_assign_policy_to_user
--------------------------
t
(1 row)

pm_unassign_policy_from_user()

С помощью этой функции происходит изъятие политики у пользователя.

Синтаксис:

pm_unassign_policy_from_user(user_name name, policy_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
user_namenameИмя пользователя
policy_namenameИмя политики

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_unassign_policy_from_user('db_admin','tuz_policy_test');

pm_unassign_policy_from_user
------------------------------
t
(1 row)

Действия над объектами

pm_get_protected_objects()

Функция выводит список объектов, находящихся под защитой.

Синтаксис:

pm_get_protected_objects(OUT db_oid oid, OUT db_name name, OUT object_oid oid, OUT object_name name, OUT object_kind name, OUT is_protected boolean, OUT ispredef boolean, OUT state oid, OUT staterole oid)
RETURNS SETOF record

Входные параметры:

Отсутствуют.

Возвращаемые значения:

Название поляТип значенияОписание
db_oidoidOID БД
db_namenameНаименование БД
object_oidoidOID объекта БД
object_namenameНаименование объекта
object_kindnameТип объекта
is_protectedbooleanпризнак нахождения объекта под защитой
ispredefbooleanпризнак предустановленности защиты объекта
stateoidСостояние защиты объекта (не NULL означает приостановленную защиту объекта)
stateroleoidOID роли, для которой изменено состояние защиты объекта

Примеры использования:

SELECT * FROM pm_get_protected_objects();

db_oid | db_name | object_oid | object_name | object_kind | is_protected | ispredef | state | staterole
--------+-----------+------------+--------------------------------+-------------+--------------+----------+-------+-----------
0 | (unknown) | 17906 | sec_admin | role | t | t | 0 | 0
...
0 | (unknown) | 9991 | pr_object | table | t | t | 0 | 0
0 | (unknown) | 17921 | sec_test | role | t | f | 0 | 0
0 | (unknown) | 17939 | tuz_test | role | t | f | 0 | 0
16401 | First_db | 17928 | test_table | table | t | f | 0 | 0
(46 rows)

Вывод списка всех объектов БД, находящихся под защитой, кроме предустановленных объектов под защитой:

SELECT * FROM pm_get_protected_objects() WHERE ispredef=false;

db_oid | db_name | object_oid | object_name | object_kind | is_protected | ispredef | state | staterole
--------+-----------+------------+-------------+-------------+--------------+----------+-------+-----------
0 | (unknown) | 17921 | sec_test | role | t | f | 0 | 0
0 | (unknown) | 17939 | tuz_test | role | t | f | 0 | 0
16401 | First_db | 17928 | test_table | table | t | f | 0 | 0
(3 rows)

pm_protect_object()

Функция помещает объекты БД под защиту.

Синтаксис:

pm_protect_object(object_kind name, object_name text)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
object_kindnameТип объекта
object_nametextНаименование объекта

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_protect_object('table','ext.test_table');

pm_protect_object
-------------------
t
(1 row)

pm_unprotect_object()

Функция производит снятие защиты с объекта БД.

Синтаксис:

pm_unprotect_object(object_kind name, object_name text)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
object_kindnameТип объекта
object_nametextНаименование объекта

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_unprotect_object('table', 'ext.test_table');

pm_unprotect_object
---------------------
t
(1 row)

При исключении объекта из-под защиты все связанные с ним разрешения в составе политики удаляются.

pm_get_object_access_path (анализ эффективных привилегий указанного пользователя на указанный объект)

Функция pm_get_object_access_path` используется для анализа и отображения путей доступа пользователя к определенному объекту в СУБД Pangolin, который защищен средствами политики безопасности.

Основные действия функции:

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

Синтаксис:

pm_get_object_access_path(object_kind name, object_name text, role_name name, OUT object_kind name, OUT object_name text, OUT role_name name, OUT action_name name, OUT level integer, OUT action_status text, OUT policy_name name, OUT protected_object_kind name, OUT protected_object_name text, OUT activity_state text)
RETURNS SETOF record

Входные параметры:

Название параметраТип значенияОписание
object_kindnameТип объекта, для которого вычисляется путь доступа защиты
object_nametextПолное имя объекта
role_namenameИмя пользователя, для которого проверяется доступ

Процедура возвращает строки, каждая из которых описывает отдельную операцию над объектом:

Название поляТип значенияОписание
object_kindnameТип объекта, для которого вычисляется путь доступа защиты
object_nametextПолное имя объекта
role_namenameИмя пользователя, для которого проверяется доступ
levelintegerНомер уровня (иерархия прав — напрямую или через роль/политику):

- 0 — прямое назначение;
- 1 — через роль;
-2 — через политику;
-3 — через групповую роль
action_statustextСтатус доступности действия: granted — доступ предоставлен, revoked — доступ отозван
policy_namenameИмя политики, дающей разрешение на действие на этом уровне доступа
protected_object_kindnameТип защищаемого объекта на этом уровне доступа (таблица, схема)
protected_object_nametextИмя защищаемого объекта на этом уровне доступа
activity_statetextСтатус активности защиты или политики, указанного на данном узле объекта или политики

Пример использования:

Проверка доступа пользователя user1 к таблице table1:

SELECT * FROM pm_get_object_access_path('table', 'krasnay.table1', 'user1') WHERE action_name IN ('select', 'insert');

| object_kind | object_name | role_name | action_name | level | action_status | policy_name | protected_object_kind | protected_object_name | activity_state |
|-------------|----------------|-----------|-------------|-------|---------------|-------------|-----------------------|-----------------------|----------------|
| table | krasnay.table1 | user1 | select | 0 | revoked | | | | active |
| table | krasnay.table1 | user1 | select | 1 | revoked | | table | krasnay.table1 | active |
| table | krasnay.table1 | user1 | select | 2 | granted | policy1 | | | active |
| table | krasnay.table1 | user1 | select | 3 | revoked | | schema | krasnay | active |
| table | krasnay.table1 | user1 | insert | 0 | granted | | | | active |
| table | krasnay.table1 | user1 | insert | 1 | granted | policy2 | | | active |
| table | krasnay.table1 | user1 | insert | 2 | revoked | | table | krasnay.table1 | active |
| table | krasnay.table1 | user1 | insert | 3 | revoked | | schema | krasnay | active |

Пояснение результатов:

  • Чтение (SELECT):

    • на уровне 0: Чтение не разрешено (явно отозвано);
    • на уровне 1: Таблица krasnay.table1 защищена индивидуально, доступ на чтение запрещен (revoked);
    • на уровне 2: Политика policy1 разрешает чтение объектов в схеме krasnay;
    • на уровне 3: Схема krasnay защищена, доступ запрещен (revoked).

    Итог: Доступ на чтение для таблицы krasnay.table1 запрещен. Политика на уровне схемы (level 2) не действует, так как уровень индивидуальной защиты таблицы (level 1) имеет более высокий приоритет.

  • Вставка (INSERT):

    • на уровне 0: Вставка разрешена (прямо предоставлено);
    • на уровне 1: Политика policy2 разрешает добавление в таблицу krasnay.table1;
    • на уровне 2: Таблица krasnay.table1 защищена, доступ на добавление запрещен (revoked);
    • на уровне 3: Схема krasnay защищена, доступ на добавление запрещен (revoked).

    Итог: Доступ на добавление разрешен. Политика на уровне таблицы (level 1) и прямое предоставление прав (level 0) имеют более высокий приоритет, чем запреты на уровнях защиты.

Заметки об использовании:

Функция удобна для администраторов безопасности при проверке прав доступа пользователей. Если пользователь сообщает о невозможности выполнения операции, она помогает выявить причину проблемы. Позволяет понять влияние различных политик и ролей на доступ к объектам.

Функция может использоваться для аудита текущих прав пользователей перед внесением изменений в политику безопасности.

Действия над УЗ администраторов безопасности

pm_create_security_admin()

Осуществляет создание учетной записи администратора безопасности.

Синтаксис:

pm_create_security_admin(role_name name, password text, OUT shadow_password cstring)
RETURNS cstring

Входные параметры:

Название параметраТип значенияОписание
role_namenameИмя создаваемого пользователя
passwordtextПароль длиной не менее 25 символов (удовлетворяющим парольной политике для администраторов безопасности)

Возвращаемые значения:

Название поляТип значенияОписание
shadow_passwordcstringХеш пароля

Пример использования:

SELECT pm_create_security_admin('sec_test','<password>');
             pm_create_security_admin
-------------------------------------------------------
SCRAM-SHA-256-4096:{hash}
(1 row)

Заметки об использовании:

В случае установки пароля, не удовлетворяющего критериям парольной политики для администраторов безопасности, будет получено сообщение: Syntax check fail: minimum length for password is 25 Syntax check fail: minimum number of digits for password is 1.

pm_set_security_admin_password()

Функция производит изменение пароля учетной записи администратора безопасности.

Синтаксис:

pm_set_security_admin_password(role_name name, password text)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
role_namenameИмя пользователя
passwordtextПароль длиной не менее 25 символов (удовлетворяющий парольной политике для администраторов безопасности)

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_set_security_admin_password('sec_test','<password>');

pm_set_security_admin_password
--------------------------------
t
(1 row)

В случае установки пароля, не удовлетворяющего критериям парольной политики для администраторов безопасности, будет получено сообщение: Syntax check fail: minimum length for password is 25 Syntax check fail: minimum number of digits for password is 1.

pm_grant_security_admin()

Назначает пользователя администратором безопасности.

Синтаксис:

pm_grant_security_admin(role_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
role_namenameИмя пользователя

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_grant_security_admin('sec_test');

pm_grant_security_admin
-------------------------
t
(1 row)

pm_revoke_security_admin()

Снимает с пользователя привилегий администратора безопасности.

Синтаксис:

pm_revoke_security_admin(role_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
role_namenameИмя пользователя

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_revoke_security_admin('sec_test');

pm_revoke_security_admin
--------------------------
t
(1 row)

pm_unblock_security_admin()

Функция осуществляет разблокировку заблокированной учетной записи администратора безопасности.

Синтаксис:

pm_unblock_security_admin(role_name name)
RETURNS boolean

Входные параметры:

Название параметраТип значенияОписание
role_namenameИмя пользователя

Возвращаемые значения:

Возвращает флаг true или false.

Пример использования:

SELECT pm_unblock_security_admin('sec_test');

pm_unblock_security_admin
---------------------------
t
(1 row)