系列最終篇:聚焦資料庫層級授權模型——**使用者自訂角色**取代內建角色、權限分配鐵律 (GRANT/REVOKE/DENY 優先序)、SQL/Windows 登入統一容器化管理、安全策略簡化十大經驗法則。
sp_grantdbaccess 授權群組存取資料庫 (建立資料庫使用者對應 SID)。sp_denydbaccess** (無法像伺服器層級 sp_denylogin 直接拒絕)。DB_Name_Denied_Users 群組 → 授權存取 → 加入 db_denydatareader + db_denydatawriter 角色 (僅封鎖 DML,不封鎖 DDL)。DB_Name_Users 群組授權存取,其他群組不授權。**透過 AD 群組增減成員即時控管存取權**。db_datareader = 所有資料表/檢視表 SELECT,難以精細排除敏感表。DENY 易遺漏新物件/新成員。
-- 會計系統範例
EXEC sp_addrole 'Acct_DataEntry_Operators_Role';
EXEC sp_addrole 'Acct_DataEntry_Managers_Role';
EXEC sp_addrole 'Acct_Report_Writers_Role';
-- 命名對應群組:_Role 後綴,便於對應
-- 僅授予必要物件權限
GRANT SELECT ON dbo.Vouchers TO Acct_Report_Writers_Role;
GRANT INSERT, UPDATE ON dbo.Vouchers TO Acct_DataEntry_Operators_Role;
GRANT EXECUTE ON usp_PostVoucher TO Acct_DataEntry_Managers_Role;
DENY SELECT ON dbo.Salary_Details TO Acct_Report_Writers_Role; -- 敏感表明確拒絕
db_securityadmin:授權安全性管理員管理角色/權限。db_owner:授權開發/建構人員建立結構 (僅限開發/測試環境)。**自訂資料庫角色可同時包含:SQL Server 登入、Windows 全域群組、本地群組、個別網域帳戶。**
-- 同一角色容納異質主體
EXEC sp_addrolemember 'Acct_Report_Writers_Role', 'DOMAIN\Acct_Report_Writers'; -- Windows 群組
EXEC sp_addrolemember 'Acct_Report_Writers_Role', 'SQL_Report_Service_Account'; -- SQL 登入
EXEC sp_addrolemember 'Acct_Report_Writers_Role', 'DOMAIN\jdoe'; -- 個別帳戶
這是使用自訂角色而非直接授權群組的**核心原因**:單一授權容器整合所有身分類型,應用程式可混合使用 SQL/Windows 驗證無縫切換。
SQL_Server_Users 群組;資料庫存取 ← DB_Name_Users 群組。SQL_/DB_ 前綴、角色 _Role 後綴、對應清晰。GRANT;敏感物件主動 DENY。DENY 絕對覆蓋 GRANT,謹慎使用避免誤傷。sysadmin 成員、敏感物件權限變更。sysadmin、db_owner 成員名單,移除離職/調動人員。
[Active Directory]
│
├─ Global Groups (業務/管理) ──→ [SQL Server 登入映射]
│ │
│ ▼
│ [伺服器角色: sysadmin, securityadmin...]
│ │
▼ ▼
[資料庫] [Model 資料庫預配置角色]
│ │
├─ sp_grantdbaccess (DB_Users 群組) │
│ │
▼ ▼
[自訂資料庫角色] ←────────────────── (新資料庫自動繼承)
│ (對應群組命名, 精確 GRANT/DENY)
▼
[物件權限: SELECT/INSERT/UPDATE/EXECUTE...]
規劃得當,你能在網域控制器完成所有存取權限維護,伺服器自動反映 AD 設定調整。基本措施雖簡單,卻能構建極易管理、經得起考驗的安全策略。