Разграничение прав доступа PostgreSQL
Роли в PostgreSQL
-
Роль = пользователь или группа пользователей.
-
Создаются на уровне всего кластера (
CREATE ROLE). -
Каждое подключение выполняется от имени роли.
-
Атрибуты ролей:
-
LOGIN— можно подключаться к БД (пользователь). -
SUPERUSER— полный доступ, минует все проверки. -
CREATEDB— можно создавать базы. -
CREATEROLE— можно создавать/удалять/изменять роли. -
REPLICATION— права для потоковой репликации. -
PASSWORD— используется при аутентификации.
-
Суперпользователей используют только для администрирования, для повседневной работы лучше ограниченные роли.
Членство и наследование
-
Роли можно объединять в группы.
-
GRANT group_role TO user_role;— добавление в группу. -
Атрибут
INHERIT— автоматически наследовать права группы. -
SET ROLE— временно переключиться на другую роль.
Удаление роли
-
Передать объекты другой роли (
REASSIGN OWNED). -
Удалить оставшиеся права/объекты (
DROP OWNED). -
Удалить роль (
DROP ROLE).
Схемы
-
Схема = пространство имён объектов внутри базы данных.
-
База может содержать несколько схем, а в них — таблицы, функции и др.
-
По умолчанию все объекты создаются в схеме public.
-
Обращение идёт через путь поиска (
search_path), обычно:"$user", publicТо есть сначала ищется схема с именем пользователя, потом
public.
Права на схемы
-
USAGE— доступ к объектам внутри схемы. -
CREATE— возможность создавать новые объекты. -
По умолчанию в
publicвсе имеют праваCREATEиUSAGE, что небезопасно.
-
Личные схемы для пользователей
-
REVOKE CREATE ON SCHEMA public FROM PUBLIC; -
Создать каждому пользователю свою схему.
-
Тогда
$userвsearch_pathбудет указывать на его личное пространство.
-
-
Удалить public из search_path
-
Оставить её только для явного использования.
-
-
Оставить по умолчанию (небезопасно, только для доверенной среды).
-
Роли отвечают за то, кто и что может делать.
-
Схемы отвечают за то, где хранятся объекты и как к ним обращаться.
-
Грамотное использование ролей и схем обеспечивает безопасность и удобство работы в многопользовательской среде PostgreSQL.
