Sql-Server

BUILTINAdministrators 允許通過連結伺服器而不是本地訪問

  • April 17, 2013

我們有兩台伺服器:

LYNDB01 & LYNDB02

LYNDB01 上,我們有一個名為db_ExampleDatabase的數據庫

我們在LYNDB02LYNDB01上創建了一個連結伺服器,沒有使用映射和“使用登錄的目前安全上下文”選項進行身份驗證:

EXEC master.dbo.sp_addlinkedserver @server = N'LYNDB01', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LYNDB01',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL

我們在LYNDB02上有一個用於DOMAIN\USER1的windows 使用者 - 這個 windows 使用者根本沒有登錄LYNDB01,但是是域管理員,因此是LYNDB01LYNDB02上的BUILTIN\Administrators的成員

我在LYNDB01.db_ExampleDatabase數據庫中創建了一個視圖,以確認哪個使用者正在執行事務:

CREATE VIEW [dbo].[vw_CurrentUser]
AS
   SELECT  SYSTEM_USER AS CurrentUser

為了測試,我們授予DOMAIN\USER1 RDP 訪問LYNDB01LYNDB02的權限。

如果我們以 DOMAIN\USER1 身份 RDP 到LYNDB01並****使用Windows 身份驗證打開 SSMS - 我們會收到登錄錯誤,因為DOMAIN\USER1在****LYNDB01上沒有登錄名,所以沒關係。

如果我們以 DOMAIN\USER1 身份 RDP 到LYNDB02並****使用Windows 身份驗證打開 SSMS,則它連接正常(這很好,因為DOMAIN\USER1在****LYNDB02上有登錄名)。這是我們的問題,我們可以通過連結伺服器訪問LYNDB01.db_ExampleDatabase.dbo.vw_CurrentUser !

SELECT * FROM LYNDB01.db_ExampleDatabase.dbo.vw_CurrentUser

LYNDB01沒有在 LYNDB01 上登錄,這怎麼可能(我們在本地連接時遇到的錯誤證實了這一點!)

是的,遠端查詢確認DOMAIN\USER1是目前使用者?

很混亂?!

編輯:理論1

DOMAIN\USER1是域管理員,因此是****LYNDB01LYNDB02上的本地管理員- 這可能是導致它的原因嗎?如果是這樣,為什麼我會在LYNDB01上被拒絕訪問,因為USER1沒有登錄但通過連結伺服器工作?

好的,如果我從 LYNDB01 中刪除BUILTIN \Administrators登錄,這個問題就會消失,並且來自LYNDB02的查詢失敗 - 為什麼BUILTIN\AdministratorsUSER1通過連結伺服器進行遠端身份驗證而不是本地身份驗證,我該怎麼辦?

這是意料之中的。LUA 從您的令牌中刪除管理員成員資格。從Windows Vista 上的使用者帳戶控制入門

為了幫助防止惡意軟體靜默安裝和電腦範圍內的感染,Microsoft 為 Windows Vista 開發了 UAC 功能。與以前版本的 Windows 不同,當管理員登錄到 Windows Vista 電腦時,使用者的完全管理員訪問令牌被分成兩個訪問令牌:完全管理員訪問令牌和標準使用者訪問令牌。**在登錄過程中,辨識管理員的授權和訪問控制組件被刪除或禁用,從而產生標準使用者訪問令牌。**然後使用標準使用者訪問令牌啟動桌面,即 Explorer.exe 程序。因為所有應用程序都從桌面初始啟動時繼承其訪問控制數據,所以它們也都以標準使用者身份執行。與此過程相比,當標準使用者登錄時,僅創建標準使用者訪問令牌。然後使用此標準使用者訪問令牌啟動桌面。

由於您的本地桌面令牌已刪除管理員成員身份,因此如果您希望通過builtin\Administrators. 在遠端訪問時,您的令牌會保留管理員成員身份,並且您可以獲得訪問權限。

解決方案是通過顯式域組帳戶授予 SQL Server 登錄權限,並將需要訪問您的 SQL 實例的所有使用者添加到此域組。不要依賴管理員成員身份,是一種不好的做法。

引用自:https://dba.stackexchange.com/questions/40138