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

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

pm_get_policies (вывод списка политик)

Входные параметры: отсутствуют.

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

  • policy_name (name) - имя политики;
  • is_predef (boolean) - признак предустановленности защиты объекта.

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

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 (вывод списка разрешений в составе политики)

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

  • policy_name (name) - имя политики.

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

  • db_oid (oid) - OID БД;
  • db_name (name) - наименование БД;
  • namespace_oid (oid) - OID схемы;
  • object_oid (oid) - OID объекта БД;
  • object_name (name) - наименование объекта;
  • object_kind (name) - тип объекта;
  • action (name) - наименование действия.

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

  • в составе политики защиты 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 (создание политики)

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

  • policy_name (name) - имя политики.

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

  • флаг true или false.

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

SELECT pm_make_policy('tuz_policy_test');
pm_make_policy
----------------
t
(1 row)

pm_grant_to_policy (внесение в политику разрешений на действия над объектом)

Входные параметры: отсутствуют.

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

  • policy_name (name) - имя политики;
  • is_predef (boolean) - признак предустановленности защиты объекта.

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

В политику защиты с именем 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_get_policy_grants (вывод списка разрешений в составе политики)

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

  • policy_name (name) - имя политики.

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

  • db_oid (oid) - OID БД;
  • db_name (name) - наименование БД;
  • namespace_oid (oid) - OID схемы;
  • object_oid (oid) - OID объекта БД;
  • object_name (name) - наименование объекта;
  • object_kind (name) - тип объекта;
  • action (name) - наименование действия.

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

  • В составе политики защиты 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 (создание политики)

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

  • policy_name (name) - имя политики.

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

  • Флаг true или false.

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

SELECT pm_make_policy('tuz_policy_test');
pm_make_policy
----------------
t
(1 row)

pm_grant_to_policy (внесение в политику разрешений на действия над объектом)

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

  • policy_name (name) - имя политики;
  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта;
  • actions anyarray - массив действий над объектом.

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

  • Флаг 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 (исключение из политики разрешения на действия над объектом)

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

  • policy_name (name) - имя политики;
  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта;
  • actions anyarray - массив действий над объектом.

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

  • Флаг 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 (исключение из политики всех ранее выданных разрешений для указанного объекта)

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

  • policy_name (name) - имя политики;
  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта.

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

  • Флаг 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 (приостановка действия политики защиты объектов БД)

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

  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта, находящегося под защитой (для объектов схем - с указанием имени схемы);
  • role_name (name) - имя роли, для которой приостанавливается защита объекта ('*' - для всех ролей).

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

  • Флаг 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 (возобновление действия политики защиты)

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

  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта, находящегося под защитой (для объектов схем - с указанием имени схемы).

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

  • Флаг 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 (удаление политики защиты)

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

  • policy_name (name) - имя политики.

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

  • Флаг 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 (вывод списка политик, назначенных пользователю)

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

  • user_name (name) - имя пользователя.

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

  • policy_oid (oid) - OID политики;
  • policy_name (name) - имя политики.

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

SELECT * FROM pm_get_assigned_policies('db_admin');
policy_oid | policy_name
------------+-----------------
17944 | tuz_policy_test
(1 row)

pm_assign_policy_to_user (назначение политики пользователю)

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

  • user_name (name) - имя пользователя;
  • policy_name (name) - имя политики.

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

  • Флаг 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 (изъятие политики у пользователя)

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

  • user_name (name) - имя пользователя;
  • policy_name (name) - имя политики.

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

  • Флаг 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 (вывод списка объектов, находящихся под защитой)

Входные параметры: отсутствуют.

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

  • db_oid (oid) - OID БД;
  • db_name (name) - наименование БД;
  • object_oid (oid) - OID объекта БД;
  • object_name (name) - наименование объекта;
  • object_kind (name) - тип объекта;
  • is_protected (boolean) - признак нахождения объекта под защитой;
  • ispredef (boolean) - признак предустановленности защиты объекта;
  • state (oid) - состояние защиты объекта (не NULL означает приостановленную защиту объекта);
  • staterole (oid) - OID роли, для которой изменено состояние защиты объекта.

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

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 (помещение объектов БД под защиту)

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

  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта.

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

  • Флаг true или false.

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

SELECT pm_protect_object('table','ext.test_table');
pm_protect_object
-------------------
t
(1 row)

pm_unprotect_object (снятие защиты с объекта БД)

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

  • object_kind (name) - тип объекта;
  • object_name (text) - наименование объекта.

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

  • Флаг 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, который защищен средствами политики безопасности. Это инструмент для детального просмотра уровня и состояния доступных операций над объектом, а также для понимания источников предоставленных или отозванных прав.

Основные функции процедуры:

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

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

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

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

Синтаксис:

SELECT pm_get_object_access_path(<object_kind>, <object_name>, <role_name>);

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

  1. <object_kind> — тип объекта, для которого вычисляется путь доступа защиты;
  2. <object_name> — полное имя объекта;
  3. <role_name> — имя пользователя, для которого проверяется доступ.

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

  1. object_kind (как в запросе);

  2. object_name (как в запросе);;

  3. role_name — имя пользователя, чьи права проверяются (как в запросе);

  4. action_name — тип действия, на которое проверяется доступ;

  5. level — номер уровня (иерархия прав — напрямую или через роль/политику):

    • 0 — прямое назначение;
    • 1 — через роль;
    • 2 — через политику;
    • 3 — через групповую роль.
  6. action_status:

    • granted — доступ предоставлен;
    • revoked — доступ отозван.
  7. policy_name — имя политики, дающей разрешение на действие на этом уровне доступа;

  8. protected_object_kind — тип защищаемого объекта на этом уровне доступа (таблица, схема);

  9. protected_object_name — имя защищаемого объекта на этом уровне доступа;

  10. activity_state — статус активности защиты или политики, указанного на данном узле объекта или политики.

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

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

  1. Объект — таблица krasnay.table1:

    • таблица находится под индивидуальной защитой;
    • схема krasnay, к которой относится таблица, также защищена.
  2. Пользователь — sasha.

  3. Политики:

    • Политика policy1 разрешает чтение объектов в схеме krasnay (уровень 2, granted).
    • Политика policy2 разрешает добавление в таблицу krasnay.table1 (уровень 1, granted).
  4. Запрос: Проверяются действия SELECT (чтение) и INSERT (вставка) для пользователя sasha.

Запрос:

SELECT * FROM pm_get_object_access_path('table', 'krasnay.table1', 'sasha')
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 | sasha | select | 0 | revoked | | | | active |
| table | krasnay.table1 | sasha | select | 1 | revoked | | table | krasnay.table1 | active |
| table | krasnay.table1 | sasha | select | 2 | granted | policy1 | | | active |
| table | krasnay.table1 | sasha | select | 3 | revoked | | schema | krasnay | active |
| table | krasnay.table1 | sasha | insert | 0 | granted | | | | active |
| table | krasnay.table1 | sasha | insert | 1 | granted | policy2 | | | active |
| table | krasnay.table1 | sasha | insert | 2 | revoked | | table | krasnay.table1 | active |
| table | krasnay.table1 | sasha | 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 (создание учетной записи администратора безопасности)

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

  • role_name (name) - имя создаваемого пользователя;
  • password (text) - пароль длиной не менее 25 символов (удовлетворяющим парольной политике для администраторов безопасности).

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

  • shadow_password (cstring) - хеш пароля.

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

SELECT pm_create_security_admin('sec_test','<password>');
pm_create_security_admin
---------------------------------------------------------------------------------------------------------------------------------------
SCRAM-SHA-256-4096:{хеш}
(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 (изменение пароля учетной записи администратора безопасности)

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

  • role_name (name) - имя создаваемого пользователя;
  • password (text) - пароль длиной не менее 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 (назначение пользователя администратором безопасности)

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

  • role_name (name) - имя создаваемого пользователя.

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

  • Флаг true или false.

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

SELECT pm_grant_security_admin('sec_test');
pm_grant_security_admin
-------------------------
t
(1 row)

pm_revoke_security_admin (снятие с пользователя привилегий администратора безопасности)

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

  • role_name (name) - имя создаваемого пользователя.

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

  • Флаг true или false.

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

SELECT pm_revoke_security_admin('sec_test');
pm_revoke_security_admin
--------------------------
t
(1 row)

pm_unblock_security_admin (разблокировка заблокированной учетной записи администратора безопасности)

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

  • role_name (name) - имя создаваемого пользователя.

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

  • Флаг true или false.

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

SELECT pm_unblock_security_admin('sec_test');
pm_unblock_security_admin
---------------------------
t
(1 row)