505 字
3 分鐘
如何禁止特定帳號使用 LinkServer?用假帳號直接封鎖
結論
用「假帳號 mapping」覆蓋 LinkServer 登入,讓指定使用者永遠連線失敗,是最簡單可控的封鎖方式。
適合用在哪裡
- 想限制「特定帳號」不能用 LinkServer
- 不想影響其他使用者(維持 public 可用)
- 無法用 DENY 精準控管 LinkServer 時
- 權限已混亂,需要快速止血
流程步驟
1. 確認目前 LinkServer 登入設定
- 使用
sp_helplinkedsrvlogin檢視 mapping - 可以看到誰對應哪個遠端帳號
- 判斷是否有
NULL(代表所有人共用)
EXEC sp_helplinkedsrvlogin;2. 移除目標使用者的既有 mapping
- 針對所有 LinkServer
- 刪除該 User 的登入對應
- 避免舊設定干擾
EXEC sp_droplinkedsrvlogin @rmtsrvname = N'LinkServerName', @locallogin = N'UserA';3. 建立「假帳號」強制登入失敗
- 核心做法:指定一組不存在的帳號
- 當 User 呼叫 LinkServer 時 → 一定登入失敗
- 等同「軟性 DENY」
EXEC sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName', @useself = N'False', @locallogin = N'UserA', @rmtuser = N'FakeDenyUser', @rmtpassword = N'WrongPassword';補充
- 沒有
DENY USE LINKSERVER這種權限,只能用 mapping 控制 @locallogin = NULL代表所有人共用,需特別注意覆蓋順序- 此方法不影響其他使用者(只針對指定帳號)
指令 / 範例整理
Click to expand
-- 檢視權限EXEC sp_helplinkedsrvlogin;
-- 動態產生:刪除 + 建立 Fake MappingDECLARE @UserName sysname = N'UserA';DECLARE @FakeUser sysname = N'FakeDenyUser';DECLARE @FakePassword nvarchar(200) = N'WrongPassword';
DECLARE @SQL nvarchar(max) = N'';
-- 1. 刪除 mappingSELECT @SQL = @SQL + N'BEGIN TRY EXEC sp_droplinkedsrvlogin @rmtsrvname = N''' + REPLACE(name, '''', '''''') + ''', @locallogin = N''' + REPLACE(@UserName, '''', '''''') + '''; END TRY BEGIN CATCH END CATCH;' + CHAR(13) + CHAR(10)FROM sys.serversWHERE is_linked = 1;
-- 2. 建立 Fake mappingSELECT @SQL = @SQL + N'EXEC sp_addlinkedsrvlogin @rmtsrvname = N''' + REPLACE(name, '''', '''''') + ''', @useself = N''False'', @locallogin = N''' + REPLACE(@UserName, '''', '''''') + ''', @rmtuser = N''' + REPLACE(@FakeUser, '''', '''''') + ''', @rmtpassword = N''' + REPLACE(@FakePassword, '''', '''''') + ''';' + CHAR(13) + CHAR(10)FROM sys.serversWHERE is_linked = 1;
-- DebugPRINT @SQL;
-- 執行EXEC sp_executesql @SQL;收尾
LinkServer 沒有權限控管?那就用「讓他永遠連不上」這招,乾脆俐落。 實務建議:權限設計一開始就分帳號,不然後面都只能補破網。
如何禁止特定帳號使用 LinkServer?用假帳號直接封鎖
https://joyceowo.github.io/posts/33ca78ea09fa8096b44ccfaf8486be0c/