Функции интерфейса администратора безопасности
Интерфейс администратора безопасности включает в себя следующие функции, представленные в данном разделе, для настройки механизма защиты от привилегированных пользователей.
Действия с политиками
pm_get_policies()
Функция выводит список политик.
Синтаксис:
pm_get_policies(OUT policy_name name, OUT is_predef boolean)
RETURNS SETOF record
Входные параметры:
Отсутствуют.
Возвращаемые значения:
| Название поля | Тип значения | Описание |
|---|---|---|
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()
Функция осуществляет вывод списка разрешений в составе политики.
Синтаксис:
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_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()
Функция реализует создание политики.
Синтаксис:
pm_make_policy(policy_name name)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
policy_name | name | Имя политики. |
Возвращаемое значение:
Возвращает флаг 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_name | name | Имя политики |
object_kind | name | Тип объекта |
object_name | text | Наименование объекта. Позволяет выдать разрешения на операции над объектами типа роль, указав специальное имя роли. Является самостоятельным правилом: - разрешения на операции над ролью выдаются и отзываются как самостоятельные разрешения; - разрешения на операции над ролью можно выдавать и отзывать независимо от выданных разрешений на конкретные роли; - фактические разрешения на выполнение операций над объектами типа «роль» имеются либо когда выданы разрешения над конкретным объектом, либо над объектами с наименованием; - отзыв разрешений на операции над ролью не отзывает явно выданные разрешения на операции над указанными ролями; - отзыв разрешений на операции над ролью не приведет к фактическому запрету операций над ролью, если выдано разрешение на операции над этой ролью; - после постановки под защиту новых ролей разрешения, выданные на операции над ролью, будут распространяться и на новые роли |
actions | anyarray | Массив действий над объектом. - 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_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()
Функция исключает из политики все ранее выданные разрешений для указанного объекта.
Синтаксис:
pm_revoke_all_actions_from_policy(policy_name name, object_kind name, object_name text)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
Функция приостанавливает действия политики защиты объектов БД.
Синтаксис:
pm_suspend_object(object_kind name, object_name text, role_name name)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
Функция возобновляет действия политики защиты объектов БД.
Синтаксис:
pm_resume_object(object_kind name, object_name text)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
Функция производит удаление политику защиты.
Синтаксис:
pm_remove_policy(policy_name name)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
Функция выводит список политик, назначенных пользователю.
Синтаксис:
pm_get_assigned_policies(user_name name, OUT policy_oid oid, OUT policy_name name)
RETURNS SETOF record
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
С помощью этой функции происходит назначение политики пользователю.
Синтаксис:
pm_assign_policy_to_user(user_name name, policy_name name)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
С помощью этой функции происходит изъятие политики у пользователя.
Синтаксис:
pm_unassign_policy_from_user(user_name name, policy_name name)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
Функция выводит список объектов, находящихся под защитой.
Синтаксис:
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_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()
Функция помещает объекты БД под защиту.
Синтаксис:
pm_protect_object(object_kind name, object_name text)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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()
Функция производит снятие защиты с объекта БД.
Синтаксис:
pm_unprotect_object(object_kind name, object_name text)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
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, который защищен средствами политики безопасности.
Основные действия функции:
- определение прав конкретного пользователя на указанные объекты (таблицы, схемы);
- выявление источника этих прав (политика, роль или групповая роль);
- диагностика состояния прав – предоставлены они, отозваны или находятся в ожидании.
Синтаксис:
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_kind | name | Тип объекта, для которого вычисляется путь доступа защиты |
object_name | text | Полное имя объекта |
role_name | name | Имя пользователя, для которого проверяется доступ |
Процедура возвращает строки, каждая из которых описывает отдельную операцию над объектом:
| Название поля | Тип значения | Описание |
|---|---|---|
object_kind | name | Тип объекта, для которого вычисляется путь доступа защиты |
object_name | text | Полное имя объекта |
role_name | name | Имя пользователя, для которого проверяется доступ |
level | integer | Номер уровня (иерархия прав — напрямую или через роль/политику): - 0 — прямое назначение; - 1 — через роль; - 2 — через политику; - 3 — через групповую роль |
action_status | text | Статус доступности действия: granted — доступ предоставлен, revoked — доступ отозван |
policy_name | name | Имя политики, дающей разрешение на действие на этом уровне доступа |
protected_object_kind | name | Тип защищаемого объекта на этом уровне доступа (таблица, схема) |
protected_object_name | text | Имя защищаемого объекта на этом уровне доступа |
activity_state | text | Статус активности защиты или политики, указанного на данном узле объекта или политики |
Пример использования:
Проверка доступа пользователя 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_name | name | Имя создаваемого пользователя |
password | text | Пароль длиной не менее 25 символов (удовлетворяющим парольной политике для администраторов безопасности) |
Возвращаемые значения:
| Название поля | Тип значения | Описание |
|---|---|---|
shadow_password | cstring | Хеш пароля |
Пример использования:
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_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()
Назначает пользователя администратором безопасности.
Синтаксис:
pm_grant_security_admin(role_name name)
RETURNS boolean
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
role_name | name | Имя пользователя |
Возвращаемые значения:
Возвращает флаг 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_name | name | Имя пользователя |
Возвращаемые значения:
Возвращает флаг 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_name | name | Имя пользователя |
Возвращаемые значения:
Возвращает флаг true или false.
Пример использования:
SELECT pm_unblock_security_admin('sec_test');
pm_unblock_security_admin
---------------------------
t
(1 row)