Конфигурация настроек базы данных

Разграничение прав на схему БД

Аннотация

В данной статье рассмотрены настройки разграничения прав на базу данных (БД) в системе управления БД (СУБД) PostgreSQL, а именно:

  • ограничение привилегий для уже созданного пользователя и БД;

  • ограничение привилегий, если настройки среды функционирования еще не были выполнены.

Ограничение привилегий на схему БД для уже созданного пользователя

Перед установкой Termidesk VDI должна быть настроена среда функционирования, в частности - СУБД PostgreSQL.

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

По умолчанию для Termidesk VDI в СУБД PostgreSQL используется БД с именем termidesk и схемой public. Схема public доступна пользователю БД (по умолчанию пользователь termidesk) без дополнительных операций по выдаче прав.

Чтобы ограничить пользователя БД termidesk только одной его БД termidesk без возможности передачи прав на нее, нужно:

  • переключиться последовательно на пользователя root, затем на postgres:

sudo -s
su postgres
  • запустить терминальный клиент СУБД PostgreSQL:

psql

Если после выполнения команды отображается ошибка «could not change directory to "/home/": Отказано в доступе» и не появляется приглашение командной строки postgres=, необходимо вместо su postgres использовать конструкцию su - postgres. Если приглашение postgres= появилось, то сообщение об ошибке можно проигнорировать.

Символ «;» в конце строки в командах при работе в терминальном клиенте СУБД PostgreSQL обязателен.

  • отозвать ранее назначенные привилегии:

postgres=# REVOKE ALL ON termidesk FROM termidesk;
  • подключиться к нужной БД (по умолчанию termidesk):

postgres=# \c termidesk;
  • создать новую схему БД:

В текущей реализации последней версии Termidesk VDI поддерживается только схема public. Поэтому этот шаг стоит пропустить, а далее, при назначении прав на схему, вместо параметра имя_схемы использовать public.
termidesk=# CREATE SCHEMA <имя_схемы>;
  • назначить пользователю БД необходимые права на схему одним из вариантов:

    • назначить все права на схему:

      termidesk=# GRANT ALL PRIVILEGES ON SCHEMA <имя_схемы> TO termidesk;
    • назначить ограниченные права на схему:

      termidesk=# GRANT CREATE, USAGE ON SCHEMA <имя_схемы> TO termidesk;
      termidesk=# GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE ON ALL TABLES IN SCHEMA <имя_схемы> TO termidesk;
      termidesk=# GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA <имя_схемы> TO termidesk;

Ограничение привилегий для еще не созданного пользователя

Если СУБД PostgreSQL была установлена, но БД еще не была настроена, нужно:

  • переключиться последовательно на пользователя root, затем на postgres:

sudo -s
su postgres
  • запустить терминальный клиент СУБД PostgreSQL:

:/home/astra$ psql

Если после выполнения команды отображается ошибка «could not change directory to "/home/": Отказано в доступе» и не появляется приглашение командной строки postgres=, необходимо вместо su postgres использовать конструкцию su - postgres. Если приглашение postgres= появилось, то сообщение об ошибке можно проигнорировать.

Символ «;» в конце строки в командах при работе в терминальном клиенте СУБД PostgreSQL обязателен.

  • используя интерактивный интерфейс терминального клиента СУБД, создать БД termidesk с шаблоном template0 (символ «;» в конце строки при работе с интерактивным интерфейсом обязателен):

postgres=# CREATE DATABASE termidesk LC_COLLATE 'ru_RU.utf8' LC_CTYPE 'ru_RU.utf8' TEMPLATE template0;
  • подключиться к созданной БД termidesk:

postgres=# \c termidesk;
  • создать новую схему БД:

текущей реализации последней версии Termidesk VDI поддерживается только схема public. Поэтому этот шаг стоит пропустить, а далее, при назначении прав на схему, вместо параметра имя_схемы использовать public.
termidesk=# CREATE SCHEMA <имя_схемы>;
  • создать новую роль:

termidesk=# CREATE ROLE <имя_роли>;
  • назначить нужные права для роли и создать пользователя termidesk:

termidesk=# GRANT CREATE, USAGE ON SCHEMA <имя_схемы> TO <имя_роли>;
termidesk=# GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE ON ALL TABLES IN SCHEMA <имя_схемы> TO <имя_роли>;
termidesk=# GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA <имя_схемы> TO <имя_роли>;
termidesk=# CREATE USER termidesk WITH PASSWORD 'ksedimret' IN ROLE <имя_роли>;

где ksedimret - пароль, использующийся по умолчанию. Может быть изменен, однако это изменение необходимо затем учесть в файле /etc/rabbitmq/definitions.json.

Ограничение привилегий пользователя на базу данных PostgreSQL

Аннотация

В данной статье рассмотрена настройка ограничения привилегий пользователя на базу данных (БД) в системе управления БД (СУБД) Postgres-11.

Ограничение привилегий пользователя на БД PostgreSQL

Чтобы ограничить пользователя БД только одной его БД без возможности передачи прав на нее, нужно выдать минимум прав при создании пользователя, для этого:

  • переключиться последовательно на пользователя root, затем на postgres:

sudo -s
su postgres

Если после выполнения команды отображается ошибка «could not change directory to "/home/": Отказано в доступе» и не появляется приглашение командной строки postgres=, необходимо вместо su postgres использовать конструкцию su - postgres. Если приглашение postgres= появилось, то сообщение об ошибке можно проигнорировать.

Символ «;» в конце строки в командах при работе в терминальном клиенте СУБД PostgreSQL обязателен.

  • создать пользователя (по умолчанию termidesk) для БД в интерфейсе командной строки системы:

Роли, созданные разными методами, не идентичны! Роль, созданная в командной строке системы, будет иметь привилегии входа.
createuser termidesk
  • на интерактивные запросы о привилегиях создаваемого пользователя ответить «n»:

Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
  • назначить новые привилегии на схему для пользователя termidesk.

Изменение владельца объектов БД

Аннотация

В инструкции приведена краткая последовательность действий по изменению владельца объектов базы данных (далее - БД) с одной ролевой группы на другую.

Изменение владельца объектов БД

Изменение владельца объектов БД с сервисной учетной записи на ролевую группу «as_admin» может привести к нарушению работы Termidesk VDI в случае некорректной настройки прав доступа.

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

Для безопасной смены владельца объектов БД на ролевую группу «as_admin» нужно:

  • запустить терминальный клиент СУБД PostgreSQL от имени пользователя postgres:

sudo -u postgres psql
  • если работа выполняется внутри клиента psql, подключиться от имени сервисной учетной записи:

postgres=# \c termideskdb

где:

termideskdb - имя сервисной учетной записи;

  • проверить текущего владельца (символ «;» в конце строки при работе с интерактивным интерфейсом обязателен):

SELECT tablename, tableowner FROM pg_tables WHERE schemaname = 'public';
  • убедиться, что ролевой группе «as_admin» назначены права:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO as_admin;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO as_admin;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO as_admin;
  • проверить, использует ли Termidesk VDI сервисную учетную запись для соединений:

SELECT usename FROM pg_stat_activity;
  • при использовании сервисной учетной записи для соединений, убедиться, что она включена в группу «as_admin»:

ALTER ROLE termidesk INHERIT FROM as_admin;
  • изменить владельца на ролевую группу «as_admin»:

DO $$
   DECLARE
       r RECORD;
   BEGIN
       FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP
           EXECUTE 'ALTER TABLE ' || quote_ident(r.tablename) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • изменить владельца всех последовательностей (используемых для автоинкрементных полей «SERIAL» и «BIGSERIAL»):

DO $$
   DECLARE
       r RECORD;
   BEGIN
       FOR r IN (SELECT sequencename FROM pg_sequences WHERE schemaname = 'public') LOOP
           EXECUTE 'ALTER SEQUENCE ' || quote_ident(r.sequencename) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • изменить владельца всех функций (при наличии функций, процедур и триггеров):

DO $$
   DECLARE
       r RECORD;
   BEGIN
       FOR r IN (SELECT routine_name FROM information_schema.routines WHERE routine_schema = 'public') LOOP
           EXECUTE 'ALTER FUNCTION ' || quote_ident(r.routine_name) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • изменить владельца всех представлений:

DO $$
   DECLARE
       r RECORD;
   BEGIN
       FOR r IN (SELECT table_name FROM information_schema.views WHERE table_schema = 'public') LOOP
           EXECUTE 'ALTER VIEW ' || quote_ident(r.table_name) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • выйти из интерактивного интерфейса терминального клиента СУБД PostgreSQL:

postgres=# \q
  • выйти из сеанса пользователя postgres:

exit
  • перезапустить службу termidesk-vdi:

sudo systemctl restart termidesk-vdi.service
  • проверить состояние службы termidesk-vdi:

systemctl status termidesk-vdi.service