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

ans*_*elm 5 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

我不希望最后一步成功.u2没有在db1上获得任何权限,并且在查询数据库或模式时也没有显示任何权限.根据我的理解,u2可以在db1上创建表,因为公共模式和内置公共角色的默认权限.如果我想撤销它们,我只能在数据库上这样做,但不能在模式上这样做,因为它是由postgres拥有的.所以最终我必须为我所创建的每个新数据库撤销超级用户的权限.我不能将它委托给数据库的所有者,我也不能忘记为每个新数据库执行此操作.

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

我怎样才能修复这些不安全的默认值?

ara*_*nid 5

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

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


kbu*_*ien 5

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

PostgreSQL数据库中的总安全性