Sql-Server
沒有權限的使用者可以使用連結伺服器
我有使用者看到他們不應該看到的連結伺服器。
連結伺服器被定義為只有我可以訪問它,但每個人都可以看到和使用它。
我使用以下步驟創建了新的連結伺服器:
- 將 SSMS 對象資源管理器連接到 SQL Server 實例
- 展開
Server Objects
,右鍵點擊Linked Servers
並左鍵點擊New Linked Server...
- 在選項卡下
General
選擇並寫下伺服器的名稱SQL Server``Server type
- 在
Security
上半部分的選項卡下點擊Add
,選擇“sa”作為Local Login
,輸入Remote User
名稱和Remote Password
- 在
Security
下部的選項卡下(下For a login not defined in the list above, connections will:
)選擇第一個選項:Not be made
- 點擊
OK
開始測試現在唯一應該看到連結伺服器的人是我(“sa”),但不知何故其他使用者可以看到並使用它。
注意1:可以使用連結伺服器的使用者對遠端伺服器具有權限,他們看不到他們不應該看到的數據,他們只能在他們不應該看到的時候從連結伺服器訪問它。
注 2:我是這
sysadmin
兩個實例中唯一的一個。
無法“隱藏”連結伺服器或阻止未經授權的使用者嘗試使用它。您所能控制的只是他們是否真的可以訪問另一端。連結伺服器本身並不是一個實際的對象。就像同義詞一樣,您不授予對別名的訪問權限,而只是授予它引用的事物。
試一試,您會發現您的一些假設(例如,“登錄…無法在對象資源管理器中看到連結伺服器”)是錯誤的。我這樣做了:
- 創建了一個登錄名,並且沒有授予任何權限,只是 CONNECT / public 角色。
- 創建了一個連結伺服器,並且沒有將此登錄名添加到登錄名列表中。
- 打開一個新的 Management Studio 實例,並使用此登錄名進行連接。
- 我能夠在伺服器對象 > 連結伺服器下看到所有連結伺服器。
- 我還能夠查詢
sys.servers
以查看連結伺服器的列表。我能夠執行以下查詢沒問題:
SELECT name FROM [linked server].master.sys.objects;
但是,我無法對非系統數據庫執行查詢,因為我沒有授予對任何非系統數據庫或內部對象的顯式訪問權限。例如:
SELECT SalesOrderID FROM [linked server].AdventureWorks2012.Sales.SalesOrderHeader;
產生了這個錯誤:
消息 7314,級別 16,狀態 1,第 1 行
連結伺服器“連結伺服器”的 OLE DB 提供程序“SQLNCLI11”不包含表“AdventureWorks2012”.“Sales”。“SalesOrderHeader”。該表不存在或目前使用者對該表沒有權限。
我希望您可以通過明確拒絕訪問連結伺服器上的特定對象(或
DENY CONNECT SQL
完全拒絕該登錄)來獲得更多限制性結果,但這並不限制其對連結伺服器的影響;它也會影響直接連接。無論如何,我看不到您要完成的工作的重點:
- 如果使用者在另一端沒有訪問權限,讓他們嘗試有什麼害處?(與一開始就試圖阻止他們嘗試相比,您可能會更幸運地告訴他們不要這樣做並審核他們。)
- 如果使用者確實可以訪問另一端,為什麼他們不能使用連結伺服器?
您可以使用第一個選項“Not be made with”登錄映射,如下所示:
這是映射登錄的結果:
這是另一個帳戶發生的情況