Функции интерфейса администратора безопасности
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_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>
);
Входные параметры:
<object_kind>
— тип объекта, для которого вычисляется путь доступа защиты;<object_name>
— полное имя объекта;<role_name>
— имя пользователя, для которого проверяется доступ.
Процедура возвращает строки, каждая из которых описывает отдельную операцию над объектом:
-
object_kind
(как в запросе); -
object_name
(как в запросе);; -
role_name
— имя пользователя, чьи права проверяются (как в запросе); -
action_name
— тип действия, на которое проверяется доступ; -
level
— номер уровня (иерархия прав — напрямую или через роль/политику):0
— прямое назначение;1
— через роль;2
— через политику;3
— через групповую роль.
-
action_status
- статус доступности действия:granted
— доступ предоставлен;revoked
— доступ отозван.
-
policy_name
— имя политики, дающей разрешение на действие на этом уровне доступа; -
protected_object_kind
— тип защищаемого объекта на этом уровне доступа (таблица, схема); -
protected_object_name
— имя защищаемого объекта на этом уровне доступа; -
activity_state
— статус активности защиты или политики, указанного на данном узле объекта или политики.
Пример использования
Проверка доступа пользователя sasha
к таблице table1
:
-
Объект — таблица
krasnay.table1
:- таблица находится под индивидуальной защитой;
- схема
krasnay
, к которой относится таблица, также защищена.
-
Пользователь —
sasha
. -
Политики:
- Политика
policy1
разрешает чтение объектов в схемеkrasnay
(уровень 2,granted
). - Политика
policy2
разрешает добавление в таблицуkrasnay.table1
(уровень 1,granted
).
- Политика
-
Запрос: Проверяются действия
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)