有没有办法防止用户在Postgresql数据库中进行批量输入?

5

我有四个新的数据录入用户,他们使用特定的GUI来创建/更新/删除我们主数据库中的条目。 "GUI"客户端允许他们在地图上查看数据库记录并进行修改,这是一个很好且受欢迎的方式。

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

那么,有没有一种方法可以防止用户使用PGAdmin(请记住,其中很多人在家工作,我们无法访问他们的机器)并直接在数据库中运行SQL查询。

我们仍然需要给他们访问某些表的权限,并允许他们执行SQL,只要它是通过特定客户端进行的,但是当他/她尝试直接在数据库中执行查询时,同一用户将被拒绝访问。

5个回答

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

在他描述的非常简单的应用程序中,添加中间件层是不必要的复杂性。在这种情况下,仅通过授予对特定服务器端方法的访问来控制访问已经足够了。 - Jiri Klouda

0
你需要做的是撤销用户的写入权限,然后创建一个新的角色并授予写入权限。接着,以该角色身份创建一个定义为安全定义者的函数,该函数通过完整性检查以允许你所允许的方式更新表格,最后将该函数的执行权限授予给你的用户。
ServerFault上有一个关于此主题的答案,其中引用了以下详细描述的博客文章
我认为,在你的情况下,使用中间件是不必要的过度杀伐之举。以上解决方案不需要用户改变他们访问数据库的方式,只需限制他们仅通过预定义的服务器端方法修改数据的权利即可。

0

只有使用一个技巧才能实现这一点(这个技巧可能也会被利用,但也许你的用户不够聪明)。

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

现在编写一个触发器,检查是否设置了此参数,并在此参数未像从您的应用程序中设置(且用户名不是您的管理员用户名)时输出“无法通过PGAdmin访问”。

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


1
这是一种“安全通过混淆”的解决方案,严格禁止在生产环境中使用。 - Alex Laskin
如果他的限制是用户必须知道她的PG凭据,你会如何做?没有中间件? - Daniel
1
在我看来,如果有人想要开枪打自己的腿,你不应该建议他更好的方法去做这件事。你应该向他解释这个想法有多糟糕。在99%的情况下,直接连接数据库都是一个坏主意。 - Alex Laskin

0

我认为您应该阻止直接访问数据库,并设置一个应用程序,使您的客户(人类和软件)能够连接。

让这个应用程序过滤并传递只允许的命令。

在过滤方面应该非常小心 - 我会仔细考虑是否完全允许原始SQL。就我个人而言,我会设计一些简化的API,以确保假设的客户端攻击者(我们相信上帝,其他人我们监控)不会找到任何潜在的危险修改方式。

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


0

你应该学习高级的pg_hba.conf设置

这个文件是使用授权的关键点。基本设置只涉及简单的身份验证方法,如密码和IP列表,但你可以有一些更高级的解决方案。

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

因此,你的官方客户端可以使用更高级的方法,比如第三层API,一些非常复杂的身份验证机制。如果Kerberos密钥在你的客户端中被加密,那么即使不使用应用程序,重新执行这些任务也至少会变得困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接