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

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_revoke_security_admin (снятие с пользователя привилегий администратора безопасности)#

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

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

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

  • Флаг true или false.

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

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