Перейти к основному содержимому

Задание 1: Управление доступом на основе ролей

Примечание

В практических заданиях данного модуля подразумевается использование развернутого вручную Pangolin (установка рассматривается в курсе DBA0: Глава 01. Установка Pangolin). Если для установки вы пользовались инсталлятором, директории, пути к ним, значения конфигурационных параметров СУБД, а также включенные функциональности могут отличаться от примеров.

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

Информация для ограничения доступа хранится в таблицах каталога безопасности. Инициализация каталога безопасности и создание учетной записи администратора безопасности выполняются утилитой initprotection. Учетные записи администраторов безопасности также находятся под защитой и не могут быть изменены администратором СУБД. Наделение привилегиями администратора безопасности выполняется только администраторами безопасности.

Более подробно с защитой данных от привилегированных пользователей можно ознакомиться в документации.

Инициализация каталога безопасности​

  1. Получите статус сервера Pangolin:

    [UserName@ServerName ~]$ sudo systemctl status postgresql
    ● postgresql.service - Runners PostgreSQL service
    Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)
    Active: active (running) since Tue 2025-04-01 08:37:25 MSK; 2h 39min ago
    Process: 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.2M
    CPU: 958ms
    ...

    Мы видим – он запущен.

  2. Остановите сервер Pangolin:

    [UserName@ServerName ~]$ sudo systemctl stop postgresql
  3. Проверьте статус сервера – он должен быть остановлен:

    [UserName@ServerName ~]$ sudo systemctl status postgresql
    ○ postgresql.service - Runners PostgreSQL service
    Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)
    Active: inactive (dead) since Tue 2025-04-01 11:16:37 MSK; 2s ago
    Duration: 2h 39min 11.485s
    Process: 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
    ...
  4. В файле sudoers создайте правило для пользователя kmadmin_pg:

    [UserName@ServerName ~]$ sudo visudo
    ...
    ## Same thing without a password
    wheel ALL=(ALL) NOPASSWD: ALL
    UserName ALL=(ALL) NOPASSWD: ALL
    kmadmin_pg ALL = (postgres : kmadmin_pg) NOPASSWD: /bin/bash -c /usr/pangolin/bin/initprotection
    ...
  5. Установите владельца и группу для утилиты /usr/pangolin/bin/initprotection:

    [UserName@ServerName ~]$ sudo chown root:kmadmin_pg /usr/pangolin/bin/initprotection
  6. Запустите утилиту 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/initprotection
    Enter PGDATA directory [/pgdata/06/data]:
    Enter security administrator names (comma-separated):sec_admin
    Enter 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.

  7. Запустите сервер Pangolin:

    [kmadmin_pg@ServerName ~]$ exit
    logout
    [UserName@ServerName ~]$ sudo systemctl start postgresql
  8. Проверьте, что появился пользователь sec_admin:

    [UserName@ServerName ~]$ sudo su - postgres
    [postgres@ServerName ~]$ psql
    Pager 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=# \dg
    List 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 - разблокировка заблокированной учетной записи администратора безопасности.

Подведем итоги​

Вопрос 1

Выберете все корректные утверждения: