Ребята,
Мне не помешала бы ваша помощь, чтобы мой дизайн управления доступом пользователей Postgres был лучше и лучше соответствовал лучшим практикам. Я помогаю развернуть небольшой производственный сервер Postgres, но я не администратор БД, поэтому знаю достаточно, чтобы быть опасным.
Есть один сервер с одной установкой Postgres v9.2. В этой установке размещено несколько баз данных, каждая из которых полностью обслуживает своего «клиента». Другими словами, customer1 не будет, не должен использовать database2 и так далее. Во время обычных операций к базам данных обращается соответствующий экземпляр CakePHP, который находится на том же сервере, что и Postgres. Хотя в этом развертывании могут быть возможные оптимизации, меня больше всего интересуют роли Psql.
Исходя из того, что я прочитал, кажется, есть смысл использовать три типа ролей:
Я гораздо менее уверен в реализации этого дизайна. Право собственности на БД по сравнению с таблицей, а также то, кто должен наследовать, немного нечеткое. Ниже мои базы данных и мои пользователи. Достаточно ли этой информации для оценки реализации?
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
Я знаю, что это старый вопрос, но я постараюсь ответить на него даже сейчас, поскольку мне нужно провести некоторое исследование, связанное с этим.
То, что вы пытаетесь сделать, называется мульти аренды на уровне базы данных. Этого можно добиться двумя способами:
Однако в одном кластере базы данных, как описано в OP, мой личный выбор был бы следующим:
Каждый заказчик получает собственный кластер базы данных. Это мое предпочтительное решение, особенно потому, что я обычно работаю с приложениями, у которых есть большие базы данных для каждого клиента.
Вы также можете использовать комбинацию вышеперечисленного и использовать pgBouncer в качестве маршрутизатора.