对PostgreSQL中statement_timeout变量的严格控制

问题描述 投票:1回答:2

有人知道如何限制用户设置变量的能力吗?特别是statement_timeout?

无论我是否更改用户以将此变量设置为分钟,或者是否在postgresql.conf文件中将其设置为分钟,用户始终可以仅键入SET statement_timeount TO 0;完全禁用该会话的超时。

有人知道阻止这种情况的方法吗?我知道某些变量只能由超级用户更改,但我无法弄清楚是否有一种方法可以强制将其变为那些受控变量之一。或者,是否有办法将SET撤消其角色?

在我的应用程序中,此变量用于限制随机用户(用户注册对公众开放)使用(接近)无限查询占用所有CPU时间的能力。如果他们可以禁用它,则意味着我必须找到一种新方法来限制用户的资源。如果没有方法可以保护此变量,那么您是否可以建议其他方法来实现该目标?

编辑2011-03-02数据库向公众开放并允许使用任意SQL的原因是因为该项目是针对直接在数据库中玩的游戏。每个玩家都是数据库用户。数据被锁定在视图,规则和触发器后面,CREATE被公开撤消,并且扮演角色以防止对模式进行大多数更改,并且删除pg_proc上的SELECT以保护对游戏敏感的功能代码。

这不是我向全世界开放的一些关键任务系统。这是一个奇怪的概念证明,试图对数据库进行异常信任,以试图在其中维护整个CIA安全三角关系。

感谢您的帮助,摘要

security postgresql cpu-usage
2个回答
1
投票

没有办法覆盖它。如果允许用户运行任意SQL命令,那么无论如何,更改statement_timeout只是冰山一角...如果您不信任用户,则不应让他们运行任意SQL-或接受他们可以运行,好,任意SQL。并使用某种外部监视器来取消查询。


0
投票

基本上,您不能在普通的postgres中执行此操作。为了实现目标,您可以使用某种类型的代理并重写/禁止某些查询。

有几种解决方案,例如:

  1. [db-query-proxy-article出生方式(俄语)。
  2. BGBouncer + pgbouncer-rr-patch

最后包含非常useful examples,在Python上非常简单:

import re
def rewrite_query(username, query):
    q1="SELECT storename, SUM\(total\) FROM sales JOIN store USING \(storeid\) GROUP BY storename ORDER BY storename"
    q2="SELECT prodname, SUM\(total\) FROM sales JOIN product USING \(productid\) GROUP BY prodname ORDER BY prodname"
    if re.match(q1, query):
        new_query = "SELECT storename, SUM(total) FROM store_sales GROUP BY storename ORDER BY storename;"
    elif re.match(q2, query):
        new_query = "SELECT prodname, SUM(total) FROM product_sales GROUP BY prodname ORDER BY prodname;"
    else:
        new_query = query
    return new_query
© www.soinside.com 2019 - 2024. All rights reserved.