Я хочу перенести довольно простое внутреннее приложение, управляемое базой данных, из SQLite3 в PostgreSQL 9.3 и ужесточить права доступа к БД.
Приложение в настоящее время состоит из команды для обновления данных; и один, чтобы запросить это. Естественно, мне также нужно поддерживать базу данных другими способами (создавать новые таблицы, представления, триггеры и т. Д.).
Хотя это приложение будет единственным, размещенным на сервере вначале, я предпочел бы испечь в предположении, что оно может быть размещено на сервере с другими базами данных в будущем, а не шифровать его позже, если в этом возникнет необходимость. будущее.
Я думаю, что это будет довольно распространенный набор требований, но у меня возникают проблемы с поиском простого учебника, объясняющего, как настроить новую базу данных в PostgreSQL с таким разделением пользователей и привилегий. Ссылки продолжаются подробно о группах, пользователях, ролях, базах данных, схемах и области; но я нахожу их запутанными.
Вот что я пробовал до сих пор (изнутри psql
как «postgres»):
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
Но я не получаю предполагаемую семантику. Я хочу, чтобы он был настроен таким образом, чтобы только hostdb_admin
таблицы могли создавать (и удалять и изменять); hostdb_mgr
может читать, вставлять, обновлять и удалять на все таблицы по умолчанию; и hostdb_usr
может только читать все таблицы (и представления).
Когда я попробовал это, я обнаружил, что могу создавать таблицы hostdb
как любой из этих пользователей; но для каждого пользователя я мог только читать или изменять таблицы, созданные этим пользователем - если я не использую явные GRANT
.
Я предполагаю, что между CREATE DATABASE
и CREATE SCHEMA
чем- то не хватает , что-то, чтобы применить SCHEMA
к DATABASE
?
(По мере того, как дела будут продвигаться дальше, у меня также возникнут вопросы о применении аналогичных ограничений TRIGGERS
, хранимых процедур VIEWS
и, возможно, других объектов).
Где я могу найти достойное руководство, учебник или видео сериал по этому вопросу?
источник
public
псевдороле. Эту роль можно рассматривать как роль, членом которой является любая другая роль (пользователь, группа - все они одинаковы). Попробуйте удалить из него привилегии, напримерREVOKE CREATE ON SCHEMA hostdb FROM public
,. Отмена прав на уровне базы данных, как вы это сделали, отключает только некоторые разрешения на уровне базы данных, не влияя на схемы или таблицы.public
происходит с привилегиями дляPUBLIC
. Кроме этого, нет никаких привилегий по умолчанию для новых схем. Так что это не влияет на продемонстрированный вариант использования. Смотрите главу в моем ответе.Ответы:
Вы найдете все в руководстве. Ссылки ниже.
Конечно, дело не тривиальное, а иногда запутанное. Вот рецепт для варианта использования:
Рецепт
Как суперпользователь
postgres
:Если вам нужен более мощный администратор, который также может управлять базами данных и ролями, добавьте атрибуты роли
CREATEDB
иCREATEROLE
выше.Предоставьте каждой роли следующий более высокий уровень, чтобы все уровни «наследовали» как минимум набор привилегий следующего более низкого уровня (каскадирование):
Я называю схему
schma
(неhostdb
которая может сбить с толку). Выберите любое имя. По желанию сделатьschma_admin
владельца схемы:Для
and drop and alter
заметок ниже.Взгляды особенные. Для одного:
И для обновляемых представлений :
Триггеры тоже особенные. Вам нужна
TRIGGER
привилегия на стол, и:Но мы уже чрезмерно расширяем сферу этого вопроса ...
Важные заметки
Владение
Если вы хотите разрешить
schma_admin
(самостоятельно) удалять и изменять таблицы, сделайте роль владельцем всех объектов. Документация:Или создайте все объекты с ролью
schma_admin
для начала, тогда вам не нужно явно указывать владельца. Это также упрощает привилегии по умолчанию, которые вам нужно установить только для одной роли:Существующие объекты
Права по умолчанию применяются только для вновь созданных объектов и только для конкретной роли, с которой они созданы. Вы также захотите адаптировать разрешения для существующих объектов:
То же самое применимо, если вы создаете объекты с ролью, которая не имеет
DEFAULT PRIVILEGES
установленной, например суперпользовательpostgres
. Переприсвоить собственности наschma_admin
и набор привилегий вручную - или наборDEFAULT PRIVILEGES
для ,postgres
а также (при подключении к правой БД!):Права по умолчанию
Вы упустили важный аспект
ALTER DEFAULT PRIVILEGES
команды. Это относится к текущей роли, если не указано иное:Права по умолчанию применяются только к текущей базе данных. Таким образом, вы не связываетесь с другими базами данных в кластере БД. Документация:
Вы можете также необходимо установить права по умолчанию для
FUNCTIONS
иTYPES
(не толькоTABLES
иSEQUENCES
), но те , которые не могут быть необходимы.Права по умолчанию для
PUBLIC
Предоставленные по умолчанию привилегии
PUBLIC
являются зачаточными и переоцениваются некоторыми. Документация:Жирный акцент мой. обычно одной команды выше достаточно, чтобы охватить все:
В частности, никакие привилегии по умолчанию не предоставляются
PUBLIC
для новых схем. Может показаться странным, что схема по умолчанию с именем «public» начинается сALL
привилегий дляPUBLIC
. Это просто удобная функция для облегчения запуска с вновь созданными базами данных. Это никак не влияет на другие схемы. Вы можете отменить эти привилегии в базе данных шаблоновtemplate1
, после чего все вновь созданные базы данных в этом кластере начнутся без них:Привилегия
TEMP
Поскольку мы отозвали все привилегии
hostdb
сPUBLIC
, обычные пользователи не могут создавать временные таблицы, если мы явно не разрешаем это. Вы можете или не можете добавить это:search_path
Не забудьте установить
search_path
. Если у вас есть только одна база данных в кластере, вы можете просто установить глобальное значение по умолчанию вpostgresql.conf
. Иначе (более вероятно) установить его как свойство базы данных, или просто для задействованных ролей, или даже для комбинации обоих. Подробности:Возможно, вы захотите установить его,
schma, public
если вы используете общедоступную схему, или даже (менее вероятно)$user, schma, public
...Альтернативой может быть использование схемы по умолчанию «public», которая должна работать с настройками по умолчанию,
search_path
если только вы не изменили это. Не забудьте отозвать привилегии дляPUBLIC
в этом случае.Связанный
источник
this
выглядит как инструкция для космического корабля ...