识别连接到SQL Server 2005的应用程序

时间:2009-07-27 10:01:02

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

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

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

如果没有,或许您有其他建议如何确保仅使用专用应用程序 (应用程序正在使用Windows的集成安全性)

编辑:我试图解决的问题是什么:

我正在开发内置应用用户权限&角色模块。
因此,app从DB(通过SP)接收所有字段,而不是业务逻辑决定向哪个用户显示(或不显示)。

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

连接字符串参数是一些解决方案,但很容易嗅 - 我想知道是否会有另一个选项

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

编辑:在下面的加密部分添加,试图解决Maicej的评论。

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

答案 2 :(得分:1)

在Windows上唯一可以验证的是用户。没有安全方式来建立应用程序的标识。因此,任何限制访问特定应用程序的尝试都可能被充分动机的攻击者击败。

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

稍微好一点的方法是通过批准来控制对数据的访问。批准允许访问应用程序,您仍然可以使用自定义应用程序逻辑来实现内容管理限制(“列”限制和其他引用)。这会略微提升标准,以便只有您的应用程序才能修改和访问数据。它会阻止非管理员访问您的数据,但是特权管理员(总是)能够做他或她想做的任何事情。

最后,通过部署加密还有更高的标准。需要一个真正坚定的管理员才能超越这个,并且管理员需要采取特定的步骤来找出你的密钥密码,他无法意外地发现它们。正如我所说,专用管理员将始终能够访问您的数据。

另一种方法是不部署任何障碍,而是使用审计来监控数据。防篡改审计可以在SQL Server中完成,广告审计通常具有足够的威慑力。

答案 3 :(得分:0)

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

但是,如果您要为不同的应用程序强制执行不同的权限,则必须为每个应用程序定义一个带有密码的标准登录名,而不是使用集成登录名。