Конфигурация настроек базы данных
Разграничение прав на схему БД
Аннотация
В данной статье рассмотрены настройки разграничения прав на базу данных (БД) в системе управления БД (СУБД) 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/": Отказано в доступе» и не появляется приглашение командной строки Символ «;» в конце строки в командах при работе в терминальном клиенте СУБД 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/": Отказано в доступе» и не появляется приглашение командной строки Символ «;» в конце строки в командах при работе в терминальном клиенте СУБД 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/": Отказано в доступе» и не появляется приглашение командной строки Символ «;» в конце строки в командах при работе в терминальном клиенте СУБД 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