Задание 1: Управление доступом на основе ролей
В практических заданиях данного модуля подразумевается использование развернутого вручную Pangolin (установка рассматривается в курсе DBA0: Глава 01. Установка Pangolin). Если для установки вы пользовались инсталлятором, директории, пути к ним, значения конфигурационных параметров СУБД, а также включенные функциональности могут отличаться от примеров.
Механизм защиты данных от привилегированных пользователей реализуется как не отключаемое расширение Pangolin и управляется дублируемыми параметрами в локальных конфигурационных файлах и защищенном хранилище.
Информация для ограничения доступа хранится в таблицах каталога безопасности. Инициализация каталога безопасности и создание учетной записи администратора безопасности выполняются утилитой initprotection. Учетные записи администраторов безопасности также находятся под защитой и не могут быть изменены администратором СУБД. Наделение привилегиями администратора безопасности выполняется только администраторами безопасности.
Более подробно с защитой данных от привилегированных пользователей можно ознакомиться в документации.
Инициализация каталога безопасности
-
Получите статус сервера Pangolin:
[UserName@ServerName ~]$ sudo systemctl status postgresql● postgresql.service - Runners PostgreSQL serviceLoaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)Active: active (running) since Tue 2025-04-01 08:37:25 MSK; 2h 39min agoProcess: 685 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 686 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (cosudde=exited, status=0/SUCCESS)Main PID: 687 (postgres)Tasks: 12 (limit: 9499)Memory: 34.2MCPU: 958ms...Мы видим – он запущен.
-
Остановите сервер Pangolin:
[UserName@ServerName ~]$ sudo systemctl stop postgresql -
Проверьте статус сервера – он должен быть остановлен:
[UserName@ServerName ~]$ sudo systemctl status postgresql○ postgresql.service - Runners PostgreSQL serviceLoaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)Active: inactive (dead) since Tue 2025-04-01 11:16:37 MSK; 2s agoDuration: 2h 39min 11.485sProcess: 685 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 686 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 687 ExecStart=/bin/bash -i -c /usr/pangolin-6/bin/postgres -D /pgdata/06/data (code=exited, status=0/SUCCESS)Main PID: 687 (code=exited, status=0/SUCCESS)CPU: 1.000s... -
В файле
sudoersсоздайте правило для пользователяkmadmin_pg:[UserName@ServerName ~]$ sudo visudo...## Same thing without a passwordwheel ALL=(ALL) NOPASSWD: ALLUserName ALL=(ALL) NOPASSWD: ALLkmadmin_pg ALL = (postgres : kmadmin_pg) NOPASSWD: /bin/bash -c /usr/pangolin/bin/initprotection... -
Установите владельца и группу для утилиты
/usr/pangolin/bin/initprotection:[UserName@ServerName ~]$ sudo chown root:kmadmin_pg /usr/pangolin/bin/initprotection -
Запустите утилиту
initprotectionиз-под пользователяkmadmin_pg. Задайте пароль для пользователяsec_admin. При запросе директории можно просто нажатьEnter:[UserName@ServerName ~]$ sudo su - kmadmin_pg[kmadmin_pg@ServerName ~]$ sudo -i -u postgres -g kmadmin_pg /usr/pangolin/bin/initprotectionEnter PGDATA directory [/pgdata/06/data]:Enter security administrator names (comma-separated):sec_adminEnter new security admin password for user "sec_admin":Enter it again:running bootstrap script ... WARNING: 01000: Force disable...Protection mechanism is initialized.syncing data to disk ...Внимание!Если возникла ошибка вида:
terminate called after throwing an instance of 'std::logic_error'what(): basic_string::_M_construct null not validВыключите параметры
loading_control.check_allow_listиloading_control.check_hashвpostgresql.confи повторите запуск утилитыinitprotection. -
Запустите сервер Pangolin:
[kmadmin_pg@ServerName ~]$ exitlogout[UserName@ServerName ~]$ sudo systemctl start postgresql -
Проверьте, что появился пользователь
sec_admin:[UserName@ServerName ~]$ sudo su - postgres[postgres@ServerName ~]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)Type "help" for help.postgres@postgres=# \dgList of roles┌────────────────┬────────────────────────────────────────────────────────────┬──────────────────┐│ Role name │ Attributes │ Member of │├────────────────┼────────────────────────────────────────────────────────────┼──────────────────┤│ postgres │ Superuser, Create role, Create DB, Replication, Bypass RLS │ {} ││ sec_admin │ No inheritance ↵│ {sec_admin_role} ││ │ Password valid until infinity │ ││ sec_admin_role │ No inheritance, Cannot login │ {} │└────────────────┴────────────────────────────────────────────────────────────┴──────────────────┘postgres@postgres=# SELECT check_admin_protect_is_on();┌───────────────────────────┐│ check_admin_protect_is_on │├───────────────────────────┤│ t │└───────────────────────────┘(1 row)postgres@postgres=# \q
Интерфейс администратора безопасности
В данном курсе мы не будем подробно разбирать каждый из доступных администратору безопасности методов, но кратко оценим предоставляемые Pangolin возможности:
Действия с политиками:
pm_get_policies- вывод списка политик;pm_get_policy_grants- вывод списка разрешений (правил) в составе политики;pm_make_policy- создание политики;pm_grant_to_policy- внесение в политику разрешения на действия над объектом;pm_revoke_from_policy- исключение из политики разрешения на действия над объектом;pm_revoke_all_actions_from_policy- исключение из политики всех ранее выданных разрешений для указанного объекта;pm_suspend_object- приостановка действия политики защиты;pm_resume_object- возобновление действия политики защиты;pm_remove_policy- удаление политики защиты.
Действия с пользователями:
pm_get_assigned_policies- вывод списка политик, назначенных пользователю;pm_assign_policy_to_user- назначение политики пользователю;pm_unassign_policy_from_user- изъятие политики у пользователя.
Действия над объектами:
pm_get_protected_objects- вывод списка объектов, находящихся под защитой;pm_protect_object- помещение объекта БД под защиту;pm_unprotect_object- снятие защиты с объекта БД;pm_get_object_access_path- получение информации о действующих для указанных объекта и роли ограничениях защиты и разрешениях на доступ.
Действия для администраторов безопасности:
pm_create_security_admin- создание учетной записи администратора безопасности;pm_set_security_admin_password- изменение пароля учетной записи администратора безопасности;pm_grant_security_admin- назначение пользователя администратором безопасности;pm_revoke_security_admin- снятие с пользователя политики администратора безопасности;pm_unblock_security_admin- разблокировка заблокированной учетной записи администратора безопасности.