防止用户删除 SQL 数据

防止用户删除 SQL 数据

我们刚刚购买了一个程序,该程序要求用户在 MS SQL 服务器上拥有一个帐户,并具有对该程序数据库的读/写访问权限。

我担心的是,由于这些用户现在具有数据库的写权限,他们可以直接连接到程序客户端之外的 SQL 服务器,然后直接在表中处理数据。

有什么方法可以阻止访问数据库,但仍然允许通过客户端程序访问?

编辑:SQL 2008 Express,如果需要可以升级到 SQL 2008 R2 Standard。

每个工作站都需要访问权限,以便人们记录他们的工作时间/日程安排。工作站被锁定,因此没有人拥有 osql、studio manager 或类似的东西。但是他们可以设置 ODBC 数据源,然后通过 Excel/Access 进行连接。

现在想想,数据混乱不再是更大的问题,存在的是隐私问题,因为每个人的工资率等都将在这个系统中。

我同意这是一个非常糟糕的设计。

答案1

不可以。如果用户具有对数据库的读/写访问权限,并且能够不使用程序连接到数据库,那么他们可以执行类似操作UPDATE sometable SET attribute = NULL;并破坏您的数据集,或者进行任何他们想要的任意更改。

不幸的是,SQL 权限无法表达有访问权限的人所做的正常更改与恶意更改的概念,并且我怀疑拒绝他们更新记录的权限会有些弄巧成拙。

与 Joel 的评论非常相似,如果这是您环境中的一个问题,我会要求退款。请经常备份和记录 ;)

如果您有办法防止不使用该应用程序的登录(例如,通过限制与单一源的连接,如果您的应用程序通过终端服务或 citrix 运行),您绝对可以使用它来提高安全性。

答案2

我在这件事上有点晚了,我同意你应该把责任推到应用程序的开发人员身上,我会把我的担忧写下来,让有政治权力的人了解风险,但我希望能给你更多的选择。

如果我真的陷入困境,我会考虑为 LOGON 事件创建一个触发器。在触发器中,我会找到一种方法来区分我所说的“合法”登录和“非法”登录,并阻止非法登录完成。合法登录将是使用正确应用程序连接到正确数据库的用户,以及您可能需要的任何管理登录、工作登录等。我在写这篇文章时会非常小心,因为这似乎是将自己锁定在服务器之外的好方法。BOL 说 LOGON TRIGGERS 在 SQL 2008 中可用,我很确定它们在 Express 中可用。

这种策略的问题在于,您可能会发现自己在玩“打地鼠”游戏,您排除了 Excel 和 Access,然后有人想出了如何编写一个允许他们进入的快速 vb.net 应用程序,然后您阻止了它,然后有人修改了连接字符串以更改应用程序名称等。您的用户知识越丰富,阻止他们就越困难。如果您有开发人员,他们可能会将其视为挑战。我想说,任何积极尝试绕过安全控制的人(即使这些控制并不完美)都是问题。(如果我锁上家里的纱门,很明显我不想让任何人进来。如果有人用小刀划破纱门并闯进来,他们肯定做错了什么。)

另一件事是简单地对 DMV 运行查询,以查找不遵守规则的用户。您可以从系统 DMV 中获取用户、主机和应用程序名称信息。如果您定期(大约每分钟一次)运行查询并将结果保存在表中,您可以每天(或每周)查看一次,然后去严厉批评违规者。或者让 HR 来做这件事。

另一个要尝试的方法是,如果您有任何可以查找和报告长时间运行的查询的东西,那么您可以查找“奇怪”的查询。实际上,我在查看问题查询的日志时发现有人做了某件事。通常,四处寻找的缺乏经验的用户会运行低效的查询,这些查询要么读取大量数据,要么导致长时间阻塞。有时,如果应用程序在编写查询的方式上具有某种明确的“风格”,您可以挑选出由其他人(或某物)编写的查询。换句话说,举一个非常牵强的例子,以下两者之间存在很大差异:

从薪水中选择 * 其中员工 = “我”

从薪水订单中选择 * 按薪水金额

总结:修复应用程序是最好的办法。阻止登录也许可以。事后寻找违规者可能是你唯一能做的。

相关内容