設計階段即納入安全
安全不是事後加裝的鎖,而是架構決策。從 ER 圖、存取需求文件開始,每個資料表、每個預存程序都要問:誰能讀?誰能改?為什麼?
認證模式抉擇
- Windows 驗證:整合 AD、Kerberos、密碼原則集中、無密碼傳輸、支援 MFA。預設首選。
- 混合模式:僅在非網域、跨網域、舊版應用不支援整合驗證時使用。
無論哪種模式,安裝即設定 `sa` 強密碼(甚至 `ALTER LOGIN sa DISABLE`)。
核心安全物件模型
| 物件 | 說明 |
| 登入 | 伺服器層級主體,對應 Windows 帳號或 SQL 登入 |
| 使用者 | 資料庫層級主體,對應登入 |
| 角色 | 權限集合,伺服器角色 / 資料庫角色 / 應用程式角色 |
| 結構描述 | 物件容器,擁有者可控制內部物件權限 |
| 權限 | GRANT / DENY / REVOKE 三態,精確到資料行層級 |
最小權限實踐
- 識別敏感資料(薪資、身分證、信用卡、醫療紀錄)。
- 識別需存取者(人員、服務帳號、應用程式)。
- 建立專用資料庫角色(如 `hr_readonly`、`finance_writer`),授予精確權限。
- 將使用者/服務帳號加入對應角色,**嚴禁直接授權給個人**。
- 定期審查:`sp_helprolemember`、權限報表。
擁有權鏈:免授權存取的雙面刃
當物件 A(檢視表/預存程序/函數)參考物件 B(資料表),且擁有者相同時,呼叫者僅需 A 的權限,系統略過 B 的權限檢查。
- 善用: 以檢視表/預存程序封裝敏感資料表,僅授予封裝物件權限,隱藏底層結構與敏感欄位。
- 風險: 若開發者建立惡意檢視表竊取資料,同擁有者下不被攔截。嚴格管控 DDL 權限,生產庫禁止開發者建立物件。
封裝存取介面
| 介面 | 優點 | 適用場景 |
| 檢視表 | 資料行/資料列層級過濾、簡化查詢、支援索引檢視表 | 唯讀報表、敏感欄位遮罩 |
| 預存程序 | 參數化防注入、邏輯封裝、交易控制、執行計畫重用 | 寫入操作、複雜業務邏輯 |
| 內嵌函數 | 可在查詢中像資料表一樣 JOIN、最佳化器可展開 | 可重用的篩選/轉換邏輯 |
應用程式角色
無密碼登入,僅在應用程式呼叫 `sp_setapprole` 後啟用,擁有預先定義權限。防止使用者繞過應用程式直接連線資料庫。
EXEC sp_setapprole 'app_role_name', 'strong_password'
持續修補與監控
- 建立 修補行事曆:月度累積更新、季度 GDR、緊急安全更新 0-day 響應。
- 啟用 SQL Server Audit / Extended Events 記錄:DDL 變更、失敗登入、權限提升、敏感資料存取。
- 訂閱 CVE/NVD、Microsoft Security Response Center 通知。
結語
安全設計是權衡:可用性 vs 風險、開發速度 vs 技術債。文件化每個決策理由,定期複盤,才能在演進中守住底線。
- 上一篇文章: SQL Server 安全安裝與配置指南:SA 帳號、Slammer 蠕蟲防護、認證模式選擇
- 下一篇文章: 防火牆也有「後門」:一則真實滲透案例剖析與防禦啟示
Copyright ©
程式碼之家 All Rights Reserved