微軟發(fā)布了一個(gè)Azure SQL數(shù)據(jù)庫(kù)的預(yù)覽版新特性,它稱為行級(jí)安全性(RLS)。因?yàn)檫@個(gè)特性還是預(yù)覽版,因此它還不適合用于生產(chǎn)負(fù)載,并且還沒有得到全面支持。RLS可以根據(jù)用戶執(zhí)行一個(gè)查詢的特征(如:分組成員或執(zhí)行環(huán)境)來控制數(shù)據(jù)庫(kù)表中行的訪問。
在2015年4月,所有地區(qū)的V12部署都可以使用RLS。此外,這個(gè)特性也會(huì)出現(xiàn)在下一個(gè)本地版SQL Server中,即SQL Server 2016。由于微軟已經(jīng)全力投身于云優(yōu)先的戰(zhàn)略中,因此RLS等Azure特性出現(xiàn)在未來版本的SQL Server也在情理之中。
Oracle和DB2的DBMS產(chǎn)品在很多年前就有這個(gè)特性了。SQL Server用戶一直在使用各種方法來處理行級(jí)安全性的需求。如果要將一個(gè)使用了RLS的應(yīng)用程序后臺(tái)從Oracle或DB2數(shù)據(jù)庫(kù)遷移到SQL Server,則需要在遷移過程中在應(yīng)用程序或數(shù)據(jù)庫(kù)上增加很多代碼。新的RLS特性仍然需要一定的實(shí)現(xiàn)工作,但是工作量已經(jīng)減少了,因?yàn)檫^濾功能已經(jīng)根據(jù)一個(gè)集中定義的安全功能邏輯而自動(dòng)部署到基本表上了。
我們?nèi)匀恍枰环N方法將特定行的安全性“映射”到一個(gè)用戶特征值上。它可能是一個(gè)具體的用戶名或用戶的數(shù)據(jù)庫(kù)角色成員。目標(biāo)數(shù)據(jù)庫(kù)中每一個(gè)表都需要增加一個(gè)字段,或者讓安全函數(shù)聯(lián)合一個(gè)或多個(gè)幫助表,從而查找行的分配。安全邏輯可簡(jiǎn)單可復(fù)雜,具體取決于實(shí)際的需求。此外,如果一個(gè)有RLS的表聯(lián)合了一個(gè)沒有RLS的表,那么其結(jié)果集仍然會(huì)根據(jù)安全上下文進(jìn)行過濾。
行級(jí)安全性的優(yōu)點(diǎn)
粗略地看,它的主要優(yōu)點(diǎn)似乎是增加安全性和可能簡(jiǎn)化查詢。但是,簡(jiǎn)化查詢可能是考慮使用RLS的主要原因。在啟動(dòng)RLS之后,系統(tǒng)會(huì)在更細(xì)粒度級(jí)別上限制用戶的訪問。如果用戶身份信息受到攻擊,那么可攻擊范圍將縮小,SQL注入攻擊的影響也很小。例如,一個(gè)應(yīng)用程序可能現(xiàn)在使用了下面的語句:
現(xiàn)在很容易通過一個(gè)SQL注入攻擊將“A”改為“B”或其他的查詢條件,從而直接查詢數(shù)據(jù)庫(kù),得到其他不同的結(jié)果。在啟動(dòng)RLS之后,這種攻擊是不可能生效的。
使用等級(jí)安全性
最終用戶不會(huì)意識(shí)到RLS的存在。實(shí)現(xiàn)RLS需要一定的工作,但是完全不需要修改代碼。事實(shí)上,它可以讓查詢變得更簡(jiǎn)單,因?yàn)橛脩粢呀?jīng)限制為只能查詢他們有訪問權(quán)限的特定行數(shù)。要考慮在現(xiàn)有應(yīng)用程序中實(shí)現(xiàn)RLS。
按照預(yù)期,要實(shí)現(xiàn)這一層安全性還需要完成一定的工作。這其中包括確定哪一些表需要修改,以及如何更高效地將用戶身份映射到行級(jí)數(shù)據(jù)上。但是,這還不是全部開銷;RLS的本質(zhì)是在基礎(chǔ)表的每一個(gè)查詢上增加另一層判斷邏輯,限制查詢所返回的行數(shù)。這可能會(huì)影響訪問該表的所有查詢的性能。
許多全新特性都一樣,它們通常也會(huì)有很多局限性。這個(gè)特性也不例外。RLS不兼容針對(duì)內(nèi)存優(yōu)化的表和變更數(shù)據(jù)捕捉。此外,如果不用RLS保護(hù),F(xiàn)ull Text Indices(全文索引)和DBCC SHOW_STATISTICS也可能“泄漏”信息。
RLS是一個(gè)等待已久的特性,它使微軟數(shù)據(jù)平臺(tái)產(chǎn)品在功能全面角度向Oracle和DB2靠近。在更多地了解特性及其在應(yīng)用程序的實(shí)現(xiàn)方式之后,它的工作方式將變得更加清晰。表面上,RLS似乎只是一個(gè)在將應(yīng)用程序從Oracle或DB2遷移過來時(shí)才需要的特性。但是,在現(xiàn)代環(huán)境中數(shù)據(jù)威脅是真實(shí)存在的,RLS有利于減小數(shù)據(jù)的潛在漏洞。它在用戶感知不到的情況下限制返回的記錄行數(shù)。雖然使用視圖和觸發(fā)器也能實(shí)現(xiàn)行級(jí)安全性,但是由于訪問邏輯更加集中和靠近數(shù)據(jù),因此這個(gè)新特性減小了應(yīng)用程序的維護(hù)難度和復(fù)雜性,從而在實(shí)現(xiàn)上更加簡(jiǎn)單。