民间,
我可以借助您的帮助使我的Postgres用户访问控制设计更好,并与最佳实践保持一致。我正在帮助推出一个小型生产Postgres服务器,但我不是数据库管理员,所以我知道足够危险。
一台服务器安装了Postgres v9.2。此安装托管多个数据库,每个数据库完全服务于不同的“客户”。换句话说,customer1不会,不应使用database2,依此类推。在正常操作期间,每个数据库都由一个匹配的CakePHP实例进行访问,这些实例均与Postgres位于同一服务器上。尽管可能会对这种部署进行优化,但我对Psql角色最感兴趣。
根据我的读物,似乎三种类型的角色是有意义的:
- 具有非默认密码的超级用户postgres
- 不具有用于日常维护,数据库创建,备份和还原的超级用户特权的管理员角色。应该能够对所有客户数据库执行任何操作。
- 仅具有在各自数据库中进行CRUD的能力的用户角色。如果清理实现,则可以容忍他们自己的DB拥有更多权限。
实施该设计使我信心不足。数据库与表的所有权以及谁应该继承谁的所有权有些混乱。以下是我的数据库和用户。是否有足够的信息来评估实施?
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
1
以我的经验,最好的分离方式还带来了很多其他优点,那就是为每个客户运行单独的PostGreSQL群集(例如服务)。这就是我们当前在大型生产环境中正在做的事情,除非数据库的数量变得很大并且每个数据库都非常小,否则我不会做任何不同的事情。当然,应用程序还需要知道如何为每个租户(客户)连接到不同的数据源。
—
FlorinAsăvoaie15年
在@FlorinAsăvoaie旁边的话。每个数据库都不应该有自己的所有者用户和查询用户吗?这样可以更轻松地将某些用户置于密码库中以进行维护。
—
hspaans 2015年