链接服务器可供无权限用户使用

Roi*_*ish 9 security sql-server ssms linked-server

我让用户看到了他们不应该看到的链接服务器。

链接服务器被定义为只有我可以访问它,但每个人都可以看到和使用它。

我使用以下步骤创建了新的链接服务器:

  1. 将 SSMS 对象资源管理器连接到 SQL Server 实例
  2. 展开Server Objects,右击Linked Servers和左键单击New Linked Server...
  3. General选项卡中选择SQL ServerServer type和写入服务器的名称
  4. Security上半部分的选项卡下单击Add,选择“sa”为Local Login,输入Remote User名称和Remote Password
  5. Security下部选项卡下(下For a login not defined in the list above, connections will:)选择第一个选项:Not be made
  6. 单击OK并开始测试

现在唯一应该看到链接服务器的人是我(“sa”),但不知何故其他用户可以看到并使用它。

注1:可以使用链接服务器的用户在远程服务器上有权限,他们不会看到他们不应该看到的数据,他们只能在他们不应该看到的时候从链接服务器访问它。

注 2:我是这sysadmin两个实例中唯一的一个。

Aar*_*and 7

没有办法“隐藏”链接服务器或阻止未经授权的用户尝试使用它。您所能控制的只是他们是否真的可以访问另一端。链接服务器本身并不是一个实际的对象;就像同义词一样,您不会授予对别名的访问权限,而只是授予它所引用的事物的访问权限。

尝试一下,您会发现您的一些假设(例如“登录...无法在对象资源管理器中看到链接的服务器”)是错误的。我这样做了:

  1. 创建了一个登录名,并没有授予任何权限,只是 CONNECT / public 角色。
  2. 已创建链接服务器,但未将此登录名添加到登录名列表中。
  3. 打开 Management Studio 的一个新实例,使用此登录名进行连接。
  4. 我能够在服务器对象 > 链接服务器下看到所有链接服务器。
  5. 我还能够查询sys.servers以查看链接服务器的列表。

我能够运行以下查询没问题:

SELECT name FROM [linked server].master.sys.objects;
Run Code Online (Sandbox Code Playgroud)

但是,我无法对非系统数据库运行查询,因为我没有授予对任何非系统数据库或内部对象的显式访问权限。例如:

SELECT SalesOrderID FROM [linked server].AdventureWorks2012.Sales.SalesOrderHeader;
Run Code Online (Sandbox Code Playgroud)

产生了这个错误:

消息 7314,级别 16,状态 1,第 1 行
链接服务器“链接服务器”的 OLE DB 提供程序“SQLNCLI11”不包含表““AdventureWorks2012”.“Sales”.“SalesOrderHeader””。该表不存在或当前用户对该表没有权限。

我希望您可以通过明确拒绝访问链接服务器上的特定对象(或DENY CONNECT SQL完全拒绝该登录)来获得更严格的结果,但这并不限制其对链接服务器的影响;它还影响直接连接。

无论如何,我看不出你想要完成的事情的重点:

  1. 如果用户在另一端没有访问权限,让他们尝试有什么害处?(与试图阻止他们首先尝试相比,告诉他们不要这样做并对其进行审核可能更幸运。)
  2. 如果用户确实可以访问另一端,为什么他们不能使用链接服务器?