有没有办法阻止用户在Postgresql数据库中执行批量条目

时间:2011-08-01 09:32:36

标签: database postgresql access-control

我有4个新的数据输入用户使用特定的GUI来创建/更新/删除主数据库中的条目。 “GUI”客户端允许他们在地图上查看数据库记录并在那里进行修改,这是很好的首选方式。

但是最近很多人一直在使用PGAdmin直接访问本地数据库并运行批量查询(即更新,插入,删除等),这会引入很多问题,例如人们在设置值时不知道或犯错误更新大量记录。它也会影响我们的记录程序,因为我们正在计算报告目的的平均值和时间戳,这对我们来说非常重要。

有没有办法阻止用户使用PGAdmin(请记住很多这些人在家工作,我们无法访问他们的机器)并直接在数据库中运行SQL查询。

我们仍然必须允许他们访问某些表并允许他们执行sql,只要它来自某个客户端,但当他/她尝试直接在db中执行查询时拒绝访问同一用户。

5 个答案:

答案 0 :(得分:1)

控制对数据库的访问的唯一有效方法是将db访问方法转换为3层结构。您应该构建一个中间件(可能是一些其他API或类似的东西)并从您的应用程序中使用此API。数据库应隐藏在此中间件后面,因此无法直接访问。从数据库的角度来看,没有办法判断一个数据库连接是来自您的应用程序,还是来自其他一些工具(pgadmin,简单的psql或某些自定义构建客户端)。您的数据库只能从可信主机访问,客户端不应该有权访问这些主机。

答案 1 :(得分:0)

这只有在你使用技巧时才有可能(这可能也会被利用,但也许你的用户并不聪明)。

在您的客户端应用中设置一些无害的参数,例如geqo_pool_size = 1001(如果通常为1000)。

现在编写一个触发器,检查是否设置了此参数并输出"无法通过PGAdmin"如果未在您的应用中设置此参数(并且用户名不是您的管理员用户名)。

替代方案:创建临时表并检查其存在。

答案 2 :(得分:0)

我相信您应该阻止对数据库的直接访问,并设置您的客户端(人类和软件)能够连接的应用程序。

让此应用程序过滤并仅传递允许的命令。

过滤时应该非常小心 - 我会仔细考虑是否允许原始SQL。就个人而言,我会设计一些简化的API,这将使我确信假设的客户端攻击者(我们信任的上帝,我们监视的所有其他人)将无法找到隐藏某些危险修改的方法。

我认为从安全角度来看,您当前的方法非常不安全。

答案 3 :(得分:0)

您应该学习高级pg_hba.conf settings

此文件是使用授权的关键点。基本设置仅表示密码和IP列表等简单的身份验证方法,但您可以使用更高级的解决方案。

  • GSSAPI
  • 的Kerberos
  • SSPI
  • Radius服务器
  • 任何pam方法

因此,您的官方客户端可以使用更高级的方法,例如使用第三层API的somthing,一些非常复杂的身份验证机制。然后,在不使用应用程序的情况下,至少很难重做这些任务。例如,如果kerberos密钥在您的客户端中加密。

答案 4 :(得分:0)

您要做的是撤消您的用户写访问权限,然后创建具有写访问权限的新角色,然后将此角色设置为定义为SECURITY DEFINER的CREATE FUNCTION,它以您允许的完整性检查方式更新表,然后GRANT EXECUTE为您的用户访问此功能。

ServerFault上有关于此主题的答案,其中详细说明了以下blog entry

我认为使用中间件作为其他答案表明在你的情况下是不必要的过度杀伤力。上述解决方案不要求用户改变他们访问数据库的方式,只是限制他们仅通过预定义的服务器端方法修改数据的权利。