【问题标题】:Permissions required to allow arbitrary sql to be executed safely允许安全执行任意 sql 所需的权限
【发布时间】:2011-03-25 15:27:53
【问题描述】:

我想创建一个 SQL 沙箱,允许用户在 PostGIS 数据库中执行任意SELECT 查询。本质上,我想允许用户访问psql 来玩。

如果允许写访问,显然这是一场安全灾难。如何创建一个允许查询数据的系统,但用户没有合理的可能性:

  1. 泄露数据库中的数据
  2. 获得更广泛的服务器访问权限
  3. 使用像 SELECT * from long_table, long_table, long_table, long_table, long_table, long_table, long_table 这样的查询来破坏系统,这将需要一生来执行

请在回答中尽可能具体。

【问题讨论】:

    标签: sql security postgresql sandbox postgis


    【解决方案1】:

    嗯,你真的需要CREATE a ROLE 然后GRANT read only access 明确地处理你想要允许的事情。任何您不同意的事情,他们都不能做(只要他们不是超级用户)。

    如果您已授予只读访问权限并且他们不是超级用户,则他们应该无法获得对底层系统的访问权限。这并不是说您不应该以非特权用户的身份安装 postgres,您应该 - 只是没有必要完成您列出的内容。

    好的,您编辑了您的帖子以包括发出疯狂的查询。我不相信 postgres 目前有办法限制每个用户的查询资源。

    【讨论】:

      【解决方案2】:

      当用户可以执行自己的 SQL 时,无法阻止#3。您需要一个(小型)应用程序来执行预定义的 SQL。在这里甚至 VIEW 都无法帮助您,每个人都可以加入几个视图来削弱您的系统。

      【讨论】:

      • 该死的。我有点希望可能有某种类似于 PAM 在 Linux 上的 limits.conf 的系统,但用于数据库查询......
      【解决方案3】:

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

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

      如果您将其中的某些部分自动化,比如说给人们一个“setup postgres”命令来运行,瞧。

      【讨论】:

        【解决方案4】:

        对于#3,您能否编写一些代码来监控查询活动并使用 postgre 中的系统视图根据某些条件终止您认为疯狂的查询?

        【讨论】:

          【解决方案5】:

          问题 #1 和 #2 是通过明确的 GRANT 和 REVOKE 权限来处理的,正如其他人所指出的那样。

          至于#3,

          ALTER ROLE <rolename> SET statement_timeout = '60000'
          

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

          【讨论】:

          • 它仍然可以杀死你的 I/O,而且它只是一个单一的查询。每分钟触发 1 个查询,您的数据库仍然存在很多问题。
          • 没错,但这至少可以阻止一次性的意外(或只是脑死亡)大量错误查询,这些查询将成为大多数问题。在任何服务器上添加了此设置以使用户能够编写即席查询,我们的问题为零。
          猜你喜欢
          • 1970-01-01
          • 2020-09-04
          • 2020-05-03
          • 1970-01-01
          • 2011-05-09
          • 2018-09-28
          • 2018-02-10
          • 2019-03-01
          • 2018-04-06
          相关资源
          最近更新 更多