本篇文章是SQL Server安全系列的第二篇,詳細內容請參考原文。
驗證是檢驗主體的過程。主體需要唯一標識,那樣SQL Server可以確定主體有哪些權限。正確的驗證是提供安全訪問數據庫對象的必要的第一步。
SQL Server支持兩種驗證:Windows身份驗證和SQL Server身份驗證。你使用的方式依賴於網絡環境,將訪問數據庫的應用程序類型,以及這些應用程序的用戶類型。
Windows身份驗證:這種形式的身份驗證依賴於Windows來做驗證身份。訪問SQL Server對象的權限被分配給Windows登錄名。這種類型的驗證僅適用於SQL Server運行在支持Windows NT或Kerberos身份驗證的Windows版本(Windows 2000及之后)。
SQL Server身份驗證:SQL Server可以完全依靠自己進行驗證。在這種情況下,你可以創建獨特的用戶名稱(SQL Server稱做登錄名)和密碼。用戶或應用程序連接到SQL Server和訪問所提供的憑據。權限直接給登錄名或通過角色分配。
SQL Server身份驗證配置並不是一個簡單地非此即彼的選擇。你可以配置身份驗證中的任何一種:
混合身份驗證模式:服務器支持SQL Server和Windows身份驗證。
Windows身份驗證模式:服務器只支持Windows身份驗證。
微軟強烈建議使用Windows身份驗證。Windows具有強大的身份驗證選項,包括密碼策略,但在實際應用中,Windows驗證並不總是可行的。SQL Server身份驗證可以引用一些Windows身份驗證功能,但它是不安全的。
Windows身份驗證
如果你配置你的SQL Server在Windows身份驗證模式操作,SQL Server假設和Windows服務器的信任關系。當用戶登錄到Windows時,Windows將驗證用戶的身份。SQL Server檢查用戶帳戶(任何Windows組,和任何SQL Server角色的用戶)決定是否允許用戶操作SQL Server對象。
Windows身份驗證比SQL Server身份驗證的幾個優勢,包括:
->由用戶單一登錄,所以它不用分開登錄到SQL Server
->審計特點
->簡化登錄管理
->密碼策略(在Windows Server 2003和之后版本)
Windows身份驗證的另一大優勢是你對Windows用戶和組的任何更改都會自動反映在SQL Server,所以你不必分開管理。然而,如果你改變一個已經連接到SQL Server的Windows用戶,這些更改不會生效,直到下一次用戶連接到SQL Server。
配置SQL Server的安全設置
當你安裝SQL Server,你可以選擇服務器實例將允許身份驗證模式。你也可以在SSMS的服務器屬性對話框更改設置。這些設置適用於SQL Server實例中的所有數據庫和其他對象。所以如果你需要對任何數據庫使用SQL Server身份驗證,你需要為服務器設置混合模式。
圖2.1顯示了服務器屬性對話框安全性頁面。要打開這個對話框,在對象資源管理器中右鍵單擊服務器實例名稱,然后從彈出的菜單中選擇“屬性”,然后轉到安全性頁面。你可以通過單擊適當的按鈕來更改身份驗證模式,然后單擊“確定”提交更改。
圖2.1 配置SQL Server實例的驗證模式
添加Windows登錄
為了使用Windows身份驗證,你首先需要一個有效的Windows登錄帳戶。然后你可以將權限授予一個Windows組連接到SQL Server,或者你可以對單個Windows用戶授予權限,如果你不想給集體權限。
一個關於使用Management Studio管理安全的好處,你可以設置登錄的同時提供數據庫訪問。為了使Windows登錄訪問SQL Server和AdventureWorks2012數據庫,使用以下步驟,假設本地機器上已經定義ClearFile登錄。
1、打開SSMS確保對象資源管理器窗口是可見的,並且你已經連接到一個SQL Server實例
2、展開服務器對象,然后展開安全性。你會看到幾個子節點,如圖2.2所示
圖2.2 對象資源管理器下的安全性
3、右鍵單擊登錄名節點,從彈出菜單選擇新建登錄名,打開登錄名-新建對話框
4、確保選擇Windows身份驗證
5、有兩種方式選擇Windows登錄名。第一種方式是直接輸入域或計算機名稱,然后一個反斜杠和Windows登錄名。第二種方法是單擊“搜索”按鈕打開“選擇用戶或組”對話框中。鍵入用戶名,然后單擊“檢查名稱”按鈕以找到確切的名稱。如果用戶被發現,將出現在該框中,如圖2.3所示。單擊“確定”選擇該用戶。
圖2.3 SQL Server查找Windows登錄名
6、退回到登錄名-新建對話框,設置AdventureWorks2012數據庫為默認數據庫。這是當用戶連接到服務器時並且沒有指定數據庫的情況下使用的數據庫。它不限制用戶只訪問這一個數據庫。圖2.4顯示了我本地設置的Windows登錄名。
圖2.4 新建Windows身份驗證登錄
注意:永遠不要把默認數據庫設置為master。我以痛苦的經驗告知:太容易連接到一個服務器,忘記改變數據庫。如果你運行一個腳本,在master數據庫中創建數百個數據庫對象,手動刪除這些對象以清理master數據庫,將會是一項繁瑣的工作。
7、下一步,讓用戶訪問數據庫。從對話框左側的列表中選擇用戶映射。通過數據庫旁邊的映射授予用戶訪問AdventureWorks2012數據庫。SQL Server會自動在數據庫下創建一同名用戶,並與之映射。你可以看到在表中的第三列,當然你也可以更改用戶名。分配Sales作為用戶的默認架構,通過鍵入或單擊省略號(…)按鈕從列表中選擇。對話框應該看起來像圖2.5。
圖2.5 給Windows登錄名AdventureWorks2012訪問數據庫
注意:為登錄名設置默認數據庫和授權訪問數據庫是有區別的。默認的數據庫僅僅意味着當用戶登錄時沒有指定數據庫,SQL Server試圖改變上下文到默認數據庫。但這並沒有授予任何在數據庫中做任何事情的權限,甚至允許訪問數據庫。這意味着,它有可能分配一個默認的數據庫,但用戶不能訪問。為用戶在訪問數據庫時做任何有用的事,你需要顯式地授予用戶權限。
8、默認情況下,新的Windows登錄名能訪問服務器。但是,如果你想顯式拒絕登錄訪問服務器,在登錄名-新建對話框左側選擇狀態,選擇“拒絕”按鈕。你還可以通過選擇禁用按鈕來暫時禁用該登錄名。圖2.6顯示了這些選項。
圖2.6 授予/拒絕連接到數據庫引擎或禁用登錄名
9、點擊確定創建用戶
你還可以以同樣的方式添加一個Windows組。在這種情況下,該組中的任何成員都能訪問數據庫服務器,只要你授予了組訪問數據庫對象的權限。
SQL Server身份驗證
當你使用SQL Server登錄認證,客戶端應用程序必須提供一個有效的用戶名和密碼以連接到數據庫。這些SQL Server登錄名保存在SQL Server。在登錄時,如果沒有帳戶匹配用戶名和密碼,SQL Server將拋出錯誤,並且用戶無法訪問SQL Server。
盡管Windows身份驗證更安全,在某些情況下你可以選擇使用SQL Server登錄。對於不需要特別安全需求的簡單應用,SQL Server身份驗證更容易管理,它可以讓你避免糾纏於Windows安全。如果客戶端是在舊版本的Windows上運行(比Windows 2000以前)或非Windows操作系統,你必須使用SQL Server登錄。
為了創建一個SQL Server登錄名,使用與Windows登錄名相同的對話框,登錄名-新建。輸入一個獨特的登錄名(沒有域名或機器名),並提供密碼。例如,圖2.7顯示了如何創建一個新的SQL Server登錄Casper,並將AdventureWorks2012設置為默認數據庫。
圖2.7 創建SQL Server登錄名
SQL Server登錄名的用戶映射和狀態選項和Windows登錄名一樣。
通過T-SQL語句創建SQL Server登錄名
你還可以使用T-SQL代碼來執行同樣的操作,代碼2.1使用CREATE LOGIN 創建了一個名為Topaz的SQL Server登錄名
CREATE LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v'; GO
代碼2.1 T-SQL語句創建SQL Server登錄名
然后給Topaz訪問AdventureWorks2012數據庫的權限,使用CREATE USER語句並分配默認架構,如代碼2.2所示
USE AdventureWorks2012; GO CREATE USER Topaz FOR LOGIN Topaz WITH DEFAULT_SCHEMA = HumanResources; GO
代碼2.2 為登錄名創建數據庫用戶
類似Windows登錄名,你可以將登錄名映射給不同名的數據庫用戶。代碼2.3中將Topaz登錄名映射給AdventureWorks2012數據庫的TopazD用戶
DROP USER Topaz; GO CREATE USER TopazD FOR LOGIN Topaz WITH DEFAULT_SCHEMA = HumanResources; GO
代碼2.3 刪除已存在的數據庫用戶,然后創建與登錄不同名的數據庫用戶
當心sa登錄名
如果你配置你的SQL Server支持SQL Server登錄,你需要當心內置的SQL Server登錄——sa登錄,你可能已經注意到對象資源管理器登錄節點。包含sa,或系統管理員登錄主要是對SQL Server舊版本的向后兼容性。sa登錄是映射到sysadmin固定服務器角色,任何以sa登錄到SQL Server是一個全系統管理員,可以訪問整個SQL Server實例和所有的數據庫。
你不能修改或刪除sa登錄名。在你安裝SQL Server實例的時候如果你選擇混合模式身份驗證,系統會提示你為sa用戶設置密碼。如果沒有設置密碼,任何人都可以用sa登錄,玩“讓我們管理服務器”。不用說,這是你最不想讓你的用戶做的最后一件事。如果其他系統管理員不可用或已經忘記了他們的windows密碼,才會用sa作為后門登錄。如果發生這種情況,你可能需要新的管理員!
永遠不要在應用程序使用sa登錄名訪問數據庫。這樣做可能讓黑客控制你的數據庫服務器,如果黑客能夠控制應用程序。在遙遠的過去,這已經是攻擊服務器的簡單方法,是一個可怕的做法。相反,無論是設置了自定義Windows或SQL Server登錄名,給登錄名絕對最低權限運行應用程序(實現最小特權原則)。
注意:事實上,你應該考慮禁用sa登錄名。這樣攻擊者就無法使用這個強大的登錄名來控制你的服務器實例,無論你是否有一個強大的密碼。
強制密碼策略
在SQL Server 2005之前的版本,系統管理員沒有簡單的方法強制密碼策略以幫助系統更安全。例如,SQL Server沒有辦法強迫用戶創建一個強密碼:最小長度和混合字母數字和其他字符。如果有人想創建一個登錄用一個字母作為密碼,你不能配置SQL Server來阻止它。同樣地,沒有辦法使密碼定期過期,如每三個月。有些人理所當然地認為這是不使用SQL Server登錄的主要原因。
SQL Server的最近版本可以使用Windows Server 2003,Windows Vista(或之后版本)的密碼策略。密碼仍然存儲在SQL Server,但SQL Server調用Windows API的NetValidatePasswordPolicy()方法,首次在Windows Server 2003推出。這個API功能適用於Windows密碼策略給SQL Server登錄名並返回一個值,指示密碼是否有效。當用戶創建、設置、或重置密碼時,SQL Server調用這個函數。
你可以通過控制面板>管理工具>本地安全策略(secpol.msc)>密碼策略,來定義你的Windows密碼策略。圖2.8中顯示了密碼策略部分默認設置。圖2.9顯示了帳戶鎖定策略,當用戶多次登錄不成功時,會被鎖定。默認情況下,在一個新安裝的Windows系統中鎖定策略是被禁用的。
圖2.8 密碼策略
圖2.9 帳戶鎖定策略
表2.1羅列了部分密碼策略,默認值以及相應的說明
類別 | 策略 | 默認值 | 說明 |
密碼策略 | 強制密碼歷史 | 0個記住的密碼 | 此策略使管理員能夠通過確保舊密碼不被連續重新使用來增強安全性 |
密碼長度最小值 | 0個字符 | 此安全設置確定用戶帳戶密碼包含的最少字符數 | |
密碼必須符合復雜性要求 | 禁用 | 此安全設置確定密碼是否必須符合復雜性要求 | |
密碼過期 | 密碼最長使用期限 | 42天 | 此安全設置確定在系統要求用戶更改某個密碼之前可以使用該密碼的期間 |
密碼最短使用期限 | 0天 | 此安全設置確定在用戶更改某個密碼之前必須使用該密碼一段時間 | |
帳戶鎖定策略 | 帳戶鎖定時間 | 無 | 此安全設置確定鎖定帳戶在自動解鎖之前保持鎖定的分鍾數 |
帳戶鎖定閾值 | 0次無效登錄 | 此安全設置確定導致用戶帳戶被鎖定的登錄嘗試失敗的次數 | |
重置帳戶鎖定計數器 | 無 | 此安全設置確定在某次登錄嘗試失敗之后將登錄嘗試失敗計數器重置為 0 次錯誤登錄嘗試之前需要的時間 |
表2.1 Windows密碼策略設置
當你創建登錄時,可以啟用或禁用密碼策略強制執行。當你創建一個SQL Server登錄時,登錄名-新建對話框,在登錄名的下面有一個選項,如圖2.10所示
圖2.10 為新登錄強制密碼策略
當你使用T-SQL創建登錄名時也會應用密碼策略。例如,如果你在Windows 2003 Server(或之后版本)運行SQL Server,並且開啟密碼策略,代碼2.4將失敗
USE master; GO CREATE LOGIN SIMPLEPWD WITH PASSWORD = 'SIMPLEPWD'; GO
代碼2.4 嘗試違背密碼策略創建數據庫登錄名
原因就是密碼不能和用戶名相同
你可以在創建或修改登錄名的時候控制策略。代碼2.5將關閉該檢查過期和強制策略選項。
ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v', CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF;
代碼2.5 修改登錄禁用密碼策略
CHECK_EXPIRATION選項控制SQL Server檢查密碼是否過期;CHECK_POLICY選項適用於其他策略。MUST_CHANGE選項,強迫使用戶在下次登錄時更改密碼。
如果用戶有多次不成功的登錄,超過了帳戶鎖定策略中的數目,管理員可以使用解鎖選項重置帳戶,如代碼2.6所示。
ALTER LOGIN Topaz WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v' UNLOCK
代碼2.6 解鎖登錄
在Windows Server 2003前,你可以開啟SQL Server使用強制密碼策略。但SQL Server使用默認設置的最小長度為6個字符,檢查密碼不匹配的登錄名的全部或任何部分,是一個混合大寫字母、小寫字母、數字、和其他字符。你不能更改這些默認值。但我希望你不是這樣一個舊版本的Windows上運行SQL Server。
總結
這一篇,你已經學到了一些在SQL Server中的身份驗證選項。Windows集成身份驗證是最安全的但並不總是可行的,微軟這幾年已經讓SQL Server身份驗證做得更好的和更安全。但是,如果你使用混合模式驗證,不要忘記給sa登錄一個非常強大的密碼,甚至更好,禁用它!你可以使用GUI界面或T-SQL代碼創建和修改大部分安全對象。如果你在一個現代版的Windows運行SQL Server,你可以引用本地安全策略中的密碼策略。