允许任意SQL安全执行所需的权限

问题描述:

我想创建一个SQL沙箱,允许用户在PostGIS数据库中执行任意SELECT查询。基本上,我想让用户访问psql来玩。允许任意SQL安全执行所需的权限

显然这是一个安全灾难,如果允许写入访问。我怎样才能建立这样的查询数据是系统中允许的,但有一个用户的合理可能性:

  1. 数据库
  2. 获得对服务器
  3. 削弱了系统的更广泛的访问损害数据像SELECT * from long_table, long_table, long_table, long_table, long_table, long_table, long_table这样的查询将花费一生的时间来执行

请在您的答案中尽可能具体。

问题#1和#2通过其他人已经注意到的权限的显式GRANT和REVOKE来处理。

至于#3,

ALTER ROLE <rolename> SET statement_timeout = '60000' 

一直工作很适合我。这将终止执行时间超过1分钟(60000毫秒)的任何​​查询。我们在phpPgAdmin中有几个用户编写的查询导致问题后发现了这个...

+1

它仍然可以杀死你的I/O,它只是一个单一的查询。每分钟启动一次查询,您的数据库仍然有很多问题。 – 2010-08-05 14:45:17

+0

确实如此,但这至少可以阻止一次性意外(或者仅仅是脑死亡)的严重不良查询,这些问题将成为大部分问题。我们在任何已将此设置添加到能够编写即席查询的用户上的服务器上没有其他问题。 – 2010-08-05 15:53:51

那么你只是真的需要CREATE a ROLE然后GRANT read only access显式地给你想要的东西。任何你不授予的东西,他们不能做(只要他们不是超级用户)。

如果您已授予只读访问权限,但他们不是超级用户,则他们无法访问底层系统。这并不是说你不应该将postgres安装为非特权用户,你应该 - 简单地说,不应该有必要完成你列出的内容。

好的,你编辑你的文章,包括发布疯狂的查询。我不相信postgres目前有办法限制每个用户的查询资源。

当用户可以执行他自己的一段SQL时,无法防止#3。您需要一个执行预定义SQL的(小型)应用程序。即使VIEW也无法帮助你,每个人都可以加入一些观点来削弱你的系统。

+0

该死的。我有点希望可能会有某种与PAM的limits.conf类似的系统,但对于数据库查询... – fmark 2010-08-05 07:03:25

您可以将postgres安装为非特权用户,并以此方式运行。通过这种方式,您可以利用现有的系统权限来限制用户可以对数据库执行的操作,包括将他们的访问权限隔离到他们自己的数据库。请参阅本页面底部的说明:

http://www.postgresql.org/docs/current/interactive/tutorial-start.html

如果您自动的此某些部分,说会给人一种'设置Postgres的命令来运行,瞧。

对于#3,你可以编写一些代码来监视查询活动并根据某些标准使用postgre中的系统视图来杀死那些你认为是疯狂的查询?