日期:2014-05-16  浏览次数:20467 次

如何配置安全的Linked server

SQL Server Linked server提供了方便快速访问外部数据以及异构数据库,所以很多公司喜欢用Linked server.但是又有一些公司限制使用Linked server.

 

我觉得主要是安全性的考量:

1.创建Linked server的时候我们可以直接将用户名和密码存储,访问Linked server的时候就直接使用存储的用户名密码对远程数据库远程访问。但是这样会有一个问题,如果我只允许A用户访问数据库,但是B用户也有可能会访问到数据库,而且有可能会更新远程数据,这个是很危险的。当然我们使用只读权限配置Linked server,但是这样对性能会有影响,如果这个账户没有db_ower权限则无法使用正确的统计信息,可能生成错误的执行计划,导致性能下降。

 

 

2.微软建议我们使用Windows账户进行访问,但是使用Windows账户访问在其他方面也要做很多配置。 首先如果用到委托的话,就需要创建SPN,在Cluster环境中队SPN Troubleshooting是很困难的。其次在做应用程序开发的时候就需要进行好的规划,将Schema与域账户进行一一对应。第三还需要对这些WINDOWS用户做限制,不能直接访问数据库,如果B/S架构可能需要限制IP访问或者用Application role等等。

针对于上面的两点安全性考虑,其实我们就需要限制特定用户访问Linked server.微软的MSDN中有提到用本地Login和远程Login的Mapping来实现。但是我自己做了个测试发现及时用另外的用户还是可以访问Linked server的:

 

首先创建Linked server:

/****** Object:  LinkedServer [CNLT2FBY4R1]    Script Date: 07/23/2012 09:53:36 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'CNLT2FBY4R1', @srvproduct=N'SQL Server'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'CNLT2FBY4R1',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'CNLT2FBY4R1',@useself=N'False',@locallogin=N'test1',@rmtuser=N'test',@rmtpassword='########'

 

 

这里我用本地的test1映射到远程服务器的test,然后我用test1和test3两个账户去删除远程服务器上的两条数据,结果test3失败并且返回如下结果:

Msg 18456, Level 14, State 1, Line 1
Login failed for user 'test3'.

看起来上面我们的配置以及生效了。 (这个类似于Oracle DB Link restric user)

 

 

这个是微软官方的实例:

使用不同的用户凭据将特定的登录连接到链接服务器

此示例创建一个映射,以确保只有 Windows NT 用户 Domain\Mary 使用登录 MaryP 和密码 NewPassword 连接到链接服务器Accounts

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', 'NewPassword'

关于Linked server可以参考:

http://msdn.microsoft.com/zh-cn/library/aa213768(v=sql.80).aspx