postgres公共架构的不安全默认值?

时间:2012-10-26 12:39:52

标签: security postgresql

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

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

过程:

  1. 安装postgres,运行initdb,启动服务器
  2. 本地连接postgres超级用户
  3. 使用optionsb和createrole创建新用户u1
  4. 断开连接并重新连接为u1
  5. 创建数据库db1
  6. 创建用户u2
  7. 断开连接并重新连接为u2
  8. 在db1中创建表t1
  9. 我不希望最后一步成功。 u2没有在db1上获得任何权限,并且在查询数据库或模式时也没有显示任何权限。根据我的理解,u2可以在db1上创建表,因为公共模式和内置公共角色的默认权限。如果我想撤销它们,我只能在数据库上这样做,但不能在模式上这样做,因为它是由postgres拥有的。所以最终我必须为我所创建的每个新数据库撤销超级用户的权限。我不能将它委托给数据库的所有者,我也不能忘记为每个新数据库执行此操作。

    默认设置允许每个用户在任何新数据库中垃圾邮件公共模式。这很危险,因为其他用户可能默认使用公共模式而不检查表是否已存在,只使用某个陌生人拥有的现有表。

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

Total security in a PostgreSQL database