【问题标题】:Recognize application connected to SQL Server 2005识别连接到 SQL Server 2005 的应用程序
【发布时间】:2010-11-14 07:32:34
【问题描述】:

我想知道连接到数据库并执行 SP 的应用程序。
(我想将 SP 执行限制为仅我的应用程序 - 所有其他应用程序 - 例如 MS SSMS 将被忽略)

那么有没有办法找出连接的客户端名称?

如果不是,您可能还有其他建议如何确保仅使用专用应用程序 (应用正在使用 Windows 的集成安全性)

编辑:我要解决什么问题:

我正在开发内置应用用户权限和角色模块。
因此,应用程序从数据库(通过 SP)接收所有字段,然后业务逻辑决定为哪个用户显示(或不显示)什么。

我担心更有经验的用户:他可以运行自己的应用程序,连接到数据库并忽略所有安全限制。
这就是为什么我希望你确保 DB 只与这个应用程序对话。

连接字符串参数是一些解决方案,但很容易嗅出 - 我想知道是否还有其他选择

【问题讨论】:

  • 你真正想解决什么问题?

标签: .net sql-server sql-server-2005 security


【解决方案1】:

唯一可以在 Windows 上进行身份验证的是 用户。没有安全方法来确定应用程序的身份。因此,任何限制对特定应用程序访问的尝试都可能被有足够积极性的攻击者击败。

您可以通过添加 logon trigger 来保持意外登录的真实性。在触发器中,您可以从连接字符串中检查声明的“应用程序名称”,如果不是,则关闭连接。这将阻止有人意外连接到您的服务器。但是,它不会阻止有动机的管理员访问数据,因为应用程序名称可能会被欺骗。此外,如果您有任何类型的管理和维护任务,管理员和维护任务需要访问您的数据库。

更好的方法是通过approle 控制对数据的访问。 approle 允许访问应用程序,您仍将使用自定义应用程序逻辑来进行内容管理限制(“列”限制和您引用的其他限制)。这将略微提升标准,以便只有您的应用程序可以修改和访问数据。它会阻止非管理员访问您的数据,但特权管理员将(始终)能够为所欲为。

最后,部署加密还有更高的门槛。需要一个真正坚定的管理员才能超越这一点,并且需要一个管理员必须采取特定步骤来找出您的密钥密码,他不会意外发现它们。正如我所说,专门的管理员将始终能够访问您的数据。

另一种方法是不部署任何屏障,而是使用审计来监控数据。可以在 SQL Server 中进行防篡改审计,并且宣传审计通常具有足够强大的威慑力。

【讨论】:

    【解决方案2】:

    应用名称可以是连接字符串的一部分,但可以被欺骗。如果您需要强制执行此操作,那么我将抽象对应用服务器的数据访问,并通过此从客户端进行数据访问(可能使用 Web 服务)。然后,您的应用服务器可以使用已知帐户与服务器通信(作为“受信任的子系统”),并且各个客户端实际上 需要 访问数据库(win:win,尤其是当涉及防火墙时)。

    就我个人而言,无论如何,我倾向于将此作为我的默认模型......它从一开始就增加了很多未来的可扩展性,并且很难在事后添加。

    【讨论】:

      【解决方案3】:

      您是否考虑过在 SQL Server 中使用 Application Roles

      您可以将所有必要的权限仅授予应用程序角色,并且数据库登录将只是 Public 的成员,没有其他权限。这样,即使有人通过 Management Studio 或其他直接连接获得访问权限,他们也无法在不知道应用程序角色凭据的情况下在您的数据库中执行任何操作。

      编辑:添加了下面关于加密的部分,以尝试解决 Maicej 的评论。

      对于字段级粒度,您可以使用 SQL 2005 及更高版本中的内置加密功能来限制各种角色对某些字段的读取访问权限。这仅适用于少数加密字段,而不适用于整行。在this answer 的一个关于加密 SSN/信用卡信息的问题中,我提供了一个代码示例,说明如何使用加密功能来确保只有某些用户可以解密字段中的数据。该示例当前设置为使用数据库用户,但也可以适应应用程序角色。如果您选择使用密码加密密钥,您还可以防止具有系统管理员权限的 DBA 也能够解密加密数据。

      【讨论】:

      • 我知道 SQL Server 中的角色。我需要在字段级别 (R/W) 上设置权限意味着一个用户可以看到某个字段 (R) 另一个用户看不到相同的字段。应用程序管理员也有界面,他可以决定用户可以看到/做什么。如果我错了,请纠正我,但我认为 SQL 的角色不是那么灵活。
      【解决方案4】:

      要将客户端应用程序的名称传递给 SQL Server,请在连接字符串中设置“应用程序名称”参数。您可以使用app_name() 函数在 SQL Server 中检索此值。

      但是,如果您想对不同的应用程序强制执行不同的权限,那么您将必须为每个应用程序定义一个标准登录名和密码,而不是使用集成登录名。

      【讨论】:

      • 据建议,我已将应用程序名称参数添加到连接字符串。但是在执行 SELECT host_name() 查询时,它只返回连接的工作站名称。缺少什么?
      • 好的,我找到了 (stackoverflow.com/questions/323494/…) 我可以通过 SELECT App_Name() 查询读取应用名称
      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多