SQL Server 2008中的細(xì)粒度權(quán)限
SQL Server 2008 和 SQL Server 2005 比舊版安全的諸多方面之一就是改進(jìn)了權(quán)限的粒度。以前,管理員必須授予用戶固定服務(wù)器角色或固定數(shù)據(jù)庫(kù)角色的成員,以執(zhí)行特定的操作,但這些角色的權(quán)限通常會(huì)遠(yuǎn)遠(yuǎn)超出簡(jiǎn)單任務(wù)的需要?!白钌偬貦?quán)”的原則要求用戶只能擁有完成工作所需的最低權(quán)限,因此為達(dá)到小目標(biāo)而分配用戶高級(jí)角色就違背了該原則。
從 SQL Server 2000開(kāi)始,固定服務(wù)器和數(shù)據(jù)庫(kù)角色集已發(fā)生了巨大變化,當(dāng)用戶或應(yīng)用程序需要所有或大多數(shù)已定義的權(quán)限時(shí),仍可利用這些預(yù)定義的權(quán)限?;蛟S最大的變化就是添加了 public 服務(wù)器角色。但是,“最少特權(quán)”的原則要求用戶不能使用無(wú)法恰好提供主體完成工作所需權(quán)限的角色。雖然為發(fā)現(xiàn)及分配主體所需權(quán)限需要更多工作,但這會(huì)帶來(lái)更加安全的數(shù)據(jù)庫(kù)環(huán)境。
主體和安全實(shí)體
在 SQL Server 2008中,“主體”就是可以訪問(wèn)受保護(hù)資源且能獲得訪問(wèn)資源所需權(quán)限的任何個(gè)人、組或流程。與舊版 SQL Server 一樣,可以在 Windows 中定義主體,也可將沒(méi)有對(duì)應(yīng) Windows 主體的 SQL Server 登錄作為其基礎(chǔ)。下面的列表顯示了 SQL Server 2008主體的層次結(jié)構(gòu),但不包括固定服務(wù)器和數(shù)據(jù)庫(kù)角色,還顯示了將登錄和數(shù)據(jù)庫(kù)用戶映射為安全對(duì)象的方法。主體的影響范圍取決于它的定義范圍,這樣 Windows 級(jí)別的主體就比 SQL Server 級(jí)別的主體擁有更大的影響范圍,而后者的影響范圍又大于數(shù)據(jù)庫(kù)級(jí)別的主體。每個(gè)數(shù)據(jù)庫(kù)用戶都會(huì)自動(dòng)隸屬于固定的 public 角色。
Windows 級(jí)別的主體
Windows 域登錄
Windows 本地登錄
Windows 組
SQL Server 級(jí)別的主體
SQL Server登錄
映射為 Windows 登錄的 SQL Server 登錄
映射為證書的 SQL Server 登錄
映射為不對(duì)稱密鑰的 SQL Server 登錄
數(shù)據(jù)庫(kù)級(jí)別的主體
數(shù)據(jù)庫(kù)用戶
映射為 SQL Server 登錄的數(shù)據(jù)庫(kù)用戶
映射為 Windows 登錄的數(shù)據(jù)庫(kù)用戶
映射為證書的數(shù)據(jù)庫(kù)用戶
映射為不對(duì)稱密鑰的數(shù)據(jù)庫(kù)用戶
數(shù)據(jù)庫(kù)角色
應(yīng)用程序角色
公共角色
授權(quán)的另一部分就是可用以保護(hù)權(quán)限授予操作或拒絕授予操作的對(duì)象。圖4列出了SQL Server 2008 中安全實(shí)體對(duì)象的層次結(jié)構(gòu)。在服務(wù)器級(jí)別,可以保護(hù)網(wǎng)絡(luò)端點(diǎn),以控制進(jìn)出服務(wù)器的通信通道,以及數(shù)據(jù)庫(kù)、綁定角色和登錄。在數(shù)據(jù)庫(kù)和架構(gòu)級(jí)別,用戶創(chuàng)建的每一個(gè)對(duì)象都被當(dāng)作安全主體,包括那些駐留在架構(gòu)中的對(duì)象。
服務(wù)器
數(shù)據(jù)庫(kù)
端點(diǎn)
遠(yuǎn)程綁定
路由
SQL Server登錄
數(shù)據(jù)庫(kù)
應(yīng)用程序角色
程序集
不對(duì)稱密鑰
證書
數(shù)據(jù)庫(kù)用戶
固定數(shù)據(jù)庫(kù)角色
全文目錄
消息類型
服務(wù)
服務(wù)合同
對(duì)稱密鑰
架構(gòu)
默認(rèn)
函數(shù)
過(guò)程
查詢狀態(tài)
隊(duì)列
規(guī)則
同義詞
表
觸發(fā)器
類型
視圖
XML架構(gòu)集合
圖1:SQL Server 2008中的安全實(shí)體對(duì)象層次結(jié)構(gòu)
角色和權(quán)限
要了解可在 SQL Server 中可用的權(quán)限數(shù)量,可以調(diào)用 fn_builtin_permissions 系統(tǒng)函數(shù):
SELECT * FROM sys.fn_builtin_permissions(default)
下面是 SQL Server 2005 中的新權(quán)限類型:
CONTROL。授予與所有者類似的權(quán)限,可有效地將所有已定義的權(quán)限授予對(duì)象及其范圍內(nèi)的所有對(duì)象,包括能夠授予其他被授予者任何權(quán)限。CONTROL SERVER 相當(dāng)于授予 sysadmin 特權(quán)。
ALTER。授予權(quán)限以更改安全實(shí)體對(duì)象的任何屬性,但修改所有權(quán)除外。從本質(zhì)上講,它將為同一范圍內(nèi)的 ALTER、CREATE 或 DROP 安全實(shí)體對(duì)象授予權(quán)限。例如,為數(shù)據(jù)庫(kù)授予 ALTER 權(quán)限就可以修改它的表。
ALTER ANY <安全實(shí)體對(duì)象>。授予權(quán)限以修改指定類型的任何安全實(shí)體對(duì)象。例如,授予 ALTER ANY ASSEMBLY 就可以修改數(shù)據(jù)庫(kù)中的任何 .NET 程序集,而在服務(wù)器級(jí)別授予 ALTER ANY LOGIN,則用戶將可修改該服務(wù)器上的任何登錄。
IMPERSONATE ON <登錄或用戶>。 授予權(quán)限以扮演特定用戶或登錄。本章稍后將講到,該權(quán)限是為存儲(chǔ)過(guò)程切換執(zhí)行上下文所必需的。在以批處理方式執(zhí)行扮演時(shí)也需要該權(quán)限。
TAKE OWNERSHIP。授予權(quán)限以保證獲得對(duì)安全實(shí)體的所有權(quán),使用的是 ALTER AUTHORIZATION 語(yǔ)句。
SQL Server 2008 仍然使用大家熟悉的 GRANT、DENY 和 REVOKE 架構(gòu),將安全實(shí)體對(duì)象的權(quán)限分配或拒絕分配主體。GRANT 語(yǔ)句現(xiàn)在提供了所有的新權(quán)限選項(xiàng),如授予范圍以及主體是否能夠向其他主體授予權(quán)限等。SQL Server 不允許使用跨數(shù)據(jù)庫(kù)權(quán)限。要授予此類權(quán)限,要在每個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建復(fù)制用戶,并分別為各個(gè)數(shù)據(jù)庫(kù)的用戶分配該權(quán)限。
與舊版 SQL Server 類似,激活應(yīng)用程序角色時(shí),其他權(quán)限在角色激活期間內(nèi)都會(huì)被暫時(shí)取消。然后,在 SQL Server 2008 和 SQL Server 2005中,可以取消設(shè)置應(yīng)用程序角色。SQL Server 2000 與新版本之間的另一個(gè)區(qū)別就是,在激活應(yīng)用程序角色時(shí),角色也會(huì)暫時(shí)取消任何服務(wù)器特權(quán),包括 public。例如,如為 public 授予 VIEW ANY DEFINITION,則應(yīng)用程序角色將不會(huì)允許使用該權(quán)限。在應(yīng)用程序角色上下文中訪問(wèn)服務(wù)器級(jí)元數(shù)據(jù)時(shí),這一點(diǎn)最明顯。
注釋 應(yīng)用程序角色的新首選替代方法就是在代碼模塊中使用執(zhí)行上下文。有關(guān)更多信息,請(qǐng)參閱本文的“執(zhí)行上下文”部分。
授予特定權(quán)限隱含地可以傳送其他權(quán)限的權(quán)利。例如,架構(gòu)的 ALTER 權(quán)限“涵蓋”更細(xì)的粒度和低級(jí)權(quán)限,這些都是隱式定義的。圖5為 ALTER SCHEMA 的隱含權(quán)限。請(qǐng)參閱 SQL Server Books Online 上的“Covering/Implied Permissions (Database Engine)”,以了解ImplyingPermissions 用戶定義函數(shù)的 Transact-SQL 代碼,該函數(shù)從sys.fn_builtin_permissions 目錄視圖中收集層次結(jié)構(gòu)列表,并識(shí)別層次結(jié)構(gòu)中每種權(quán)限的深度。在主數(shù)據(jù)庫(kù)中添加 ImplyingPermissions 后,執(zhí)行該語(yǔ)句將產(chǎn)生圖5的結(jié)果,傳入對(duì)象和權(quán)限類型:
SELECT * FROM master.dbo.ImplyingPermissions('schema', 'alter')
ORDER BY height, rank
這是瀏覽 SQL Server 2008 權(quán)限層次結(jié)構(gòu)的理想方法。
圖2:ALTER SCHEMA 的隱含權(quán)限層次結(jié)構(gòu)
考慮可用的主體數(shù)量和類型、服務(wù)器和典型數(shù)據(jù)庫(kù)中的安全實(shí)體對(duì)象數(shù)量,以及可用權(quán)限、涵蓋權(quán)限、隱含權(quán)限的數(shù)量時(shí),會(huì)很容易發(fā)現(xiàn) SQL Server 2008中的權(quán)限的粒度非常細(xì)。創(chuàng)建數(shù)據(jù)庫(kù)需要對(duì)其安全需要進(jìn)行更詳細(xì)的分析,并謹(jǐn)慎控制所有對(duì)象的權(quán)限。不過(guò),這種分析工作是值得做的,使用SQL Server 2008中的這些功能會(huì)使數(shù)據(jù)庫(kù)更加安全。
- SQL Server 2008數(shù)據(jù)集成服務(wù)簡(jiǎn)介
- 在SQL Server 2008中管理報(bào)表服務(wù)
- 利用SQL Server 2008進(jìn)行自動(dòng)化管理