5

问题基本上归结为:如何在 postgres 上安全地创建新数据库,这意味着默认情况下,没有人对新数据库拥有任何特权,并且必须明确定义所有访问权限。

我尝试了互联网上的各种资源,但无法得到明确的答案。我在带有 postgres 9.1 的 fedora 17 linux 上尝试过这个,但最终会在带有 postgres 8.4 的 redhat 6.3 上使用它。

过程:

  1. 安装 postgres,运行 initdb,启动服务器
  2. 与 postgres 超级用户在本地连接
  3. 使用选项 createdb 和 createrole 创建新用户 u1
  4. 断开并重新连接为 u1
  5. 创建数据库 db1
  6. 创建用户 u2
  7. 断开并重新连接为 u2
  8. 在 db1 中创建表 t1

我不指望最后一步会成功。u2 没有在 db1 上获得任何特权,并且在查询数据库或模式时也没有显示任何特权。据我了解,由于公共模式和内置公共角色的默认权限,u2 可以在 db1 上创建表。如果我想撤销它们,我只能在数据库上这样做,但不能在架构上这样做,因为它归 postgres 所有。所以最终我必须为我创建的每个新数据库都用一个超级用户撤销这些权限。我不能将它委托给数据库的所有者,而且我不能忘记对每个新数据库都这样做。

默认值将允许每个用户在任何新数据库中向公共模式发送垃圾邮件。这很危险,因为默认情况下其他用户可能在公共模式上工作,而不检查表是否已经存在,而只是使用某个陌生人拥有的现有表。

我该如何解决这些不安全的默认设置?

4

2 回答 2

5

您可以撤销template1数据库中的公共架构“创建”权限,默认情况下这将传播到任何新创建的数据库:数据库是通过复制创建的template1(或其他一些标记为模板的数据库,但这template1是默认设置)。

实际上,您可能希望public在这种情况下完全删除模式,并将创建它的作业(如果需要)委托给数据库所有者。

于 2012-10-26T13:05:57.600 回答
5

当我需要安全数据库时,我使用了这篇文章:

PostgreSQL 数据库中的全面安全性

于 2012-10-26T13:46:40.857 回答