共用方式為


安全性

常見的 SQL Server 安全性問題及解決方案

Paul S. Randal

 

簡介:

  • 實體和網路安全性
  • 攻擊介面、 服務的帳戶和最小的權限
  • 驗證、 授權和 SQL 資料隱碼攻擊
  • 嚴重損壞修復和稽核

內容

實體安全性
網路安全性
攻擊曲面降低
服務帳戶
限制的系統管理員權限的使用
驗證
授權
SQL 資料隱碼攻擊
嚴重損壞修復
稽核
摘要

IT 產業的已的任何人知道安全性是熱門的主題。 畢竟,公司的資料是其中一個最珍貴的資產有也是保護資料重要。 我已規劃要撰寫的這個安全性問題,我會嘗試判斷哪些安全性功能應該有專用它整個文件。 但然後我啟動來思考 burgeoning 數字 involuntary DBA 」 (這些 IT 專業人員使用者不小心風力設定負責 SQL Server 執行個體) 和好我們的回應, 最有效的資料庫維護秘訣從 8 月 2008 問題的文章。 它攻擊我我應該做,是寫入的文章,涵蓋了一般的 SQL Server 安全性問題 — 入門的排序較佳的安全性為您的 SQL Server 執行個體。

說明您應該要尋找在所有安全性問題的文件會是整個雜誌本身,我 canvassed 我夥伴的 SQL Server MVP (和我的妻子),因此我應該包含的輸入。 我會安置在提供我想您應該擔心有關,如果您不是在安全性-精通 DBA 突然發現自己負責 SQL Server 執行個體與應用程式上 10 的安全性區域。 (請記住這是的詳盡清單)。 針對每個問題,我已經提供概觀,發生問題的建議如何降低它,以及更詳細的資訊連結。

線上叢書 》 的所有連結都是 SQL Server 2008 版本中,但是每個 Web 網頁會連結到 SQL Server 2005 版本。 完成 「,我提供連結主要的白皮書與線上叢書 》 的區段的安全性 SQL Server 2005 的 SQL Server 2008。

實體安全性

很重要您不只要考慮 SQL Server 安全性本身,但必須周遊,以取得 SQL Server 的所有圖層。 分層的安全通常稱為 「 防禦深度,"性的這個概念的您不要只是安全性的一個圖層,但是考慮整個系統。

在最明顯的第一個考量是執行 SQL Server 之電腦的實體安全性 — 這一層中,但是,經常忽略或 complacency 的主旨。 我無法在參考只是是否在電腦可供竊取或不,但也像裝載資料庫檔案,在備份的磁帶和任何裝載的資料庫的重複複本的伺服器的儲存系統的實體存取。 只能實際接觸這些物件的實際需要這些人可以存取它們,需要暫時存取的任何人應該會伴隨並監視。

較不明顯的考量會是高特殊權限存取 SQL Server 的使用者在桌上型電腦的安全性。 如果其他人可以 SQL Server 的 「 系統管理員 (sysadmin) 」 存取,但它們離開解除鎖定 Windows 桌面然後全世界的所有安全性不是要防止他人查核過去的自動安裝的系統,可能會存取機密資料。 如果有人 past 之前,而且變更一些資料會更 insidious 問題 — 例如,在 dishonest 員工知道的人力資源資料庫結構描述,並將嘗試 undetectably 變更為薪資。

還有一個非常有趣 TechNet 白皮書 (包括在投影片和網路廣播,) 標題為 < 在 Microsoft 的實體安全性」 的說明 Microsoft 管理它的許多伺服器的實體安全性的方式。

網路安全性

雖然您的伺服器可能會無法存取的實體,它們是最有可能連線到網路某些種類。 這可能只是的隔離的公司 LAN 連線,之外不,或者可能是直接連線到網際網路]。 無論何種情況,有您需要考慮的事項:

  • 請確定 Windows 伺服器擁有適當的網路的安全性設定。
  • 決定哪些網路通訊協定,以允許,],並停用任何不需要的。
  • 確認有在防火牆設定 (例如,Windows 防火牆) 並設定它 (如所示,允許存取 SQL Server [圖 1 ).
  • 決定是否要加密 [連線至 SQL Server 中,並適當地設定。
  • 如果要使用 Kerberos,註冊 [伺服器主要名稱]。 Kerberos 是鞏固 Windows 驗證 (這我會說明在本文稍後) 的驗證機制,但不是瞭解]。 Rob Greene,部落格內容的重大問題工程師,支援由提供清楚且簡潔的說明 」 Kerberos 的 / 忙碌資訊的管理." 我建議您簽出。
  • 決定是否要使用 SQL Server Browser 服務來協助尋找已安裝的 SQL Server 執行個體,並將決定您要隱藏某些執行個體的用戶端。 隱藏的執行個體表示用戶端應用程式,和使用者將會需要知道在的 SQL Server 執行個體的連線詳細資料,但它可防止人 trawling 網路以尋找 SQL Server 執行個體。

fig01.gif

[圖 1 設定 Windows 防火牆以允許存取 SQL Server TCP

所有這些工作 (和更多) 說明 SQL Server 2008 線上叢書 》,開頭主題 伺服器網路組態. 在上還有一個好的區段 用戶端網路組態.

攻擊曲面降低

更多的服務,已啟用的功能越攻擊介面 (或) 介面沒有壞人攻擊的區域。 SQL Server 2005 採用 「 關閉預設 「 策略 — 與安全性功能預設會停用的並會只啟用 DBA,必要時。 (這個處理序啟用和停用服務通常稱為介面區組態)。

在主要是的範例一項功能,您可能需要停用之提供一種方式執行命令,在主機上的 Windows 系統的內容中 SQL Server 執行個體的 xp_cmdshell。 如果在的 SQL Server 執行個體和 SQL Server 服務帳戶具有較高的入侵者折衷 Windows 權限,xp_cmdshell 可用來太取得存取權的 Windows 系統。

有很多的介面區組態方法。 SQL Server 2005 和 SQL Server 2008,同時支援 SQL Server 組態管理員設定的服務和網路通訊協定。 同時也會支援設定資料庫引擎的功能和選項的 sp_configure 預存程序。 例如,這個程式碼會停用 xp_cmdshell 功能:

-- To allow advanced options to be changed
EXEC sp_configure 'show advanced options', 1;
GO
-- To update the currently configured value for -- advanced options
RECONFIGURE;
GO
-- To disable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0;
GO
-- To update the currently configured value for this -- feature
RECONFIGURE;
GO

圖形的方法,設定資料庫引擎的選項和功能的是完全不同的兩個版本之間的。 SQL Server 2005 引進了 SQL Server 介面區組態 (SAC) 工具。 這可讓您輕鬆地進行變更。 [圖 2 ,例如,會顯示,如何停用 xp_cmdshell 使用 SAC 的位置。

fig02.gif

[圖 2 使用 SAC 在 SQL Server 2005 的 Disabling xp_cmdshell

在 SQL Server 2008,請 SAC 完全移除,並 subsumed 原則為基礎的管理功能的功能]。 可以在 [SQL Server 2008 線上叢書 》 中的主題] 中找到更多資訊 」 使用原則為基礎的管理,管理伺服器." [圖 3 ] 說明建立條件來檢查該 xp_cmdshell 已停用。 一旦設定,原則可以目標 SQL Server 2005 和 SQL Server 2008,同時執行個體而且可以即使 「 套用,」 讓您基本上,變更按一下設定。

fig03.gif

[圖 3] 建立 SQL Server 2008 中的原則為基礎的管理條件

服務帳戶

Windows 上的 SQL Server 執行一或多個服務,,每個服務必須擁有 Windows 帳戶,用於執行服務。 帳戶需要存取各種資源 (例如網路和各種不同的檔案系統目錄) 的 Windows 系統上。 最佳的作法是至少要有可能讓 SQL Server,才能正常運作所需的權限帳戶。 這屬於所謂的最低權限、 可在系統的狀態更多保護授與使用者或處理所需的權限和任何更多原則。

因此,SQL Server 服務帳戶應該不會是高權限帳戶 (例如本機系統或本機系統管理員),因為如果 SQL 伺服器被入侵,沒有可能也會危害 Windows 系統的。 服務通常會執行稱為網路服務,在內建帳戶,但如果 SQL Server 會需要存取其他網域的資源,應使用最小權限和資源中建立新的網域使用者帳戶所需的存取。 SQL Server 2008 線上叢書 》"中的主題 設定 Windows 服務帳戶「 提供完整的服務帳戶 」、 「 必要的權限及 「 資源清單]。 請注意是否您必須變更服務帳戶 (或任何相關),您應該永遠使用 SQL Server 組態管理員來確保所有必要的組態變更會正確地進行。

限制的系統管理員權限的使用

更多的曝光度 SA 登入或系統管理員 (sysadmin) 固定伺服器角色有,多個可能沒有安全性漏洞的 — 或意外。 有一些要遵循的最佳作法。

最小化的人可存取 SA 帳戶,並限制系統管理員 (sysadmin) 角色 (和其他特殊權限的角色) 的成員資格,因此數目真的需要系統管理員 (sysadmin) 權限有它們的人員。 沒有提供 SA 密碼給人想要暫時存取 SQL Server 或 SQL 使用者要執行一些快速的工作。 在這些的情況下請建立新的 SQL 登入,並授與任何權限是必要]。

最好能夠為系統管理員 (sysadmin) 角色,而不是使用 SA 帳戶的成員的人員。 您可以移除這的種方式而無需變更 SA 帳戶密碼在使用者的登入。 如果需要您時間舊的伺服器上,且您不知道使用者必須變更之前的存取權的 SA 密碼讓您在控制項中。

provokes 辯論的一個問題是從系統管理員 (sysadmin) 角色 (它加入預設),移除 Windows BUILTIN / Administrators 群組。 應該能夠查詢 HR 資料庫,Windows 的管理員? 或不會公司明確信任所有的系統管理員具有完整性和 honesty 嗎? 如果決定移除它繼續服務。 是,如果您不採取正確的步驟,您的 SQL Server 可能無法啟動在叢集環境中特別如此。 如需這個和其他叢集的問題的更多資訊,請參閱 「 知識庫 」 文件 (英文) > 叢集的 SQL Server dos Don'ts,基本警告."

對於那些沒有系統管理員 (sysadmin) 存取的人,鼓勵他們不除非,以高的權限登入絕對必要,不提供每一個這些使用者兩個登入、 一個權限和一個。 預設中使用 nonprivileged 的帳戶,有助於降低成本的錯誤,可能,並也可降低可能性,一個解除鎖定的 Windows 終端機視窗以系統管理員 (sysadmin) 的權限開啟它。 請記住: 深度防禦 !

避免需要系統管理員 (sysadmin) 權限的應用程式最後一點,我會使這裡。 不幸的是,這是一般和無法避免錯誤做法與某些應用程式,但您應避免自製應用程式中的,這個練習,再抱怨需要系統管理員 (sysadmin) 權限的任何應用程式開發人員。

驗證

沒有可用的兩種驗證模式: Windows 驗證和混合模式 (這是結合 SQL Server 驗證的 Windows 驗證)。

Windows 驗證來驗證,被用來連接至 SQL Server 的 Windows 帳戶,使用網路 / 網域帳戶。 如果這在安裝期間選取的 SA 帳戶就會使用隨機產生密碼建立,但有效地停用。 安裝之後立即,,您應該變更為強式和安全性密碼的 SA 密碼,但繼續將帳戶停用,除非絕對必要。

SQL Server 驗證是依賴具有已定義的 SQL Server 帳戶和密碼儲存在 SQL Server 中的每個使用者。 並的不用說時這表示 SA 帳戶已啟用,而且必須要有已定義的密碼。 與 SQL Server 的帳戶驗證使用者,請有至少兩個的使用者名稱和密碼 (一個用於網路),一個用於 SQL Server。 一般建議您只使用 Windows 驗證,盡可能,因為它是更安全的解決方案。 線上叢書 》 主題 < 選擇的驗證模式「 說明這一起如何變更驗證模式的更詳細地。

如果使用 SQL 驗證,則所有的使用者應該會有強式密碼) 的複雜,要能抵抗被猜到密碼破解程式。 這點特別重要的高權限的帳戶,SA 及系統管理員 (sysadmin) 角色的成員。 (其中一個最常見的但最糟的作法,可用來進行有空白的 SA 密碼。 幸好的 SQL Server 2000 SP3,不可能)。

也應該定期變更密碼],並您的公司應該可以發佈公司原則,以協助使用安全性和強式密碼的最佳實務的員工。 如需建立和保護強式密碼的最佳作法概觀,請參閱文件 (英文) 」 強式密碼: 如何建立及使用它們." 您可以將這些原則至企業的原則中。

如果 SQL Server 2005 或 SQL Server 2008 執行 Windows Server 2003 或更新版本的可以請使用 Windows 的密碼原則強制執行複雜性和到期原則的機制。 [SQL Server 2008 線上叢書 》 的區段呼叫 」 密碼原則「 在 SQL Server 中有支援強式密碼和各種不同的密碼原則的相關的資訊。

授權

如我已經已經提到保護系統的要件之一是使用最小權限的原則。 而這直接適用層級系統管理員的權限,它也適用於一般資料庫使用者的權限。 一個資料庫中的使用者應該 (可能) 無法存取在另一個資料庫的資料。 一組資料表的擁有者不應該能夠與他人的資料表的狀況。 使用者只能存取他們應該要存取的資料,即使它們應該只能執行所需的動作 (例如,SELECT,但不是 UPDATE 或 DELETE) 在資料上。

所有這些都可以完成 SQL Server 內由完整、 階層式的使用權限的使用者或角色 (稱為主體) 是授與或拒絕某些特定的權限 (稱為 securables) 特定資源的物件、 結構描述,或資料庫系統。 SQL Server 權限階層架構的概觀如 [圖 4 ] 所示。 這也意味著您遵循最低權限原則。 例如,不讓所有資料庫的 db_owner 角色的開發人員的成員。 限制 [public] 角色的使用權限,並僅授與最低層級 (使用者或角色),以減少直接存取使用權限]。 使用權限的最佳作法的完整討論不在本的篇文章的範圍內,但 SQL Server 2008 線上叢書 》 包括的章節,稱為 「 」 識別和存取控制 (資料庫引擎)」,提供向下切入的清單到所有概念。

fig04.gif

[圖 4 : SQL Server 的使用權限的階層架構

允許更細微的權限] 和 [更好資料庫中的角色區隔,SQL Server 2005 會採用使用者結構描述分隔結構描述是獨立於資料庫使用者的其中,而為只是的容器的物件。 這可讓包括管理權限的更多精確的精確度的許多行為變更。 (四個部分的命名如下格式 Server.database.schema.object SQL Server 2005] 和 [SQL Server 2008 中的 — 格式先前 Server.database.owner.object)

例如,CONTROL 權限的資料庫開發人員,可以建立結構描述。 它們可以 CREATE、 ALTER,以及 DROP 任何物件結構描述中這些控制項,但是它們有在資料庫中任何其他結構描述沒有隱含的權限,且他們不再需要的 db_owner 權限資料庫的開發。 此外,使用者結構描述分隔會讓資料庫使用者被丟棄而不必 recode 所有相關的物件或應用程式使用新的使用者名稱 — 物件成員的結構描述並它們不再繫結至物件的建立者。

這是使用結構描述物件的擁有權,因為基於下列原因之最佳的作法。 SQL Server 2008 線上叢書 》 中的可以找到更多資訊,在主題中 」 使用者的結構描述分隔."

另一個方法,防止使用者執行他們不應該要執行的動作是不允許直接存取您的基底資料表。 這可以藉由提供預存的程序完成,並函式用來將封裝控制項,和隔離作業,例如更新和刪除,檢視,以允許控制及最佳化和所選取。

SQL 資料隱碼攻擊

其中一個最常見的資料未授權存取方法是使用 SQL 資料隱碼攻擊。 SQL 資料隱碼攻擊可以許多形式,但主要的方法會利用程式碼會使用動態建構的字串,」 將 「 未預期的程式碼插入建構。 例如,下列的資料隱碼攻擊也會利用撰寫邏輯驗證技巧 SQL Server 使用者輸入到接受輸入,藉由在輸入字串中包含逸出字元。 雖然 contrived,這個範例中反白顯示程式碼以動態方式建構使用,不徹底驗證的輸入字串時可以發生什麼事:

DECLARE @password VARCHAR (20);
DECLARE @input    VARCHAR (20);
DECLARE @ExecStr  VARCHAR (1000);

SELECT @password = 'SecretSecret';

-- assume application gets input 'OR''='
SELECT @input = '''OR''''=''';

SELECT @ExecStr = 'IF ''' + @password + ''' LIKE ''' + @input + ''' PRINT ''Password Accepted''';

EXEC (@ExecStr);
GO

如果您在執行這個程式碼就會列印片語密碼接受即使使用者輸入清楚地不符合密碼字串。 使用者輸入可包含逸出序列,變更 Transact-SQL) 邏輯,因為輸入是無法正確地剖析,並檢查。

SQL 資料隱碼攻擊應該無法撰寫得當的應用程式發生問題,並且有一些特定的技巧 (例如使用 QUOTENAME 分隔識別項)。 但是,如果繼承的舊的應用程式 (或可能 homebrew 專案,成為在公司的應用程式) 您應該特別測試以查看它是否容易受到 SQL 資料隱碼攻擊。 有很多種技術可以降低 SQL 資料隱碼攻擊。 SQL Server 2008 線上叢書 》 Has 一個完整的區段開頭適當命名的主題" SQL 資料隱碼攻擊."

嚴重損壞修復

多少您需要擔心這取決於您停機時間和資料遺失的需求有哪些。 (如果您沒有已經定義這些需求,您應該 !) 安全性問題,可以發生在多層級中。 嚴重損壞修復牽涉到容錯移轉至另一個 SQL Server 或還原資料庫包含加密的資料,需要時,有一些問題。

在第一種情況下時,發生問題容錯移轉伺服器上不會有已重複存取資料庫所需的登入 — 例如,時使用記錄傳送或資料庫鏡像。 如果資料庫鏡像的執行個體失敗,並且應用程式,可嘗試鏡像伺服器上使用一個特定的登入名稱不存在的連線,應用程式將會收到錯誤 18456 登入失敗 」。 登入是在應用程式系統的一部分,以及必須定義主控資料庫執行個體上。 知識庫文件 918992 」 如何在 SQL Server 2005 的執行個體之間傳送 [登入] 和 [在密碼「 說明如何這麼做,我將在稍後討論疑難排解錯誤 18456。

在第二種情況下問題當資料庫備份包含加密的資料,並在加密金鑰 (或金鑰) 用來加密資料無法備份或就會發生無法還原資料庫的 SQL Server 執行個體中可用。 最佳的情況是只有部分資料庫中資料加密無法存取因此只有該資料的子集。 在最糟的案例案例,是已使用 SQL Server 2008 透明化的資料加密 (TDE) 加密整個資料庫。 在這種情況下如果伺服器憑證用來保護資料庫加密金鑰無法備份或不是可用,無法還原整個資料庫,並會傳回下列錯誤:

Msg 33111, Level 16, State 3, Line 1
Cannot find server certificate with thumbprint
'0xFBFF1103AF133C22231AE2DD1D0CC6777366AAF1'.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

不用說那 TDE 點 — 有人發生在加密資料庫的一個留下備份無法還原它,並存取,機密的資料。 但如果資料是您,且您需要存取,然後您必須在伺服器憑證可用,或,資料會遺失。

加密是一個龐大的主題,本身具有並且全面性的涵蓋範圍中的 SQL Server 2008 線上叢書 》,開始," SQL Server 加密一節。 您也可以觀賞我示範 TDE 並成功還原至可在.com / 秘訣的伴隨視訊 screencast 的第二個執行個體。

稽核

您應該執行以提高系統的安全性,最重要情況之一是實作稽核。 這個,您會知道使用者的內容。 這甚至可能強制您的企業的性質而定。

最低限度,您應該在您可以分辨是否,例如,五次失敗的登入嘗試之後一個成功的稽核成功和失敗的登入。 然後您會知道當有人正嘗試中斷到您的 SQL Server 執行個體 (以及使用的登入)。 設定登入稽核,透過 SQL Server 2005 Management Studio 中的伺服器內容] 對話方塊的 [圖 5 顯示。 失敗的登入稽核,訊息 18456 錯誤記錄檔中的],並錯誤狀態會提供失敗原因。 在不同的狀態,以及疑難排解,長討論最佳描述我無法找到,是內容,以從 SQL 的通訊協定部落格標題的 IL-Sung Lee 」 在 SQL Server 2005 中瞭解 '登入失敗' (錯誤 18456) 錯誤訊息."

fig05.gif

[圖 5 Confi guring 登入 SQL Server 2005 Management Studio 中的稽核

完整的稽核的所有動作的是,難以在 SQL Server 2005 中 (和也會超出本文的範圍)。 需要各種觸發程序和 SQL 追蹤。 在 SQL Server 2008 上,稽核已大幅簡化推出新的功能: SQL Server 稽核。 這被討論在最近,非常詳細白皮書中標題為" SQL Server 2008 中的稽核." 在隨附的視訊 screencast,我會示範 SQL Server 稽核。 您可以在 SQL Server 2008 線上叢書 》 中的其他稽核工具上,以取得詳細資料 」 稽核 (資料庫引擎)一節。

摘要

許多主題和大量的連結,但是,本文的重點。 我想要提供您必須考慮當您在 DBA 人員無法用來處理與安全性的重要安全性主題的概觀。

有一些工具,可協助您檢查您的系統的一般安全性弱點。 第一個會是 Microsoft Baseline Security Analyzer (MBSA) 公用程式,會檢查 Windows、 網路、 檔案系統和一些,甚至 SQL Server 2000 和 SQL Server 2005 的安全性問題。 最新的版本 Microsoft Baseline Security Analyzer 2.1. 一次 SQL Server 2000 和 SQL Server 2005 中,有是 SQL Server–specific 工具呼叫, Best Practices Analyzer(BPA)。 這會檢查您的 SQL Server 組態中使用預先定義的規則清單,並旗標的任何問題 (例如,空白 SA 密碼)。

這些工具都可以搭配 SQL Server 2008。 事實,BPA 則不會釋放的 SQL Server 2008 在已,並已取代,以及使用短期的 SQL Server 2005 介面區組態工具中,我稍早所討論,新的原則為基礎管理功能。 此項取代原因的部分是 BPA] 和 [SAC 是唯讀工具協助您找出問題 — 它們無法解決問題。 原則為基礎的管理提供了許多修正選項以及它可以也用於目標 SQL Server 2000 和 SQL Server 2005 的伺服器。

不用說您應該永遠都使用 Windows Update 以確保新的安全性補充程式和 Service Pack 下載,以安裝適當的時間 — 這是以保持最新的最新的更新程式,最好的方式。 沒有花停機時間超出本的篇文章的範圍但已呈現一些想法,請安裝這些, 2006 年 12 月 SQL Q & A 欄中。

如果您嘗試尋找安全性的一般 Microsoft 資源,有許多將會顯示在您最愛的搜尋引擎的目的地。 若要儲存您解決部分的時間按一下,我會建議兩個金鑰白皮書您應該閱讀。

" SQL Server 2005 安全性最佳 Practices–Operational] 及 [系統管理工作「 和 」 資料庫管理員的 SQL Server 2008: 安全性概觀."

SQL Server 2005,線上叢書 》 的插入安全性區段中,在進入點是主題 」 資料庫的資料庫應用程式的安全性考量." SQL Server 2008,對等的線上叢書 》 進入點是在 「 安全性] 和 [保護 (資料庫引擎)."

從本文 takeaways 是攸,關我希望您瞭解有一些您必須以確保您儲存在 SQL Server 中資料的安全,您需要為通過的步驟。 當您繼承管理其他人的 SQL Server 執行個體時,這方法點特別重要。 很像購買一棟房子的人,您需要要求是否警示運作,是否,大在 fenced 且使用者金鑰的複本。 我在本文所給予的清單來執行是一個很好的開始,但務必您深入在與您相關的區域中更深層]。 為永遠,如果您有任何意見反應] 或 [問題,放我在一行 Paul@SQLskills.com.

Paul S.Randal 是在管理 Director 的 SQLskills.com 在 SQL Server MVP。 他處理 SQL Server 儲存引擎小組在 Microsoft 自 1999 年 2007。 Paul 撰寫 SQL Server 2005 的 DBCC CHECKDB / 修復並且負責核心的儲存引擎在 SQL Server 2008 開發期間。 Paul 是在嚴重損壞修復、 高可用性和維護資料庫的專家,也是一般在世界的會議主持人。 在他的部落格 SQLskills.com/blogs/Paul.