Где я могу найти достойное руководство, учебник или видео сериал по этому вопросу?
Вы найдете все в руководстве. Ссылки ниже.
Конечно, дело не тривиальное, а иногда запутанное. Вот рецепт для варианта использования:
Рецепт
Я хочу, чтобы он был настроен таким образом, чтобы только hostdb_admin
таблицы могли создавать (и удалять и изменять); может читать, вставлять, обновлять и удалять на все таблицы по умолчанию;
и может только читать все таблицы (и представления).
hostdb_mgr
hostdb_usr
Как суперпользователь postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
Если вам нужен более мощный администратор, который также может управлять базами данных и ролями, добавьте атрибуты роли CREATEDB
иCREATEROLE
выше.
Предоставьте каждой роли следующий более высокий уровень, чтобы все уровни «наследовали» как минимум набор привилегий следующего более низкого уровня (каскадирование):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
Я называю схему schma
(не hostdb
которая может сбить с толку). Выберите любое имя. По желанию сделать schma_admin
владельца схемы:
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
Для and drop and alter
заметок ниже.
По мере того, как дела продвигаются вперед, у меня также возникают вопросы о применении аналогичных ограничений TRIGGERS
, хранимых процедур VIEWS
и, возможно, других объектов.
... (но учтите, что ALL TABLES
считается, что он включает в себя представления и сторонние таблицы).
И для обновляемых представлений :
Обратите внимание, что пользователь, выполняющий вставку, обновление или удаление в представлении, должен иметь соответствующую привилегию вставки, обновления или удаления в представлении. Кроме того, владелец представления должен иметь соответствующие привилегии для базовых базовых отношений, но пользователю, выполняющему обновление, не требуются какие-либо разрешения для базовых базовых отношений (см.
Раздел 38.5 ).
Триггеры тоже особенные. Вам нужна TRIGGER
привилегия на стол, и:
Но мы уже чрезмерно расширяем сферу этого вопроса ...
Важные заметки
Владение
Если вы хотите разрешить schma_admin
(самостоятельно) удалять и изменять таблицы, сделайте роль владельцем всех объектов. Документация:
Право удалить объект или каким-либо образом изменить его определение не рассматривается как предоставляемая привилегия; это присуще владельцу, и не может быть предоставлено или отменено. (Однако аналогичный эффект можно получить, предоставив или отменив членство в роли, которой принадлежит объект; см. Ниже.) Владелец неявно также имеет все параметры предоставления объекта.
ALTER TABLE some_tbl OWNER TO schma_admin;
Или создайте все объекты с рольюschma_admin
для начала, тогда вам не нужно явно указывать владельца. Это также упрощает привилегии по умолчанию, которые вам нужно установить только для одной роли:
Существующие объекты
Права по умолчанию применяются только для вновь созданных объектов и только для конкретной роли, с которой они созданы. Вы также захотите адаптировать разрешения для существующих объектов:
То же самое применимо, если вы создаете объекты с ролью, которая не имеет DEFAULT PRIVILEGES
установленной, например суперпользователь postgres
. Переприсвоить собственности на schma_admin
и набор привилегий вручную - или набор DEFAULT PRIVILEGES
для , postgres
а также (при подключении к правой БД!):
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
Права по умолчанию
Вы упустили важный аспект ALTER DEFAULT PRIVILEGES
команды. Это относится к текущей роли, если не указано иное:
Права по умолчанию применяются только к текущей базе данных. Таким образом, вы не связываетесь с другими базами данных в кластере БД. Документация:
для всех объектов, созданных в текущей базе данных
Вы можете также необходимо установить права по умолчанию для FUNCTIONS
и TYPES
(не только TABLES
и SEQUENCES
), но те , которые не могут быть необходимы.
Права по умолчанию для PUBLIC
Предоставленные по умолчанию привилегии PUBLIC
являются зачаточными и переоцениваются некоторыми. Документация:
PostgreSQL предоставляет права по умолчанию для некоторых типов объектов
PUBLIC
. Никакие привилегии не предоставляются PUBLIC
по умолчанию для таблиц, столбцов, схем или табличных пространств. Для других типов предоставляются PUBLIC
следующие привилегии по умолчанию : CONNECT
и CREATE TEMP TABLE
для баз данных; EXECUTE
привилегия для функций; и USAGE
привилегия для языков.
Жирный акцент мой. обычно одной команды выше достаточно, чтобы охватить все:
REVOKE ALL ON DATABASE hostdb FROM public;
В частности, никакие привилегии по умолчанию не предоставляются PUBLIC
для новых схем. Может показаться странным, что схема по умолчанию с именем «public» начинается с ALL
привилегий для PUBLIC
. Это просто удобная функция для облегчения запуска с вновь созданными базами данных. Это никак не влияет на другие схемы. Вы можете отменить эти привилегии в базе данных шаблонов template1
, после чего все вновь созданные базы данных в этом кластере начнутся без них:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
Привилегия TEMP
Поскольку мы отозвали все привилегии hostdb
с PUBLIC
, обычные пользователи не могут создавать временные таблицы, если мы явно не разрешаем это. Вы можете или не можете добавить это:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
Не забудьте установить search_path
. Если у вас есть только одна база данных в кластере, вы можете просто установить глобальное значение по умолчанию в postgresql.conf
. Иначе (более вероятно) установить его как свойство базы данных, или просто для задействованных ролей, или даже для комбинации обоих. Подробности:
Возможно, вы захотите установить его, schma, public
если вы используете общедоступную схему, или даже (менее вероятно) $user, schma, public
...
Альтернативой может быть использование схемы по умолчанию «public», которая должна работать с настройками по умолчанию, search_path
если только вы не изменили это. Не забудьте отозвать привилегии для PUBLIC
в этом случае.
Связанный
public
псевдороле. Эту роль можно рассматривать как роль, членом которой является любая другая роль (пользователь, группа - все они одинаковы). Попробуйте удалить из него привилегии, напримерREVOKE CREATE ON SCHEMA hostdb FROM public
,. Отмена прав на уровне базы данных, как вы это сделали, отключает только некоторые разрешения на уровне базы данных, не влияя на схемы или таблицы.