【问题标题】:Is it possible to deny access to SQL Server from specific programs?是否可以拒绝特定程序对 SQL Server 的访问?
【发布时间】:2010-05-20 01:12:42
【问题描述】:

目前我们的其中一个数据库(SQL Server 2008)通过多种不同的机制进行访问:.Net SqlClient 数据提供程序; SQL Server 管理工作室;各种 .Net 应用程序和 2007 Microsoft Office 系统(基本上是 Excel)。

我看到在 sys.dm_exec_sessions DMV 中可以看到访问当前会话数据库的程序的程序名称。我的问题是:是否有可能拒绝来自特定命名程序的访问?一等奖将是如果可以对任何命名程序执行此操作,但我们将从能够拒绝所有 Microsoft Office 应用程序(尤其是 Excel)访问此特定数据库中获得很多好处。

【问题讨论】:

  • 你在使用AD认证吗?
  • 只是提醒一下,但不能保证程序名称准确无误,例如,如果您使用 OLEDB 进行连接,您可以使用 ;Application Name=xxxxx 任意设置,这同样适用于 ODBC。
  • 混合模式身份验证 - 最近的东西使用 Windows 身份验证进行连接,但存在大量应用程序等...使用 SQL Server 身份验证进行连接
  • 在 Sybase 和 Oracle 我有一些服务器,我们没有安装 odbc 目录来阻止 ODBC 和 tus Excel - 但是我不确定 ADO.Net 和 SQL Server 可以在没有这些的情况下运行

标签: sql sql-server-2008


【解决方案1】:

不可能,所有相反的说法都是蛇油。

虽然您可以检查应用程序名称并根据此属性创建拒绝登录的登录触发器,但应用程序名称不是安全属性,任何人都可以轻松伪造。 安全性(即拒绝登录)对它的依赖是#fail。

因此,只要您降低门槛并从您的问题中删除“拒绝访问”等术语,就可以在sys.dm_exec_sessions 中提供一个检查会话的program_nameLogon Trigger

CREATE TRIGGER application_limit_trigger
ON ALL SERVER WITH EXECUTE AS '...'
FOR LOGON
AS
BEGIN
IF EXISTS (SELECT *
   FROM sys.dm_exec_sessions
   WHERE session_id = @@SPID
   AND program_name IN (N'Bad Program', N'Worse Program', N'Unmentionable')
    ROLLBACK;
END;

program_name 是由某些应用程序设置的,我不知道是 Office 套件将此属性设置为有用的东西还是将其保留为默认值。您必须了解,任何人都可以通过简单地更改连接字符串中的ApplicationName 属性来规避这种情况。

【讨论】:

  • 感谢您的回答 - 这将完全满足我们目前所需要的,即提供一种临时机制来拒绝来自现有 Excel 电子表格的访问,并帮助我们记录访问的来源,以便我们可以识别这些现有的电子表格,然后转向创建更好的方法来访问这个特定的数据库(基本上是创建 .net 应用程序来替换旧功能)。
  • 我阅读了您的其他帖子,这似乎可以用于它,追踪遗留应用程序和文件并在它们弹出时将其删除。我选择我的(相当粗糙的)措辞只是为了确保两个月内没有其他人回来看到这个答案并说“嘿,我可以用它来保护我的应用程序!”
  • 那是完美的。需要它来拒绝对我们正在替换的一堆旧版应用程序的大规模访问。这有助于我们找到谁在使用它们,因为我们收到了关于它不起作用的电子邮件,我们可以快速更新它们。
  • 此查询缺少右括号。它应该是: IF EXISTS (SELECT * FROM sys.dm_exec_sessions WHERE session_id = @@SPID AND program_name IN (N'Bad Program', N'Worse Program', N'Unmentionable'))
【解决方案2】:

您可以使用的机制是“应用程序角色”。从应用程序连接时,您承担特定角色并且该角色被授予特权。因此,所有应用程序都通过这种机制连接,并且不会为任何未经授权的使用提供 SQL 或 NT 登录信息。

http://technet.microsoft.com/en-us/library/ms190998.aspx

-克里普

【讨论】:

  • 谢谢。我同意作为一个长期解决方案,这可能是我们应该前进的方向。目前我们面临的问题是我们有一组未知的 excel 插件,它们使用一组未知的凭据访问特定的数据库。我们无法禁用凭据,因为这些其他应用程序有效地使用它们进行连接。作为减少公司对 Excel 依赖的更广泛举措的一部分,我们希望转向“没有 Excel 访问数据库”的模式
【解决方案3】:

通常你会反过来。创建一组具有特定访问权限的登录名,然后在相关应用程序中使用这些登录名。

如果您只有一个共享的登录名。那么,这不是一个非常安全的环境,最终每个人都可以访问做他们想做的任何事情。

【讨论】:

    【解决方案4】:

    只是好奇...您为什么不对每个应用程序颁发不同的用户 ID 和密码并以这种方式限制访问?我知道这并不能准确回答您的问题,但我认为这是首选方法。

    【讨论】:

    • 但是如果用户使用其中一个批准的程序和 Excel 会发生什么?你如何只做一件作品
    • @Mark:你没有。服务器不关心什么应用程序正在访问它。它只关心用户是什么以及他们的访问权限是什么。为什么要停止excel?
    • 因为那是 OP 的问题。我看到 Excel 中的 ODBC 访问锁定了其他应用程序
    • @Mark:不知怎的,我把你和 OP 搞混了。;)
    • 我在生产中看到了这个问题 - 用户可以使用 Excel 创建可以执行任意 SQl,包括 a) 在 odbc 锁定表下和 b) 占用大量服务器 CPU 的大量交叉连接。虽然应用程序可以限制查询
    【解决方案5】:

    如果您想通过应用程序限制用户访问,请使用 SSPI。

    如果您只想限制应用程序,请使用 SQL Server 模拟并为此应用程序创建一个帐户。

    这样,一旦您不再希望此应用程序访问您的服务器,您只需将其从角色中删除即可。

    假设您创建了一个特定于应用程序等的角色。

    【讨论】:

      【解决方案6】:

      确切了解您为什么要这样做可能会有所帮助。我假设这不是出于安全原因,因为任何此类方案都很容易规避。

      您是否担心 Excel 和其他应用程序消耗过多的服务器资源?如果是这样,请查看 SQL Server 2008 中添加的 Resource Governor 功能。基本思想是创建一个函数将新会话分类为组,然后将这些组与内存或 CPU 使用率(或两者兼有)的资源池相关联) 可以在发生争用时受到限制。

      【讨论】:

      • 这是减少整个组织对 Excel 使用的依赖以及满足某些已经生效的合规性法规的更广泛计划的一部分。我们面临的主要问题是我们无法清楚地说明当前访问数据库的电子表格集是什么(大型组织、许多站点等......)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多