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