萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 別名用戶安全隱患與檢測腳本

什麼是別名用戶?

早期 SQL Server(2000/2005)允許將登入映射為資料庫內的 dbo 用戶:

EXEC sp_addalias 'LoginName', 'dbo';

此用戶**不出現在 SSMS「用戶」節點**,但擁有完整 db_owner 權限,極易被忽視成為安全盲區。

檢測腳本:發現所有擁有 dbo 權限的用戶(含別名)

-- 1. 普通角色成員
SELECT DISTINCT 
    DB_NAME() AS Database_Name,
    su.name AS Database_User
FROM sysusers su
JOIN sysmembers sm ON sm.memberuid = su.uid
JOIN sysmembers sm1 ON sm1.groupuid = sm.memberuid
JOIN sysusers su1 ON su1.uid = sm1.groupuid
WHERE su1.name = 'db_owner' AND su.name <> 'dbo';

-- 2. 別名用戶(關鍵補充)
SELECT name AS Aliased_User, 'ALIAS' AS Type
FROM sys.sysusers
WHERE isaliased = 1 AND issqluser = 0;

-- 3. 統一視圖(2005+ 推薦)
SELECT 
    dp.name AS Principal_Name,
    dp.type_desc AS Principal_Type,
    CASE WHEN sp.is_disabled = 1 THEN 'DISABLED' ELSE 'ENABLED' END AS Login_Status,
    'DIRECT' AS Mapping_Type
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.is_fixed_role = 0 AND dp.name NOT IN ('dbo','guest','INFORMATION_SCHEMA','sys')
UNION ALL
SELECT 
    su.name, 'SQL_USER_ALIAS', 'N/A', 'ALIAS'
FROM sys.sysusers su
WHERE su.isaliased = 1;

風險示例

-- 建立登入與別名
CREATE LOGIN AliasUser1 WITH PASSWORD = 'test';
EXEC sp_addalias 'AliasUser1', 'dbo';  -- 映射為 dbo

-- SSMS 中「用戶」節點**看不到** AliasUser1
-- 但使用 AliasUser1 登入可對資料庫為所欲為

清理與遷移建議

  1. 列出所有別名:EXEC sp_helpuser;(第二結果集顯示別名)
  2. 刪除別名:EXEC sp_dropalias 'AliasUser1';(不可用 sp_dropuser)
  3. 改用標準角色授權:
    CREATE USER AliasUser1 FOR LOGIN AliasUser1;
    ALTER ROLE db_owner ADD MEMBER AliasUser1;

版本演進

  • SQL Server 2000/2005:支援別名(向後相容)
  • SQL Server 2008:棄用,發出警告但仍可用
  • SQL Server 2012+:移除,sp_addalias 不存在

升級檢查清單

-- 升級前必跑
SELECT name FROM sys.sysusers WHERE isaliased = 1;
-- 若有結果,必須先遷移為標準用戶+角色,再升級

**核心原則:別名機制破壞了權限可見性,現代版本已棄用移除,存量系統必須清理遷移。**

copyright © 萬盛學電腦網 all rights reserved