管理Azure SQL數(shù)據(jù)庫的授權(quán)安全性
在規(guī)劃微軟Azure SQL Database部署時(shí),一定要考慮所有需要在深度防御策略中實(shí)現(xiàn)的安全措施。我們已經(jīng)在前面一篇文章中詳細(xì)介紹了實(shí)現(xiàn)基于防火墻的保護(hù)措施的一個(gè)方面。此外,我們還概括介紹了這個(gè)平臺(tái)即服務(wù)(PaaS)產(chǎn)品中內(nèi)置的驗(yàn)證、授權(quán)與加密特性?,F(xiàn)在是時(shí)候更深入了解一些支持細(xì)粒度控制數(shù)據(jù)訪問的授權(quán)方法了,它們最多可以深入到控制各個(gè)數(shù)據(jù)庫對(duì)象和語句類型。
在很大程度上,Azure SQLDatabase集成的驗(yàn)證與授權(quán)機(jī)制基于成熟SQL Server實(shí)例所使用的相同原則,它既可以部署在內(nèi)部網(wǎng)絡(luò),也可以部署在Azure IaaS虛擬機(jī)上。然而,它們之間有一些值得注意的重要區(qū)別。在驗(yàn)證方面,最重要的一點(diǎn)是缺少Windows集成身份驗(yàn)證的支持。實(shí)際上,在每次建立SQL Database連接時(shí),用戶都必須明確指定他們的登錄身份。這種方式與傳統(tǒng)SQL Server身份驗(yàn)證方式相同,即便如此,還有一個(gè)重要的小問題。具體地說就是密碼重置,它會(huì)在本地使用場(chǎng)景中觸發(fā)自動(dòng)重新驗(yàn)證,從而導(dǎo)致會(huì)話中斷,即要求中斷當(dāng)前會(huì)話,并且在重新連接之后才能繼續(xù)使用Azure SQL Database。(選擇采用這種方式的原因是為了消除自動(dòng)重新連接可能對(duì)性能造成的負(fù)面影響,這對(duì)于基于云的服務(wù)而言尤為重要。)
從授權(quán)角度看,Azure SQLDatabase實(shí)現(xiàn)了方法更適合用在服務(wù)器層次上。最明顯的原因是,現(xiàn)在不能使用權(quán)限最高的sa登錄帳號(hào)和相應(yīng)的sysadmin SQL服務(wù)器角色(以及所有其他固定的服務(wù)器角色)。相反,在管理一個(gè)托管各個(gè)SQL Database的邏輯SQL Server(包括表示一個(gè)數(shù)據(jù)庫管理單元的Azure平臺(tái)結(jié)構(gòu))時(shí),必須用到主數(shù)據(jù)庫中預(yù)定義的兩個(gè)角色,其中包括:
- loginmanager -分配了足夠創(chuàng)建和管理登錄帳號(hào)的權(quán)限(而不是securityadmin固定服務(wù)器角色)
- dbmanager -分配了創(chuàng)建和管理數(shù)據(jù)庫的權(quán)限(而不是dbcreator固定服務(wù)角色)
這個(gè)區(qū)別體現(xiàn)在服務(wù)級(jí)安全性的管理方式上,它可以避免管理員過分依賴于Object Explorer of the SQL Server Management Studio中Security文件夾的圖形界面,迫使他們?cè)谶B接主數(shù)據(jù)庫時(shí)執(zhí)行相應(yīng)的T-SQL語句。(雖然SQL ServerManagement Studio會(huì)通過將連接自動(dòng)重定向主數(shù)據(jù)庫并在查詢窗口自動(dòng)生成SQL登錄模板來實(shí)現(xiàn)透明的登錄過程)。
用戶數(shù)據(jù)庫角色與傳統(tǒng)SQL Server實(shí)現(xiàn)的已有角色相對(duì)應(yīng),并且包含以下角色:
- db_accessadmin分配了用于創(chuàng)建和管理數(shù)據(jù)庫用戶的權(quán)限。
- db_backupoperator分配了用于備份數(shù)據(jù)庫的權(quán)限。
- db_datareader分配了用于從所有數(shù)據(jù)庫表和視圖讀取數(shù)據(jù)的權(quán)限。
- db_datawriter分配了用于向所有數(shù)據(jù)庫表和視圖寫入數(shù)據(jù)的權(quán)限。
- db_ddladmin分配了用于在數(shù)據(jù)庫創(chuàng)建和管理對(duì)象的權(quán)限。
- db_denydatareader拒絕從數(shù)據(jù)庫任何一個(gè)表和視圖讀取數(shù)據(jù)的權(quán)限。
- db_denydatawriter拒絕向數(shù)據(jù)庫任何一個(gè)表和視圖寫入數(shù)據(jù)的權(quán)限。
- db_owner分配了用于執(zhí)行所有數(shù)據(jù)庫配置和管理的權(quán)限。
- db_securityadmin分配了用于管理數(shù)據(jù)庫角色成員和權(quán)限的權(quán)限。
如果想要進(jìn)一步細(xì)分訪問權(quán)限,那么可以選擇使用模式級(jí)和對(duì)象級(jí)安全性,這就像數(shù)據(jù)庫角色一樣,與管理員熟悉的本地?cái)?shù)據(jù)庫管理完全相同。具體地,你可以使用GRANT、REVOKE和DENY T-SQL語句控制每一個(gè)模式、對(duì)象實(shí)例或語句層次的權(quán)限。一定要記住,DENY優(yōu)先級(jí)高于顯式分配或基于角色的權(quán)限。
要?jiǎng)?chuàng)建登錄帳號(hào),你需要?jiǎng)?chuàng)建一個(gè)主數(shù)據(jù)庫連接會(huì)話,而創(chuàng)建用戶帳號(hào)需要直接連接目標(biāo)數(shù)據(jù)庫。這一點(diǎn)非常重要,因?yàn)橥粋€(gè)會(huì)話無法切換數(shù)據(jù)庫上下文(原來通常可以通過執(zhí)行語句USEdatabase T-SQL語句)——相反,你必須為每一個(gè)需要管理的數(shù)據(jù)庫建立獨(dú)立的會(huì)話。初始登錄帳號(hào)(也就是服務(wù)器級(jí)主登錄帳號(hào))和主數(shù)據(jù)庫中相同名稱的用戶都是初始化SQL Server實(shí)例時(shí)自動(dòng)創(chuàng)建的,無論是使用AzureManagement Portal、Azure PowerShell模塊還是執(zhí)行相應(yīng)的REST API初始化都是這樣。從授權(quán)角度看,這個(gè)登錄帳號(hào)是唯一的,因?yàn)樗[含就分配了loginmanager和dbmanager角色所關(guān)聯(lián)的權(quán)限(即便它實(shí)際上不是這些角色的成員)。此外,你可以用它連接同一個(gè)邏輯服務(wù)器的任何一個(gè)數(shù)據(jù)庫。
因此,你可以使用CREATE LOGIN T-SQL語句創(chuàng)建更多的登錄帳號(hào)(查詢主數(shù)據(jù)庫的sys.sql_logins視圖就可以列舉所有的登錄帳號(hào))。要想使用這些帳號(hào)信息連接任何一個(gè)數(shù)據(jù)庫(包括主數(shù)據(jù)庫),必須先在該數(shù)據(jù)庫上創(chuàng)建一個(gè)相對(duì)應(yīng)的用戶帳號(hào)。實(shí)際上,如果想要指定一個(gè)loginmanager或dbmanager角色的新成員,則需要先使用服務(wù)器級(jí)主登錄帳號(hào)登錄主數(shù)據(jù)庫,創(chuàng)建一個(gè)新的登錄帳號(hào),然后再創(chuàng)建一個(gè)與此登錄帳號(hào)相關(guān)聯(lián)的用戶(使用CREATEUSER (...) FROM LOGIN T-SQL語句),最后再執(zhí)行sp_addrolemember存儲(chǔ)過程。類似地,如果想讓這些登錄帳號(hào)可用于連接或管理任何一個(gè)用戶數(shù)據(jù)庫,則需要先連接該數(shù)據(jù)庫,在該數(shù)據(jù)庫上創(chuàng)建一個(gè)關(guān)聯(lián)的用戶帳號(hào)(同樣是使用 T-SQL語句),最后再執(zhí)行sp_addrolemember存儲(chǔ)過程將新創(chuàng)建的用戶分配給一個(gè)或多個(gè)數(shù)據(jù)庫級(jí)角色。然而,如果dbmanager的成員需要連接他們自己創(chuàng)建的數(shù)據(jù),則不受這個(gè)要求的限制,因?yàn)樗麄冸[含已經(jīng)關(guān)聯(lián)到dbo用戶帳號(hào)(這意味著它已經(jīng)是db_owner角色的成員)。
這就是我們總結(jié)的Azure SQLDatabase數(shù)據(jù)保護(hù)管理方法,其重點(diǎn)是使用權(quán)限作為防御未授權(quán)訪問的額外措施。在后續(xù)文章中,我們將繼續(xù)介紹在云和混合環(huán)境中運(yùn)行SQL Server的相關(guān)問題。