Folks,
Я мог бы использовать вашу помощь, чтобы улучшить дизайн управления доступом пользователей Postgres и привести его в соответствие с лучшими практиками. Я помогаю развернуть небольшой производственный сервер Postgres, но я не являюсь администратором БД, поэтому знаю достаточно, чтобы быть опасным.
Существует один сервер с одной установкой Postgres v9.2. Эта установка содержит несколько баз данных, каждая из которых полностью обслуживает своего «клиента». Другими словами, customer1 не будет, не должен использовать database2 и так далее. Во время обычной работы базы данных получают доступ к соответствующему экземпляру CakePHP, все они расположены на том же сервере, что и Postgres. Несмотря на возможную оптимизацию этого развертывания, меня больше всего интересуют роли Psql.
Исходя из того, что я прочитал, кажется, что три типа ролей имеют смысл:
- Superuser Postgres с паролем не по умолчанию
- Роль администратора, которая не имеет привилегий суперпользователя для текущего обслуживания, создания БД, резервного копирования, восстановления. Должен быть в состоянии сделать что-нибудь со всеми базами данных клиентов.
- Роли пользователей с возможностью CRUD в соответствующей базе данных. Больше прав на их собственную БД может быть допущено, если это очищает реализацию.
Реализация этого дизайна - это то, где я гораздо менее уверен. Право собственности на БД по сравнению с таблицей, а также то, кто должен унаследовать от того, кто немного грязный. Ниже приведены мои базы данных и мои пользователи. Достаточно ли информации для оценки реализации?
Role name | Attributes | Member of
-----------+------------------------------------------------+-------------------
admin | Create role, Create DB | {user1, user2}
postgres | Superuser, Create role, Create DB | {}
user1 | | {}
user2 | | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
admin | postgres | UTF8 | en_US | en_US | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | admin=CTc/postgres
postgres | postgres | UTF8 | en_US | en_US |
template0 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
user1 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user1=CTc/admin
user2 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user2=CTc/admin
Для предотвращения внешних подключений и паролей в открытом виде pg_hba.conf выглядит так:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
источник
Ответы:
Я знаю, что это старый вопрос, но я постараюсь ответить на него даже сейчас, так как я должен провести некоторое исследование, связанное с этим.
То, что вы пытаетесь сделать, называется многопользовательским режимом на уровне базы данных. Это может быть достигнуто двумя способами:
В одном кластере базы данных, как описано в ОП, мой личный выбор будет следующим:
Каждый клиент получает свой кластер базы данных. Это мое предпочтительное решение, особенно потому, что я обычно работаю с приложениями, которые имеют большие базы данных для каждого клиента.
Вы также можете использовать комбинацию из вышеперечисленного и использовать pgBouncer в качестве маршрутизатора.
источник