我目前正在编写一个web应用程序,它将主要由开发人员使用,我认为(从个人经验来看)有时可以方便地以不受限制的方式运行自定义搜索。我想让我的用户对他们的个人数据运行任意的多语句sql搜索(额外收费),这样他们就可以检索到与他们当时的问题相关的数据。
显然,这是一件需要非常谨慎的事情,所以我想确定我会以正确的方式来解决这个问题。
在我看来,主要的关注点是:
恶意用户可以运行DoS(可以通过日志记录跟踪此操作并删除其权限)
有人可以恶意运行函数
有人可以访问/修改不属于他们的数据(包括数据库架构)
有人可以在查询中删除或修改数据(我希望他们以受控的方式这样做)
向用户安全地提供这种能力最安全的方法是什么?
最佳答案
这是一个危险的领域(我强烈建议你仔细权衡这一要求,因为你将面临明显的危险),但是如果你必须这样做,我会尽量给你最安全的方法。
我在这里所做的唯一假设是,您运行的是当前版本的postgresql,并且需要用户远程连接到服务器(使用他们自己的工具)来执行他们的自定义查询。即使他们将把它们输入到一个网页中,只要他们各自有一个单独的数据库服务器用户登录,大多数相同的技术仍然适用。
首先(正如nobugs所指出的),为了防止用户执行明显的恶意语句(如更新、删除、删除等),您需要确保连接到服务器的用户帐户只对他们应该能够读取的数据库和表具有选择权限。查看手册,了解如何为用户定义角色,并授予这些角色特定的权限。
http://www.postgresql.org/docs/9.0/static/user-manag.html
http://www.postgresql.org/docs/9.0/static/database-roles.html
请注意,您只能将用户限制在特定的表内。如果
每个用户都需要被赋予访问表的不同部分的权限,然后
postgresql(和几乎所有的dbms)都不支持
盒子。您唯一的选择是尝试创建某种sql/tcp
拦截请求并以某种方式修改它们以限制
查询结果,然后传递到数据库服务器。这会是
即使对于一个非常有经验的开发人员来说也是非常困难的!
为了防止(或至少检测到)DoS攻击,您需要一个外部脚本或进程每隔几秒钟监视一次数据库(和/或整个服务器)的资源使用情况,如果PostgreSQL服务已达到最大值,则可能需要构建一种机制来重新启动它。
你需要试验多久才能介入
小心,因为对max进行合法查询是完全可能的
就几秒钟。
正如您所提到的,您需要仔细记录谁在试图执行什么,如果需要,您可以从失败中逆向工作,找出罪魁祸首。您只能依赖系统日志来完成此操作,系统日志可以配置为写入文件、csv或syslog。
我建议你预先创建一些工具来帮助你快速搜索
这些日志可以在你需要找到之前找到你需要的东西
(双关语)。
最后,您还应尝试遵循管理和安全方面的其他标准最佳实践(所有这些都可以在手册中找到),包括:
只允许您的用户从特定的IP/主机访问(不要给公众任何机会连接到您的服务器)。您的客户需要静态IP才能访问系统,但这确实值得考虑以降低风险。
密切关注服务器的所有标准管理任务(特别是备份、磁盘空间、日志文件维护、索引使用等)