楊曉雁, 甘琳梅
(延安大學(xué) 計(jì)算機(jī)學(xué)院, 延安 716000)
目前所常見的Oracle等商業(yè)數(shù)據(jù)庫產(chǎn)品,絕大多數(shù)都為關(guān)系型數(shù)據(jù)庫類型。隨著信息技術(shù)的發(fā)展,關(guān)系型數(shù)據(jù)庫在面對(duì)數(shù)據(jù)類型日趨復(fù)雜、數(shù)據(jù)存取速度要求越來越高的現(xiàn)狀時(shí),逐漸暴露出其不足之處[1]。針對(duì)這一問題,非關(guān)系數(shù)據(jù)庫NoSQL應(yīng)運(yùn)而生,為用戶提供了海量數(shù)據(jù)處理的解決方案。與主流關(guān)系型數(shù)據(jù)庫相比,NoSQL在并發(fā)性、可擴(kuò)展性等方面體現(xiàn)出明顯優(yōu)勢,但是在數(shù)據(jù)庫安全方面,NoSQL數(shù)據(jù)庫存在著缺陷,從而限制了 NoSQL數(shù)據(jù)庫的應(yīng)用[2]。
數(shù)據(jù)庫的安全性涵蓋了保密性、完整性以及可用性等方面,即數(shù)據(jù)訪問必須經(jīng)過授權(quán);數(shù)據(jù)的刪除、更改必須經(jīng)過授權(quán);授權(quán)用戶可以正常進(jìn)行數(shù)據(jù)操作。本文重點(diǎn)圍繞這3個(gè)方面,對(duì)NoSQL數(shù)據(jù)庫的安全策略與改進(jìn)方案展開分析探討,從而使NoSQL數(shù)據(jù)庫更可靠,使其應(yīng)用更廣泛。
目前所使用的大多數(shù)NoSQL數(shù)據(jù)庫,因?yàn)樽陨頂?shù)據(jù)模型特征等原因而導(dǎo)致其缺少完善的內(nèi)置安全性機(jī)制的問題。本文根據(jù)NoSQL數(shù)據(jù)庫普遍存在的分布式特點(diǎn),將安全性分類為內(nèi)部安全與外部安全兩方面。NoSQL數(shù)據(jù)庫的內(nèi)部安全的對(duì)象為內(nèi)部存儲(chǔ)以及服務(wù)節(jié)點(diǎn),涉及到內(nèi)部服務(wù)的訪問控制、數(shù)據(jù)文件存儲(chǔ)以及內(nèi)部服務(wù);外部安全的對(duì)象為數(shù)據(jù)庫客戶端以及數(shù)據(jù)庫服務(wù)端,涉及到用戶的訪問控制、數(shù)據(jù)加密以及數(shù)據(jù)傳輸[3]。其中,用戶的訪問控制包括用戶身份認(rèn)證與授權(quán),是十分關(guān)鍵的安全需求。
本文基于Hadoop平臺(tái)對(duì)NoSQL數(shù)據(jù)庫安全性進(jìn)行探討,主要采用分析源碼的方法,以典型的NoSQL數(shù)據(jù)庫——HBase數(shù)據(jù)庫作為對(duì)象,對(duì)其安全機(jī)制展開研究并且做出安全評(píng)價(jià)[4],從而為進(jìn)一步的改進(jìn)提供參考依據(jù)。
Hadoop的安全風(fēng)險(xiǎn)主要存在于以下幾個(gè)過程當(dāng)中[5]:
第一,用戶在客戶端至服務(wù)端之間的訪問認(rèn)證過程中,一方面有可能存在某用戶匿名為其他身份對(duì)NameNode進(jìn)行訪問的安全風(fēng)險(xiǎn),另一方面當(dāng)某用戶得到Data Nodeblock的位置信息后,可能在未經(jīng)過Data Node認(rèn)證的情況下直接從中得到數(shù)據(jù);
第二,在各服務(wù)間的認(rèn)證過程中,存在某用戶以Data Node身份來接收或提交Name Node任務(wù)的安全風(fēng)險(xiǎn);
第三,數(shù)據(jù)在傳輸過程中,若未經(jīng)過加密處理,則存在被非法竊取的安全風(fēng)險(xiǎn)。
針對(duì)上述這些安全風(fēng)險(xiǎn),Hadoop主要通過基于訪問控制列表的服務(wù)級(jí)權(quán)限控制、基于令牌的認(rèn)證機(jī)制以及基于Kerberos協(xié)議等手段來加強(qiáng)其安全性。
在對(duì)Hadoop源碼進(jìn)行分析后,可以得出Hadoop的權(quán)限控制可分為兩個(gè)層級(jí):一是系統(tǒng)級(jí)的服務(wù)級(jí)授權(quán)[6],主要針對(duì)Hadoop服務(wù)的訪問控制,利用訪問控制列表實(shí)現(xiàn)對(duì)服務(wù)級(jí)訪問權(quán)限的管理,其作為底層訪問控制具有優(yōu)先權(quán);二是HDFS文件權(quán)限控制以及Map Reduce隊(duì)列權(quán)限驗(yàn)證,其中,HDFS自身同樣包含文件權(quán)限的管理[7]。
Hadoop以用戶名和組來配置服務(wù)的訪問權(quán)限,以此實(shí)現(xiàn)對(duì)訪問權(quán)限的管理。具體來說,Hadoop具有九種可以配置的訪問控制列表屬性[8],分別指定相應(yīng)訪問權(quán)限的用戶或者用戶組。利用{HADOOP_CONF_DIR}/hadoop-policy.xml配置文件對(duì)上述九種屬性進(jìn)行設(shè)置,能夠控制訪問用戶或用戶組,從而實(shí)現(xiàn)HBase數(shù)據(jù)庫底層HDFS文件的服務(wù)級(jí)安全訪問。
HDFS客戶端訪問數(shù)據(jù)的過程中,客戶端得到數(shù)據(jù)位置后可以直接訪問 Data Node,從而通過Socket獲取數(shù)據(jù)。若不對(duì)用戶身份進(jìn)行認(rèn)證,則可能在HDFS 請(qǐng)求數(shù)據(jù)時(shí),非法用戶以假冒身份來訪問HDFS,從而構(gòu)成嚴(yán)重的安全風(fēng)險(xiǎn)。針對(duì)這個(gè)問題,基于令牌的認(rèn)證機(jī)制是有效的解決方案,即通過客戶端與服務(wù)端節(jié)點(diǎn)共享密鑰、相互認(rèn)證,使客戶端必須在得到服務(wù)端響應(yīng)其訪問請(qǐng)求后才能實(shí)現(xiàn)訪問[9]。該認(rèn)證機(jī)制由Name Node進(jìn)行管理,與Data Node無關(guān)聯(lián)。
Kerberos協(xié)議基于對(duì)稱密鑰算法,通過第三方進(jìn)行密鑰的分發(fā)和身份確認(rèn),以此為開放系統(tǒng)的客戶端與服務(wù)器之間的網(wǎng)絡(luò)通信提供域內(nèi)認(rèn)證和跨域認(rèn)證等服務(wù)。本文對(duì)其中的域內(nèi)認(rèn)證過程進(jìn)行簡單分析,發(fā)現(xiàn)其類似于Hadoop的認(rèn)證過程,如圖1所示。
圖1 Kerberos協(xié)議
從圖1 可以看到,Kerberos協(xié)議主要包括三個(gè)步驟,并且在啟用時(shí)要依賴于外部的Kerberos KDC[10]。在分析源碼后發(fā)現(xiàn),Hadoop利用Java驗(yàn)證及授權(quán)服務(wù)的登錄接口,可以強(qiáng)化Kerberos協(xié)議。
基于Hadoop的HBase數(shù)據(jù)庫,其安全機(jī)制實(shí)現(xiàn)了上述的基于令牌的認(rèn)證機(jī)制以及Kerberos協(xié)議,而其自身的Coprocessor框架則實(shí)現(xiàn)了基于訪問控制列表的權(quán)限控制。前文中對(duì)基于令牌的認(rèn)證機(jī)制以及Kerberos協(xié)議已經(jīng)做過闡述,因此,在HBase數(shù)據(jù)庫安全機(jī)制的分析中,主要針對(duì)Coprocessor框架進(jìn)行探討。
Coprocessor框架具有Observer與Endpoint兩種執(zhí)行模式,HBase數(shù)據(jù)庫實(shí)現(xiàn)了3個(gè)基本的Observer接口以及一個(gè)Endpoint抽象類。作為HBase數(shù)據(jù)庫的重要框架,Coprocessor允許用戶在服務(wù)端插入某些執(zhí)行代碼,使HBase數(shù)據(jù)庫實(shí)現(xiàn)聚合、訪問控制以及二次索引等[11]。
對(duì)源碼進(jìn)行分析,可以發(fā)現(xiàn)繼承了Base Region Observer的Access Controller類是HBase數(shù)據(jù)庫訪問控制的關(guān)鍵所在,它實(shí)現(xiàn)了Master Observer以及Coprocessor Protocol 接口,能夠利用pre方法來檢驗(yàn)權(quán)限,以此對(duì)HMaster、HRegion進(jìn)行基于訪問控制列表權(quán)限的控制。
根據(jù)上述分析,本文對(duì)HBase數(shù)據(jù)庫進(jìn)行安全性評(píng)價(jià):
在保密性方面,HBase數(shù)據(jù)庫通過基于令牌的認(rèn)證機(jī)制與Kerberos協(xié)議,能夠較好地實(shí)現(xiàn)認(rèn)證與授權(quán),而HBase ACL機(jī)制也為其他NoSQL數(shù)據(jù)庫提供了改進(jìn)參考[12];在完整性方面,HBase數(shù)據(jù)庫的HDFS已經(jīng)能夠滿足需要,但是大部分NoSQL 數(shù)據(jù)庫在此方面還有較大缺陷,可以借鑒HBase數(shù)據(jù)庫進(jìn)行改進(jìn)。
通過分析發(fā)現(xiàn),HBase數(shù)據(jù)庫在操作權(quán)限方面可以更加細(xì)化。對(duì)此,本文提出對(duì)HBase數(shù)據(jù)庫進(jìn)行權(quán)限擴(kuò)展的改進(jìn)方案。
權(quán)限控制是數(shù)據(jù)庫安全最基本的保障,而對(duì)于通常不具備固定列的NoSQL數(shù)據(jù)庫而言,這種數(shù)據(jù)結(jié)構(gòu)使其難以細(xì)化權(quán)限控制。針對(duì)此問題,本文通過借鑒Oracle等關(guān)系型數(shù)據(jù)庫的權(quán)限控制技術(shù),提出了NoSQL數(shù)據(jù)庫的權(quán)限控制改進(jìn)方案:
第一,針對(duì)部分結(jié)構(gòu)化的NoSQL數(shù)據(jù)庫,可以通過內(nèi)建授權(quán)表,將其權(quán)限表中的Key拆分成對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)的改進(jìn)方案,以此實(shí)現(xiàn)權(quán)限控制的細(xì)化;
第二,針對(duì)數(shù)據(jù)結(jié)構(gòu)較為雜亂的NoSQL數(shù)據(jù)庫,可以利用內(nèi)建的鍵值來來保存權(quán)限信息,從而實(shí)現(xiàn)權(quán)限控制的細(xì)化[13]。用戶表包含用戶名及密碼信息,在進(jìn)行登錄時(shí)使用,從而驗(yàn)證用戶身份;權(quán)限表包含“用戶”、“表”以及“列”等信息,用來保存權(quán)限信息,在用戶登錄時(shí)驗(yàn)證其訪問權(quán)限。兩個(gè)表的結(jié)構(gòu)中僅有兩列,與NoSQL數(shù)據(jù)庫的鍵值相同。
Action是僅包含一個(gè)字節(jié)的枚舉類型,HBase數(shù)據(jù)庫用Action來保存權(quán)限的一個(gè)權(quán)限值。因此在不影響其余代碼的情況下,HBase數(shù)據(jù)庫可以擴(kuò)展Action類型[14]。此外,對(duì)于權(quán)限的存儲(chǔ),可以通過類似 POSIX系統(tǒng)的權(quán)限控制模型以位(bit)來實(shí)現(xiàn),并且對(duì)Permission 中以 Action 作為參數(shù)的構(gòu)造函數(shù)進(jìn)行修改。具體代碼為:
class Permission extends Versioned Writable {
public enum Action {
READ(1), WRITE(2),EXEC(4), CREATE_TABLE(8), DROP_TABLE(16), ALTER (32), ABLE (64), GRANT(128), REVOKE(256), ADMIN(512);
protected static Map
private int actions = 0;
public Permission(int action Codes) {if (action Codes != 0) {this.actions = action Codes ; }
}
從代碼中可以看到,權(quán)限在改進(jìn)后被細(xì)化成若干操作權(quán)限,1位表示1種權(quán)限。僅需對(duì)Actions變量進(jìn)行簡單的操作即可獲取權(quán)限信息,從而提升了效率,并且有效降低了空間資源的使用率。此外,當(dāng)權(quán)限持續(xù)擴(kuò)展時(shí),該方法下僅需將 Actions變量擴(kuò)展為Long、Double或者Bitmap類型即可。
本文通過實(shí)例測試的方式,對(duì)所提出的HBase數(shù)據(jù)庫安全改進(jìn)方案進(jìn)行驗(yàn)證,以此證明其可行性[15]。本次實(shí)例測試的環(huán)境為:服務(wù)器的配置為兩個(gè)2.5 GHz四核處理器、16G內(nèi)存;以3臺(tái)服務(wù)器來部署HBase數(shù)據(jù)庫、Hadoop平臺(tái)以及KDC;服務(wù)器之間通過100M局域網(wǎng)進(jìn)行通信。Hadoop與HBase數(shù)據(jù)庫配置從KDC導(dǎo)出的keytab,以此與獨(dú)立運(yùn)行于一個(gè)服務(wù)器的KDC進(jìn)行認(rèn)證。
實(shí)例測試中,首先新建了若干個(gè)用戶,然后各用戶執(zhí)行 create、grant、disable 等不同命令,以此驗(yàn)證其執(zhí)行結(jié)果與預(yù)期是否一致。命令所對(duì)應(yīng)的權(quán)限為GRANT、ABLE、READ、WRITE 等,部分命令的執(zhí)行結(jié)果,如圖2所示。
圖2 讀寫命令及測試結(jié)果
通過上述的結(jié)果看出,采用本文所提出改進(jìn)方案進(jìn)行權(quán)限細(xì)分,其命令能夠被較好地執(zhí)行,提高了對(duì)應(yīng)操作的安全性,并且沒有影響數(shù)據(jù)庫的工作性能。
本文以HBase數(shù)據(jù)庫為研究對(duì)象,基于Hadoop對(duì)NoSQL數(shù)據(jù)庫的安全機(jī)制與改進(jìn)方案僅需分析探討[16]。就目前而言,HBase數(shù)據(jù)庫提供內(nèi)建的安全機(jī)制,是NoSQL數(shù)據(jù)庫當(dāng)中安全機(jī)制較為完善的代表產(chǎn)品。隨著技術(shù)的不斷發(fā)展,其他NoSQL數(shù)據(jù)庫產(chǎn)品將日益重視并提高安全性。因此,本文以HBase數(shù)據(jù)庫為代表對(duì)NoSQL數(shù)據(jù)庫的安全性進(jìn)行研究,能夠?yàn)槠渌鸑oSQL 數(shù)據(jù)庫的安全改進(jìn)提供參考,具有十分重要的研究意義。