Ролевая модель и права доступа#

Для обеспечения контроля доступа к защищаемым элементам системы применяется система разграничения доступа, основанная на ролях. Здесь и ниже под ролевой моделью понимается стандартная ролевая модель Pangolin, устанавливаемая инсталлятором до версии 5.4.0.

Начиная с версии Pangolin 5.4.0 конфигурирование ролевой модели вынесено из инсталлятора. Ее конфигурирование опционально и может быть выполнено с помощью инсталляционных скриптов конфигурирования ролевой модели, включенных в состав дистрибутива. При необходимости данные скрипты могут быть модифицированы (например, в случае, если в какой-либо функциональности нет необходимости), либо заменены альтернативной ролевой моделью.

Права доступа пользователей устанавливаются парольными политиками в соответствии с ролевой моделью. Управление парольными политиками описано в документе «Руководство администратора», раздел «Сценарии администрирования», подраздел «Интерфейс управления парольными политиками: PL/pgSQL API».

Структура скриптов конфигурирования ролевой модели#

Скрипты конфигурирования ролевой модели делятся на:

  • запускаемые пользователем bash-скрипты;

  • SQL-скрипты, вызываемые bash-скриптами с помощью psql;

  • ansible-скрипты.

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

Примеры запуска скриптов настройки ролевой модели приведены в документе «Руководство по установке», раздел «Установка».

Запускаемые скрипты#

Запускаемые скрипты конфигурирования ролевой модели находятся в директории дистрибутива: installer/scripts_external/configure_roles/configure_roles/templates/role_BASIC/.

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

Комментарии в теле скриптов содержат:

  • инструкции по выбору значений параметров;

  • рекомендуемый перечень подготовительных действий, которые следует выполнить до запуска скрипта;

  • перечень заключительных действий, которые следует выполнить после запуска скрипта.

В дистрибутив включены следующие запускаемые bash-скрипты:

Имя скрипта

Назначение

run_configure.sh

Основной скрипт, выполняющий конфигурирование ролевой модели

password_space_settings.sh

Скрипт, выполняющий конфигурирование хранилища паролей для пользователей profile_tuz и backup_user

Параметры скрипта run_configure.sh:

Имя параметра

Назначение

database_name

Имя пользовательской базы данных

tablespace_name

Имя пользовательского табличного пространства

tablespace_location

Имя директории, содержащей табличное пространство

schema_name

Имя пользовательской схемы

pg_port

Порт в настройках pg_profile

fqdn_master

Имя хоста мастера в настройках pg_profile

fqdn_replica

Имя хоста реплики в настройках pg_profile

stats_periods

Период запуска задания cron в настройках pg_profile

expire_date

Срок действия пароля конечных пользователей

user_for_backup

Имя пользователя резервного копирования для использования в manage_backup.sh

as_adms

Список конечных пользователей, создаваемых в группе as_admin

as_tuzs

Список конечных пользователей, создаваемых в группе as_TUZ

temp_pass

Флаг, указывающий на задание временных паролей

tde_admin_protection

Флаг включения TDE

path_to_scripts

Путь, по которому размещается данный скрипт (требуется только при запуске с помощью ansible)

psql_path

Путь, по которому размещается запускаемый модуль psql

password_list

Словарь паролей ТУЗов. В случае задания пароля в виде SCRAM-SHA-256 - хэш должен быть предварительно вычислен

feature_list

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

locale

Значение locale с которой будет создана пользовательская БД

prdbname

Имя пользовательской БД в которой будет установлен pg_profile

Скрипт run_configure.sh, запущенный с опцией -h или --help, выводит сообщение-подсказку о доступных опциях командной строки и после этого останавливается.

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

SQL-скрипты#

SQL-скрипты вызываются bash-скриптами, являющимися в данном ключе оркестраторами. SQL-скрипты находятся в директориях:

  • installer/scripts_external/configure_roles/configure_roles/templates/role_BASIC/sql_scripts;

  • installer/scripts_external/configure_roles/configure_roles/templates/role_BASIC/sql_scripts/extensions;

  • installer/scripts_external/configure_roles/configure_roles/templates/role_BASIC/sql_scripts/pg_profile.

SQL-скрипты предназначены для настройки отдельных функциональных блоков ролевой модели и в качестве параметров принимают значения из bash-скриптов, которыми они были вызваны. Скрипты выполняются целиком, как отдельная транзакция, и откатываются, если какой-либо оператор завершился с ошибкой.

В дистрибутив включены следующие SQL-скрипты:

Имя скрипта

Назначение

create_db_and_ts.sql

Выполняет создание пользовательского табличного пространства и базы данных. В качестве шаблона при создании базы данных берется стандартная системная база template1

create_end_as_admin_user.sql

Выполняет создание конечных пользователей группы as_admin

create_end_as_TUZ_user.sql

Выполняет создание конечных пользователей группы as_TUZ

create_roles.sql

Выполняет создание групповых ролей и служебных пользователей

create_user_schema.sql

Выполняет создание пользовательской схемы

functions.sql

Выполняет настройку прав доступа пользовательским функциям

get_role_passwd.sql

Выполняет настройку функции get_role_passwd

grants_common_db.sql

Выполняет общие для всех баз данных настройки привилегий

grants_only_postgres_db.sql

Выполняет настройки привилегий в базе данных postgres

grants_only_user_db.sql

Выполняет настройки привилегий в пользовательской базе данных

revoke_public_template0.sql

Выполняет настройки привилегий роли public в базе данных template0.sql

setting_pp_for_users.sql

Выполняет настройки парольных политик

create_1c_extentions.sql

Выполняет установку расширений, используемых в 1C

create_common_extensions.sql

Выполняет настройки расширений, общие для всех баз данных

create_ext_only_postgres_db.sql

Выполняет настройки расширений в базе данных postgres

create_pg_hint_plan.sql

Выполняет настройку расширения pg_hint_plan

create_pg_outline.sql

Выполняет настройку расширения pg_outline

create_pg_stat_kcache.sql

Выполняет настройку расширения pg_stat_kcache

create_psql_rotate_password.sql

Выполняет настройку расширения psql_rotate_password

create_schema_for_extensions.sql

Выполняет настройку схемы „ext“

create_pg_profile_ext.sql

Выполняет настройку расширения pg_profile

users_db_grants_profile_tuz.sql

Выполняет настройку прав доступа для расширения pg_profile

change_owner_for_profile_tables.sql

Выполняет настройку владельца функций расширения pg_profile

common_grants_profile_tuz.sql

Выполняет настройку общих прав доступа для расширения pg_profile

pg_audit_settings.sql

Выполняет настройку pgaudit.log для пользователей из ролевой модели

Ansible-скрипты#

Для упрощения развертывания ролевой модели была реализована ansible-роль configure_roles, которая выполняет настройку ролевой модели, пользовательской БД и расширений автоматически. Выполнение данной роли предполагается после выполнения развертывания Pangolin с использованием playbook_configure_roles.yaml. В данном случае будет выполнена настройка ролевой модели, пользовательской БД и расширений после чистой установки Pangolin. Данная роль располагается в дистрибутиве по пути installer/scripts_external/configure_roles.

Роль configure_roles полностью автономна, может быть запущена вне компонента installer и имеет следующую структуру:

Файл/директория

Назначение

playbook_configure_roles.yaml

Основной ansible-скрипт, выполняющий развертывание ролевой модели

filter_plugins

Директория, содержащая фильтры для использования внутри роли configure_roles

templates

Директория, содержащая запускаемые SQL-скрипты (раздел «SQL-скрипты» данного руководства) для развертывания ролевой модели, пользовательской БД и расширений

tasks

Директория, содержащая yml-скрипты для развертывания ролевой модели

group_vars

Директория, содержащая переменные, используемые ролью для развертывания ролевой модели

library

Директория, содержащая бинарный файл генератора паролей password_generator

Структура файлов с переменными имеет следующий вид:

Файл

Назначение

all.yml

Файл с общими параметрами для роли configure_roles

message.yml

Файл с сообщениями, которые используются в процессе выполнения роли configure_roles

variables.yml

Файл с переменными, используемыми для корректировки настраиваемой ролевой модели

Ansible-роль configure_roles используется при инсталляции для настройки ролевой модели.

Структура ролей#

В рамках структуры ролей рассматриваются следующие типы:

  • административные, использующиеся для системного управления кластером и прикладного администрирования данных;

  • прикладные, предназначенные для пользователей, отвечающих за наполнение БД данными;

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

При настройке ролевой модели создаются следующие групповые роли:

Групповая роль

Назначение

db_admin

Административная роль, обладающая привилегией superuser. Владелец TABLESPACE, DATABASE. Выдается администраторам для управления СУБД

as_admin

Административная роль — владелец схемы. Выдается администраторам АС. Используется для создания новых объектов в БД (таблиц, функций, последовательностей и т.п) и их изменения. Является владельцем пользовательской схемы. Также выдается доменным или локальным ТУЗ для инструментов автоматизации

as_TUZ

Прикладная роль для доступа к пользовательским данным. Имеет привилегии для совершения DML-операций с объектами схемы. Работает в пуле соединений с БД, а также подключается через Pangolin Pooler

as_admin_read

Административная роль, отличающаяся от as_admin тем, что предназначена только для просмотра

all-sa-pam-group

Выдается учетным записям, используемым для доступа через PAM (privileged access management). Используется исключительно для организации аутентификации, конфигурирования pg_hba.conf

Дополнительно создаются следующие специальные инфраструктурные ТУЗ:

Инфраструктурная роль

Назначение

backup_user

ТУЗ с локальной аутентификации для интеграции с СРК

zabbix_oasubd

ТУЗ с локальной аутентификацией для интеграции с системой мониторинга

auditor

ТУЗ с локальной аутентификацией для проведения аудита безопасности

pgbouncer

ТУЗ с локальной аутентификацией для подключения локальной службы Pangolin Pooler

patroni

ТУЗ с локальной аутентификацией для подключения локальной службы Patroni

all-sa-pam19002

ТУЗ с внешней аутентификацией для подключения через АС PAM администраторов БД

all-sa-pam19002_ro

ТУЗ с внешней аутентификацией для подключения через АС PAM администраторов систем с привилегиями только на чтение

Рекомендации по работе с УЗ для администраторов:

  • ежедневные задачи администрирования силами администраторов «вручную» должны осуществляться только под персонализированными УЗ;

  • права доступа для каждой УЗ/ТУЗ должны быть минимизированы, исходя из использования;

  • в руководство должно включаться рекомендуемое минимальное типовое конфигурирование ролевой модели (РМ);

  • при развертывании нового экземпляра Pangolin, минимальная рекомендуемая типовая РМ должна конфигурироваться автоматически.

Связь ролей с объектами БД#

При настройке ролевой модели создаются стандартные объекты БД Pangolin и назначается привилегии для их использования. Такими объектами являются:

  • пользовательское табличное пространство — создается на уровне кластера;

  • пользовательская база данных — уровень кластера;

  • пользовательская схема — уровень определенной базы данных.

Табличное пространство создается в директории /pgdata/<номер мажорной версии продукта>/tablespaces/ (может различаться в зависимости от мажорной версии). Владельцем табличного пространства является db_admin, а права на доступ выдаются роли as_admin.

В дополнение к стандартным базам данных Postgresql (template0, template1, postgres) создается пользовательская БД. Владелец данной БД — db_admin. Права на использование (USAGE) и логин на данную БД есть по умолчанию у всех вновь создаваемых ролей.

Схема и объекты схемы#

Владельцем пользовательской схемы является as_admin. Права на использование схемы выдаются роли as_TUZ.

Для использования схемы предоставляются две привилегии: USAGE и CREATE. Для создания новых объектов в схеме нужна привилегия CREATE. Для обращения к объектам схемы (при условии, что есть права на них) нужна привилегия USAGE. Привилегия CREATE есть только у роли as_admin.

Внутри схемы хранятся объекты БД (таблицы, индексы, функции, и т.п). Для каждого типа объекта существует свой набор привилегий. Владельцем объекта становится роль, активная в момент выдачи SQL-запроса на его создание. Так как требуется, чтобы владельцем объектов БД была групповая роль as_admin, то для обеспечения данного условия используются следующие механизмы:

  1. При создании объектов администратор, выполняющий данную задачу, должен выдавать команду SET ROLE as_admin. Для автоматизации некоторых задач, а также в случае, когда другие роли данной УЗ не используются, можно один раз настроить УЗ для работы в роли as_admin, выдав ALTER ROLE <rolename> SET ROLE as_admin. В дальнейшем данная УЗ всегда будет работать как as_admin.

  2. Владельцем объектов может быть только групповая роль, поэтому в УЗ администраторов, имеющих права на создание объектов отключена опция INHERIT. Для конечных пользователей БД (ТУЗ) отключать INHERIT не требуется — они не имеют привилегий на создание объектов, но зато автоматически наследуют все другие необходимые привилегии.

    Роль as_admin, которая имеет привилегию на создание объектов, нельзя унаследовать (она имеет свойство NOINHERIT). Это связано с тем, что на момент инсталляции неизвестно, какие пользователи будут работать с БД в дальнейшем и какие привилегии им будут назначены. Групповые роли позволяют систематизировать пользовательскую структуру. А для того, чтобы владельцем объекта становилась именно роль as_admin, необходимо явно переключаться на нее с помощью запроса: SET ROLE as_admin.

  3. После создания объекта роль as_admin предоставляет необходимую привилегию роли, использующей объект (это в первую очередь as_TUZ). Данный процесс можно облегчить, если назначить default privileges создающей роли (as_admin). С помощью default privileges права заранее предоставляются на объекты, которые будут создаваться в будущем в данной схеме.

Ролевая модель ФСТЭК#

Решение представляет собой набор параметризованных скриптов в формате SQL для автоматизированной настройки ролевой модели ФСТЭК.

Примечание:

Принятые сокращения:

  • admin_dbms — пользователь роли Администратор СУБД;

  • admin_db — пользователь роли Администратор БД;

  • user_db — пользователь роли Пользователь БД;

  • database_name — база данных, для которой применяется Ролевая модель ФСТЭК;

  • <ip_cidr> — диапазон IP-адресов для подключения к базе данных в формате CIDR;

  • <auth_method> — принятый метод аутентификации пользователя, исключая методы trust, local, peer.

Скрипты для настройки разделены по ролям Администратора СУБД, Администратора БД, Пользователя БД:

  • addrole_admin_dbms.sql — проверка и создание роли Администратора СУБД;

  • addrole_admin_db.sql — проверка и создание роли Администратора БД;

  • addrole_user_db.sql — проверка и создание роли Пользователя БД.

Скрипты хранятся в папке /usr/pangolin-<Версия Pangolin>/share/.

Установка ролевой модели#

Порядок установки:

  1. Измените правила в файле pg_hba.conf:

    pg_hba.conf
    [hostssl|hostgss] postgres        admin_dbms <ip_cidr> <auth_method>
    [hostssl|hostgss] database_name   admin_db   <ip_cidr> <auth_method>
    [hostssl|hostgss] replication     admin_db   <ip_cidr> <auth_method>
    [hostssl|hostgss] database_name   user_db    <ip_cidr> <auth_method>
    host              all             admin_dbms 0.0.0.0/0 reject
    host              all             admin_db   0.0.0.0/0 reject
    host              all             user_db    0.0.0.0/0 reject
    local             all             admin_dbms 0.0.0.0/0 reject
    local             all             admin_db   0.0.0.0/0 reject
    local             all             user_db    0.0.0.0/0 reject
    

    В случае использования нескольких учетных записей для каждой роли - учетные записи указываются через запятую для каждой БД.

    В случае использования нескольких БД - желательно группировать записи в pg_hba.conf в разрезе ролей и баз данных. Допустимо указывать роли через запятую для каждой из БД.

  2. Примените изменения в конфигурационном файле pg_hba.conf с помощью команды:

    psql -Xc 'SELECT pg_reload_conf()'
    
  3. Убедитесь в соответствии конфигурационных параметров lc_ctype, lc_collate ожидаемой локали создаваемой БД (в postgresql.conf). В случае изменения параметров — перезапустите сервис СУБД.

  4. Запустите скрипты создания ролей от имени пользователя postgres операционной системы в следующем порядке:

    1. Создайте пользователя роли Администратор СУБД (пример выполнения команды):

      $ psql -Xf addrole_admin_dbms.sql
      Connected to {{product_name}} {version} build 216 (12:05:55 19.02.2024) commit {хеш} (PostgreSQL 15.5)
      -- This script is a part of FSTEC Role Model
      -- [1/3] This script intended TO ADD RDBMS OWNER ROLE AND must be running FIRST
      Enter RDBMS OWNER role name:admin_dbms
      Enter DATABASE name:database_name
      -- Starting adding database owner at Thu Apr  4 14:49:38 MSK 2024
      SET
      Time: 0.954 ms
      SET
      Time: 0.529 ms
      DO
      Time: 4.498 ms
      Adding user admin_dbms
      psql:addrole_admin_dbms.sql:75: NOTICE:  Success: User admin_dbms added. Do not forget to set password
      DO
      Time: 5.553 ms
      Ending adding database owner at Thu Apr  4 14:49:38 MSK 2024
      
    2. Создайте пользователя роли Администратор БД (пример выполнения команды):

      $ psql -Xf addrole_admin_db.sql
      Connected to {{product_name}} {version} build 216 (12:05:55 19.02.2024) commit {хеш} (PostgreSQL 15.5)
      -- This script is a part of FSTEC Role Model
      -- [2/3] This script intended to add DB ADMIN role and must be running AFTER addrole_admin_dbms.sql
      Enter DB ADMIN role name: admin_db
      Enter DATABASE name: database_name
      -- Starting adding database admin at Thu Apr  4 14:50:39 MSK 2024
      SET
      Time: 0.897 ms
      SET
      Time: 0.531 ms
      psql:addrole_admin_db.sql:76: WARNING:
      # $PGDATA/pg_hba.conf must contain
      [hostssl|hostgssenc] database_name admin_db <ip>/<mask> <auth_method>
      
      DO
      Time: 4.918 ms
      Adding user admin_db
      psql:addrole_admin_db.sql:93: NOTICE:  Success: User admin_db added. Do not forget to set password
      DO
      Time: 5.273 ms
      CREATE DATABASE
      Time: 76.350 ms
      Time: 1.428 ms
      -- Ending adding database admin at Thu Apr  4 14:50:39 MSK 2024
      
    3. Создание пользователя роли Пользователя БД (пример выполнения команды)

      $ psql -Xf addrole_user_db.sql
      Connected to {{product_name}} {version} build 216 (12:05:55 19.02.2024) commit {хеш} (PostgreSQL 15.5)
      -- This script is a part of FSTEC Role Model
      -- [3/3] This script intended to add DB USER role and must be running AFTER addrole_admin_db.sql
      Enter DB USER role name: user_db
      Enter DATABASE name: database_name
      -- Starting adding database user at Thu Apr  4 14:53:05 MSK 2024
      SET
      Time: 0.918 ms
      SET
      Time: 0.530 ms
      psql:addrole_user_db.sql:66: WARNING:
      # $PGDATA/pg_hba.conf must contain
      [hostssl|hostgssenc] database_name user_db <ip>/<mask> <auth_method>
      
      DO
      Time: 5.107 ms
      Adding user user_db
      psql:addrole_user_db.sql:83: NOTICE:  Success: User user_db added. Do not forget to set password
      DO
      Time: 5.401 ms
      Time: 0.520 ms
      SET
      Time: 0.462 ms
      GRANT ROLE
      Time: 2.791 ms
      SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, compression: off)
      You are now connected to database "database_name" as user "postgres".
      SET
      Time: 0.910 ms
      ALTER ROLE
      Time: 4.032 ms
      GRANT
      Time: 3.367 ms
      GRANT
      Time: 3.881 ms
      GRANT
      Time: 0.973 ms
      ALTER DEFAULT PRIVILEGES
      Time: 3.418 ms
      ALTER DEFAULT PRIVILEGES
      Time: 2.869 ms
      ALTER DEFAULT PRIVILEGES
      Time: 2.739 ms
      ALTER DEFAULT PRIVILEGES
      Time: 2.836 ms
      ALTER DEFAULT PRIVILEGES
      Time: 2.809 ms
      RESET
      Time: 0.313 ms
      SET
      Time: 0.479 ms
      SET
      Time: 0.414 ms
      SET
      Time: 0.420 ms
      psql:addrole_user_db.sql:121: NOTICE:  Fixing permissions on trusted languages
      psql:addrole_user_db.sql:121: NOTICE:  End fixing permissions on trusted languages
      DO
      Time: 6.045 ms
      -- Ending adding database user at Thu Apr  4 14:53:05 MSK 2024
      

    При добавлении нескольких пользователей ролей — добавление последующих ролей производится после добавления полного цикла из трех ролей Администратора СУБД, Администратора БД, Пользователя БД.

    При этом, Администратор БД не может быть добавлен раньше Администратора СУБД, Пользователь БД раньше Администратора БД (в разрезе конкретной БД).

    Внимание!

    Ограничения:

    • соответствие имен роли и БД маске: первая буква – латиница (смешанный регистр), вторая и последующие – латиница (смешанный регистр), цифры, символ подчеркивания. Минимальная длина — 1 символ;

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

    • отсутствие БД при создании роли Пользователь БД будет считаться ошибкой.

  5. В случае выбора метода аутентификации по паролю — задайте пароль для каждой добавленной роли.