首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

打造安全穩定的 SQL Server 環境:認證模式、角色權限與最佳實踐全指南

     編輯:關於SqlServer

一、認證模式選擇:Windows 整合 vs 混合模式

Windows 整合認證:使用者透過 Windows 帳號連線,SQL Server 驗證 Windows 權杖(SID + 群組 SID)。優點:單一身分管理、密碼策略由 AD 強制、支援 Kerberos/NTLM、無密碼傳輸風險、審計完整。首選模式。

混合模式:同時支援 Windows 與 SQL Server 登入(儲存於 master..sysxlogins)。缺點:密碼管理分散、跨伺服器同步困難、每資料庫權限需個別設定、應用程式常內嵌帳密風險。僅用於無法使用 Windows 認證的舊系統/異構環境。

二、Web 環境認證策略

Web 應用常以單一 SQL 登入(甚至 sa)連線資料庫,導致無法審計個別使用者、權限無法細粒度控制。IIS 提供四種驗證可映射至 SQL:

  1. 匿名 NT 帳戶:每站點/虛擬目錄建立專用 NT 匿名帳戶,授予對應 SQL 權限,實現審計與隔離。
  2. 基本驗證:使用者輸入帳密,IIS 驗證後以該身分連線 SQL。必須啟用 SSL 防密碼明文傳輸。
  3. 整合式 Windows 驗證 (NTLM/Kerberos):IE 自動送出登入身分,支援跨域信任。最佳體驗與安全性平衡。
  4. 用戶端憑證映射:個人數位憑證映射至 NT 帳戶,取代帳密驗證,需 PKI 基礎建設。

建議:優先採用整合式 Windows 驗證或匿名 NT 帳戶隔離,避免 SQL 登入內嵌於程式碼。

三、全域群組設計:以角色為核心的權限架構

  1. 應用導向群組:依業務角色建立網域全域群組(如 Accounting_DataEntry, Accounting_Managers),名稱語意化。
  2. 基礎管理群組:
    • SQL_Server_Admins → sysadmin 伺服器角色
    • SQL_Server_Users → 僅授予登入權限,預設資料庫 master,無其他權限
    • SQL_Server_Denied_Users → 明確 DENY 登入(拒絕優先)
    • SQL_Server_DBCreators → dbcreator
    • SQL_Server_Security_Operators → securityadmin
    • SQL_Server_Developers → 開發權限
    • DB_Name_Users → 個別資料庫存取群組
  3. 授權方式:使用 sp_grantlogin/sp_addsrvrolemember/sp_addrolemember 而非 EM,因 EM 僅能選現有登入,無法直接授權網域群組。

四、資料庫層級權限:角色導向,非直接授權

  1. 建立資料庫後,sp_grantdbaccess 授權 DB_Name_Users 群組存取。
  2. 無 sp_denydbaccess,拒絕存取需建立 DB_Name_Denied_Users 並加入 db_denydatareader/writer 角色。
  3. 核心原則:權限授予 使用者定義資料庫角色,而非直接授予群組/登入。角色可容納 SQL 登入、NT 群組、本地群組、個人帳戶,統一管理入口。
  4. 內建角色(db_datareader 等)作用於全資料庫,易過度授權。僅保留 db_securityadmin(管理權限)、db_owner(架構變更)兩內建角色,其他改用自訂角色精確授權。
  5. 修改 model 資料庫可預設新資料庫繼承角色與權限結構。

五、簡化安全管理黃金法則

  • 伺服器存取 ← SQL_Server_Users 群組;資料庫存取 ← DB_Name_Users 群組。
  • 使用者加入全域群組 → 群組加入資料庫角色 → 角色擁有物件權限。
  • 需多重權限者 ← 加入多個全域群組。
  • 妥善規劃後,所有帳號/權限維護可在網域控制站完成,資料庫自動反映變更。

六、腳本過濾防 SQL 注入(ASP 範例)

Function Filter_SQL(strData)
    Dim strFilter, blnFlag, i, arr
    strFilter = "',;,--,@,_,exec,declare"   ' 自行擴充
    blnFlag = False
    arr = Split(strFilter, ",")
    For i = 0 To UBound(arr)
        If InStr(strData, arr(i)) > 0 Then blnFlag = True : Exit For
    Next
    If blnFlag Then Response.Redirect "error.asp" Else Filter_SQL = strData
End Function

所有輸入參數經過濾後再拼接 SQL,或改用參數化查詢(Command.Parameters)徹底解決注入。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved