问题基本上归结为:如何在postgres上安全地创建新数据库,这意味着默认情况下,没有人对新数据库拥有任何权限,并且必须明确定义所有访问权限。
我尝试了互联网上的各种资源,但无法得到明确的答案。我在fedora 17 linux上使用postgres 9.1尝试了这个,但最终会在redhat 6.3上使用postgres 8.4。
过程:
我不希望最后一步成功。 u2没有在db1上获得任何权限,并且在查询数据库或模式时也没有显示任何权限。根据我的理解,u2可以在db1上创建表,因为公共模式和内置公共角色的默认权限。如果我想撤销它们,我只能在数据库上这样做,但不能在模式上这样做,因为它是由postgres拥有的。所以最终我必须为我所创建的每个新数据库撤销超级用户的权限。我不能将它委托给数据库的所有者,我也不能忘记为每个新数据库执行此操作。
默认设置允许每个用户在任何新数据库中垃圾邮件公共模式。这很危险,因为其他用户可能默认使用公共模式而不检查表是否已存在,只使用某个陌生人拥有的现有表。
我该如何解决这些不安全的默认设置?
答案 0 :(得分:5)
您可以撤消template1
数据库中的公共模式“创建”权限,默认情况下会将其传播到任何新创建的数据库:通过复制template1
(或其他一些数据库)创建数据库数据库标记为模板,但template1
是默认值。
实际上,您可能希望在这种情况下完全删除public
架构,并在将作业(如果需要)创建给数据库所有者时委派作业。
答案 1 :(得分:5)
当我需要一个安全的数据库时,我使用了这篇文章: