Postgresangular色最佳实践实施

伙计们,

我可以使用你的帮助,使我的Postgres用户访问控制devise更好,更符合最佳实践。 我正在帮助推出一个小型的Postgres服务器,但我不是一个数据库pipe理员,所以我知道这样做很危险。

有一台服务器安装了Postgres v9.2。 这个安装托pipe多个数据库,每个数据库完全服务于不同的“客户”。 换句话说,customer1不会,不应该使用database2,等等。 在正常的操作过程中,数据库被一个匹配的CakePHP实例所访问,它们全都与Postgres共同位于同一台服务器上。 尽pipe可能会对此部署进行优化,但我最感兴趣的是Psqlangular色。

根据我所读到的,似乎有三种angular色是合理的:

  • 超级用户postgres与非默认密码
  • 不具有超级用户权限的pipe理员angular色,用于日常维护,数据库创build,备份,还原。 应该能够对所有的客户数据库做任何事情。
  • 用户angular色只能在各自的数据库中进行CRUD。 如果清理实施,可以容忍他们自己DB的更多权利。

实现这个devise是我不那么自信的地方。 数据库和表的所有权以及谁应该从谁那里inheritance谁是有点泥泞。 以下是我的数据库和我的用户。 有足够的信息来评估实施吗?

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. 在一个单一的数据库集群中,有些OP是如何描述的,然而,我个人的select是这样的:

    • postgres用户使用同行authentication,不允许密码连接。 MD5authentication,在我看来,是一个不好的做法。 如果你遇到任何数据库一致性或这种事情的麻烦,你仍然可以login,如果你让postgres使用同行authentication。
    • 每个客户应该得到自己的模式,而不是数据库。 这有几个原因:
      • 拥有整个数据库将授予许多特权。
      • 只拥有特定的表格会给开发人员带来麻烦,并且总是要求pipe理员添加权限和内容。
      • 因此,在一个正常的设置中,他们每个人都可以在模式中创build事物,包括表,视图,触发器等等。
      • 他们都使用相同的连接string,除了用户名。 在postgres中,默认情况下,如果你有一个用户名的模式,它会自动在你的search_path中。
    • 我会select不具有能够访问每个模式的pipe理员用户作为安全措施。 您应该通过使用自己的用户转储每个模式或使用PostgreSQL的PITR技术来进行备份。 你仍然需要使用postgres用户来创build新的模式,我会去为一个sudo规则和脚本。
    • 许多安全良好的做法build议删除默认架构,所以 – 我们走了。
    • 如果每个客户的数据库都很小,而且您有大量的客户,那么这种解决scheme是非常适合的。
    • 如果您的应用程序处理多租户,则可以为所有客户使用单个连接池。 当然,这消除了上述许多安全增强function,但可能会带来性能上的好处,特别是当您拥有大量客户时(如果您拥有500-1000个独立数据源,并且使用连接池,则会非常令人难以置信)。
  2. 每个客户都有自己的数据库集群。 这是我首选的解决scheme,尤其是因为我通常使用每个客户都拥有大型数据库的应用程序。

    • 这一个带来非常好的数据分离。 您可以为每个客户使用单独的存储卷,分配CPU和内存限制(使用docker?)。
    • 在每个客户需要的情况下,他们的灵活性非常好。 它们可以是相似的或具有不同的特征。
    • 非常容易在两个方向上调整(上和下)。
    • 我还使用单独的虚拟IP,其中每个群集侦听连接,使扩展到不需要数据源重新configuration。
    • PITR备份是针对每个客户的,因此与每个模式的多租户相比,恢复单个客户将更容易。
    • 在复杂的设置,每个客户可能需要多个数据库,模式,用户和angular色等,所以这是一个更好的解决scheme在这些情况下。

您也可以使用上述的组合,并使用pgBouncer作为路由器。