簡(jiǎn)介
本白皮書(shū)面向的對(duì)象是 Microsoft SQL Server 管理員和開(kāi)發(fā)人員,主要是介紹 SQL Server 2000 Service Pack 3 (SP3) 的安全功能。本文討論了安全方面的一些最佳做法,給出了詳細(xì)的建議信息,并提供了一些源代碼示例。最后,列出了安全最佳做法檢查表。本白皮書(shū)的重點(diǎn)是 SQL Server 引擎。有關(guān)復(fù)制、分析服務(wù)或數(shù)據(jù)轉(zhuǎn)換服務(wù)的詳細(xì)討論,請(qǐng)參閱 http://go.microsoft.com/fwlink/?LinkId=15402。
前提
SQL Server 2000 安全是基于 Microsoft Windows NT 4.0® 和 Windows 2000 安全模型實(shí)現(xiàn)的,因此,閱讀本白皮書(shū)的前提是讀者對(duì) Windows NT 4.0 和 Windows 2000 安全有一個(gè)基本的了解。另外一個(gè)前提就是,讀者理解域、全局組、本地組和用戶(hù)帳戶(hù)應(yīng)用于 Windows NT 4.0 安全上下文時(shí)的概念,以及 Windows 2000 中 Microsoft Active Directory ®的概念。
中國(guó)網(wǎng)管論壇bbs.bitsCN.com
對(duì)于那些對(duì)代碼示例感興趣的讀者,學(xué)習(xí) Microsoft Visual Basic® 和結(jié)構(gòu)化查詢(xún)語(yǔ)言 (SQL) 有助于增強(qiáng)理解。此外,有使用 SQL 分布式管理對(duì)象 (SQL-DMO) 的經(jīng)驗(yàn)對(duì)理解本白皮書(shū)中的內(nèi)容也大有好處。
但是,即便是那些對(duì) Windows NT 4.0、Windows 2000 或 SQL Server 知之甚少的讀者,通過(guò)閱讀本文,也將對(duì)使用這些產(chǎn)品時(shí)的安全性有一個(gè)大概的了解。
SQL Server 2000 安全模型
SQL Server 2000 安全模型是基于 Windows 安全模型實(shí)現(xiàn)的。有關(guān) Windows 安全最佳做法的詳細(xì)討論,請(qǐng)參閱 http://go.microsoft.com/fwlink/?LinkId=15392。
應(yīng)該按圖 1 所示保護(hù) SQL Server 2000 的安全。

圖 1:Windows 用戶(hù)和組為 SQL Server 管理員提供了強(qiáng)大且靈活的安全模型
上圖中的步驟可以總結(jié)為如下幾點(diǎn):
1. 將每個(gè)域中的用戶(hù)指派到 Windows 全局組。
2. 將各個(gè)域中的 Windows 全局組放入 Windows 本地組。
3. 授予 Windows 本地組登錄 SQL Server 2000 的權(quán)限。
4. 授予 Windows 本地組訪問(wèn)適當(dāng)數(shù)據(jù)庫(kù)的權(quán)限。此 Windows 本地組可能與步驟 3 中被授予登錄權(quán)限的本地組不同。因此,通常重復(fù)步驟 1 和 2 來(lái)按需要的訪問(wèn)權(quán)限組織用戶(hù)。
bitscn_com
5. 為 Windows 本地組分配對(duì)特定數(shù)據(jù)庫(kù)對(duì)象的訪問(wèn)權(quán)限。
另一種實(shí)現(xiàn)安全的途徑是基于角色的使用,通常通過(guò)如圖 2 所示的方式來(lái)實(shí)現(xiàn)。

圖 2:基于角色的安全是 SQL Server 2000 中的另一個(gè)安全選項(xiàng)
當(dāng)使用角色來(lái)分配對(duì)象權(quán)限時(shí),仍然需要使用建議的方法為各個(gè)用戶(hù)授予對(duì)服務(wù)器和數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限。
步驟 1 到步驟 4 與圖 1 中基本相同,所不同的只是可能不必創(chuàng)建多個(gè) Windows 全局組和本地組。同時(shí),它還對(duì) Windows 2000 通用組提供完全支持。
步驟 5:將各個(gè) Windows 帳戶(hù)和 Windows 組分配給某個(gè)角色。
步驟 6:為角色分配對(duì)象訪問(wèn)權(quán)限。
使用角色,通過(guò)在 SQL Server 2000 內(nèi)組織用戶(hù)而減少了在 Windows 內(nèi)組織用戶(hù)的需要。
身份驗(yàn)證模式
SQL Server 2000 提供兩種身份驗(yàn)證模式來(lái)保護(hù)對(duì)服務(wù)器訪問(wèn)的安全:Windows 身份驗(yàn)證模式和混合模式。
Windows 身份驗(yàn)證模式
Windows 身份驗(yàn)證模式是 SQL Server 2000 中的默認(rèn)身份驗(yàn)證模式。在 Windows 身份驗(yàn)證模式下,SQL Server 2000 僅依賴(lài)用戶(hù)的 Windows 身份驗(yàn)證。然后,授予 Windows 用戶(hù)或組對(duì) SQL Server 的訪問(wèn)權(quán)限。使用此模式與服務(wù)器建立的連接稱(chēng)為信任連接。
中國(guó)網(wǎng)管聯(lián)盟www.bitscn.com
當(dāng)使用 Windows 身份驗(yàn)證模式時(shí),數(shù)據(jù)庫(kù)管理員通過(guò)授予用戶(hù)登錄 SQL Server 2000 的權(quán)限來(lái)允許他們?cè)L問(wèn)運(yùn)行 SQL Server 的計(jì)算機(jī)。Windows 安全標(biāo)識(shí)符 (SID) 用于跟蹤已經(jīng)過(guò) Windows 驗(yàn)證的登錄。使用 Windows SID,數(shù)據(jù)庫(kù)管理員可以直接授予 Windows 用戶(hù)或組登錄權(quán)限。
混合模式
在混合模式下,可以使用 Windows 身份驗(yàn)證或 SQL Server 身份驗(yàn)證對(duì)用戶(hù)進(jìn)行驗(yàn)證。SQL Server 負(fù)責(zé)維護(hù)經(jīng)過(guò) SQL Server 身份驗(yàn)證的用戶(hù)的用戶(hù)名和密碼對(duì)。
如果客戶(hù)端和服務(wù)器能夠使用 NTLM 或 Kerberos 登錄身份驗(yàn)證協(xié)議,則以混合模式連接的 SQL Server 就像使用 Windows 身份驗(yàn)證模式一樣,也依賴(lài) Windows 來(lái)驗(yàn)證用戶(hù)身份。如果客戶(hù)端無(wú)法使用標(biāo)準(zhǔn) Windows 登錄,則 SQL Server 要求提供用戶(hù)名和密碼對(duì),并將其與存儲(chǔ)在系統(tǒng)表中的用戶(hù)名和密碼對(duì)進(jìn)行比較。依賴(lài)用戶(hù)名和密碼對(duì)的連接稱(chēng)為非信任連接或 SQL 連接。
在內(nèi)部使用安全標(biāo)識(shí)號(hào)
SQL Server 使用 SID 跟蹤信任的登錄。可以直接對(duì) Windows 用戶(hù)和組授予對(duì)數(shù)據(jù)庫(kù)或特定數(shù)據(jù)庫(kù)對(duì)象的訪問(wèn)權(quán)限。例如,Jane 同時(shí)是 Windows 中 SALES 和 MARKETING 組的成員。SALES 組被授予了登錄 SQL Server 以及訪問(wèn) pubs 數(shù)據(jù)庫(kù)的權(quán)限。管理員可以通過(guò) Jane 的 Windows 名稱(chēng) REDMOND\Jane 授予其訪問(wèn) authors 表的權(quán)限。Windows 帳戶(hù)必須通過(guò)域和用戶(hù)名來(lái)引用。在這種情況下,Jane 的 SID 將存儲(chǔ)在 pubs 數(shù)據(jù)庫(kù)的系統(tǒng)表中。SQL Server 2000 不支持用戶(hù)主體名 (UPN)。例如,如果 Windows 登錄包含域 SALES 和用戶(hù)名 SOMEONE,那么登錄到 SQL Server 時(shí)應(yīng)使用 SALES\SOMEONE,而不能使用 Windows 2000 Active Directory 所支持的 SOMEONE@MYCOMPANY.COM 形式的登錄。
feedom.net
角色
角色的使用與 Windows 組的使用很相似。通過(guò)角色,可以將用戶(hù)集中到一個(gè)單元中,然后對(duì)這個(gè)單元應(yīng)用權(quán)限。對(duì)角色授予、拒絕或吊銷(xiāo)權(quán)限時(shí),將對(duì)其中的所有成員生效。可以用角色來(lái)代表一個(gè)組織中某一類(lèi)工作人員所執(zhí)行的某項(xiàng)工作,然后對(duì)該角色授予權(quán)限。當(dāng)工作人員執(zhí)行該項(xiàng)工作時(shí),便成為該角色的成員;而當(dāng)不再執(zhí)行該項(xiàng)工作時(shí),便不再是該角色的成員。這樣,就不必在用戶(hù)接受或離開(kāi)某項(xiàng)工作時(shí),反復(fù)地授予、拒絕或吊銷(xiāo)每個(gè)用戶(hù)的權(quán)限。
角色的功能之所以如此強(qiáng)大,其中涉及到了許多關(guān)鍵的概念。首先,除固定的服務(wù)器角色外,其他角色都是在數(shù)據(jù)庫(kù)內(nèi)部實(shí)現(xiàn)的。這意味著數(shù)據(jù)庫(kù)管理員無(wú)需依賴(lài) Windows 管理員來(lái)組織用戶(hù)。第二,角色可以嵌套。嵌套的深度沒(méi)有限制,但不允許循環(huán)嵌套。第三,數(shù)據(jù)庫(kù)用戶(hù)可以同時(shí)是多個(gè)角色的成員。
因?yàn)榻巧倪@些特性,使得數(shù)據(jù)庫(kù)管理員可以安排權(quán)限的層次結(jié)構(gòu),以反映使用數(shù)據(jù)庫(kù)的組織的管理結(jié)構(gòu)。例如,財(cái)務(wù)部門(mén)可能包含分別負(fù)責(zé)應(yīng)付帳款和應(yīng)收帳款的不同組。數(shù)據(jù)庫(kù)管理員可以分別為 APEmployees 和 AREmployees 創(chuàng)建不同的數(shù)據(jù)庫(kù)角色,并只對(duì)每個(gè)角色分配完成相應(yīng)工作的雇員所需的權(quán)限。然后,數(shù)據(jù)庫(kù)管理員可以創(chuàng)建一個(gè) FinManagers 角色,并使之包含這兩個(gè)限制較多的角色(APEmployees 和 AREmployees)。這樣,F(xiàn)inManagers 將具有他們的直接下屬雇員的所有權(quán)限。當(dāng)某個(gè)負(fù)責(zé)應(yīng)付帳款的雇員被提升為管理人員時(shí),數(shù)據(jù)庫(kù)管理員只需要將其添加到 FinManagers 角色中即可。
網(wǎng)管網(wǎng)bitsCN.com
public 角色
public 角色在每個(gè)數(shù)據(jù)庫(kù)(包括系統(tǒng)數(shù)據(jù)庫(kù) master、msdb、tempdb 和 model)中都存在。public 角色提供數(shù)據(jù)庫(kù)中用戶(hù)的默認(rèn)權(quán)限,不能刪除。其功能相當(dāng)于 Windows NT 4.0 環(huán)境中的 Everyone 組。每個(gè)數(shù)據(jù)庫(kù)用戶(hù)都自動(dòng)是此角色的成員,因此,無(wú)法在此角色中添加或刪除用戶(hù)。
預(yù)定義角色
SQL Server 2000 包括幾個(gè)預(yù)定義的角色。這些角色具有預(yù)定義的、不能授予其他用戶(hù)帳戶(hù)的內(nèi)在權(quán)限。有兩種類(lèi)型的預(yù)定義角色:固定服務(wù)器角色和固定數(shù)據(jù)庫(kù)角色。
固定服務(wù)器角色
固定服務(wù)器角色的作用域在服務(wù)器范圍內(nèi)。它們存在于數(shù)據(jù)庫(kù)之外。固定服務(wù)器角色的每個(gè)成員都能夠向該角色中添加其他登錄。
注意 Windows BUILTIN\Administrators 組(本地管理員組)的所有成員都默認(rèn)是 sysadmin 角色的成員。
表 1列出了 SQL Server 2000 中存在的固定服務(wù)器角色。

表 1:SQL Server 2000 固定服務(wù)器角色
要將用戶(hù)添加到固定服務(wù)器角色中,請(qǐng)使用下列 Transact-SQL 語(yǔ)句:
/* Add Bob to the sysadmin server role */
網(wǎng)管網(wǎng)bitsCN_com
exec sp_addsrvrolemember "REDMOND\Bob", "sysadmin"
可以將 Windows 用戶(hù)和組添加到服務(wù)器角色中。下列代碼顯示了如何使用 SQL 分布式管理對(duì)象 (DMO) 集合將用戶(hù)添加到服務(wù)器角色中:
' Declare variables
Dim oServer As SQLDMO.SQLServer
' Create a server object and connect
Set oServer = CreateObject("SQLDMO.SQLServer")
oServer.Connect ("SERVERNAME")
' Add Bob to the sysadmin server role
oServer.ServerRoles("sysadmin").AddMember ("REDMOND\Bob")
有關(guān)如何使用固定服務(wù)器角色的詳細(xì)信息,請(qǐng)參閱 SQL Server 聯(lián)機(jī)叢書(shū)。
固定數(shù)據(jù)庫(kù)角色
固定數(shù)據(jù)庫(kù)角色在數(shù)據(jù)庫(kù)級(jí)別定義,并在每個(gè)數(shù)據(jù)庫(kù)中都存在。db_owner 和 db_security 管理員角色的成員可以管理固定數(shù)據(jù)庫(kù)角色的成員身份;但是,只有 db_owner 角色可以將其他用戶(hù)添加到 db_owner 固定數(shù)據(jù)庫(kù)角色中。
表 2 列出了 SQL Server 2000 中存在的固定數(shù)據(jù)庫(kù)角色。

表 2:SQL Server 2000 固定數(shù)據(jù)庫(kù)角色
|