如何安全地让用户使用(Postgresql?

时间:2014-08-12 02:23:53

标签: c# sql postgresql security

我目前正在编写一个主要由开发人员使用的网络应用程序,我认为(根据个人经验)有时候以不受限制的方式运行自定义搜索会很方便。我想让我的用户对他们的个人数据进行任意多语句SQL搜索(需要额外付费),这样他们就可以检索当时与他们的问题相关的数据。

显然,这是需要非常谨慎的事情,所以我想确保我能以正确的方式解决这个问题。

我认为,主要关注点是:

  • 恶意用户可以运行DOS(可以通过记录并删除其权限来跟踪)
  • 有人可能以恶意方式运行某项功能
  • 有人可以访问/修改不属于他们的数据(包括数据库架构)
  • 有人可以删除或修改查询中的数据(我希望他们以受控方式执行此操作)

最安全的方法是如何安全地为用户提供这种能力?

2 个答案:

答案 0 :(得分:9)

这是危险区域(我强烈建议您仔细权衡此要求,因为您将面临明显的危险),但我将尽力为您提供最安全的方式如果你必须的话。

我在这里做的唯一假设是你正在运行当前版本的PostgreSQL,并且你需要用户远程连接到服务器(使用他们自己的工具)来执行他们的自定义查询。即使他们将他们输入到网页中,只要他们每个人都有一个单独的用户登录数据库服务器,大多数相同的技术仍将适用。

首先,(正如NoBugs所指出的)为了防止用户执行明显的恶意语句(如UPDATES,DELETES,DROPS等),您需要确保连接到服务器的用户帐户只对数据库具有SELECT权限和他们应该能够阅读的表格。查看手册以了解如何为用户定义角色,并为这些角色授予特定权限。

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服务的机制。

  

您需要先进行实验,然后再进行干预   仔细,因为合法查询很可能达到最大值   事情几秒钟。

如你所说,你需要仔细记录谁试图执行什么,&如果有的话,如果有必要,你可以从失败中倒退,找出罪魁祸首。实际上,您只能依赖系统日志,可以将其配置为写出文件,CSV或Syslog。

  

我建议您预先创建一些工具来帮助您快速搜索   这些日志可以在您需要尝试找到之前找到所需的内容   (双关语)。

最后,您还应该尝试遵循其他标准的管理和安全最佳实践(所有这些都可以在手册中找到),包括:

  • 仅允许来自特定IP /主机的用户访问(不要让公众有机会连接到您的服务器。您的客户将需要静态IP来访问系统,但这当然值得考虑降低风险。< / LI>
  • 密切关注服务器的所有标准管理任务(尤其是备份,磁盘空间,日志文件维护,索引使用等)。

答案 1 :(得分:0)

确保用户sql正在运行,因为只有用户应该能够修改的表/文件的权限。

还有一些其他注意事项 - 只允许可信输入(可能在api调用中使用https?)并且知道Mysql可以访问您不想让它访问的文件和内容。

另请参阅:http://www.greensql.com/article/protect-yourself-sqli-attacks-create-backdoor-web-server-using-mysql