是否可以拒绝从特定程序访问SQL Server?

时间:2010-05-19 15:43:36

标签: sql sql-server-2008

目前,我们的一个数据库(SQL Server 2008)是通过多种不同的机制访问的:.Net SqlClient Data Provider; SQL Server Management Studio;各种.Net应用程序和2007 Microsoft Office系统(基本上是Excel)。

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

6 个答案:

答案 0 :(得分:12)

可能,所有相反的声称都是蛇油。

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

因此,只要您降低条形并删除条款作为“拒绝访问”问题,就可以提供Logon Trigger来检查sys.dm_exec_sessions中会话的program_name

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属性,就可以通过任何人来规避这一点。

答案 1 :(得分:6)

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

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

-Krip

答案 2 :(得分:4)

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

如果您只有一个共享的登录信息......那么,这不是一个非常安全的环境,您最终会有所有人都可以随心所欲地做任何事情。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

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

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