楊曉雁, 甘琳梅
(延安大學 計算機學院, 延安 716000)
目前所常見的Oracle等商業數據庫產品,絕大多數都為關系型數據庫類型。隨著信息技術的發展,關系型數據庫在面對數據類型日趨復雜、數據存取速度要求越來越高的現狀時,逐漸暴露出其不足之處[1]。針對這一問題,非關系數據庫NoSQL應運而生,為用戶提供了海量數據處理的解決方案。與主流關系型數據庫相比,NoSQL在并發性、可擴展性等方面體現出明顯優勢,但是在數據庫安全方面,NoSQL數據庫存在著缺陷,從而限制了 NoSQL數據庫的應用[2]。
數據庫的安全性涵蓋了保密性、完整性以及可用性等方面,即數據訪問必須經過授權;數據的刪除、更改必須經過授權;授權用戶可以正常進行數據操作。本文重點圍繞這3個方面,對NoSQL數據庫的安全策略與改進方案展開分析探討,從而使NoSQL數據庫更可靠,使其應用更廣泛。
目前所使用的大多數NoSQL數據庫,因為自身數據模型特征等原因而導致其缺少完善的內置安全性機制的問題。本文根據NoSQL數據庫普遍存在的分布式特點,將安全性分類為內部安全與外部安全兩方面。NoSQL數據庫的內部安全的對象為內部存儲以及服務節點,涉及到內部服務的訪問控制、數據文件存儲以及內部服務;外部安全的對象為數據庫客戶端以及數據庫服務端,涉及到用戶的訪問控制、數據加密以及數據傳輸[3]。其中,用戶的訪問控制包括用戶身份認證與授權,是十分關鍵的安全需求。
本文基于Hadoop平臺對NoSQL數據庫安全性進行探討,主要采用分析源碼的方法,以典型的NoSQL數據庫——HBase數據庫作為對象,對其安全機制展開研究并且做出安全評價[4],從而為進一步的改進提供參考依據。
Hadoop的安全風險主要存在于以下幾個過程當中[5]:
第一,用戶在客戶端至服務端之間的訪問認證過程中,一方面有可能存在某用戶匿名為其他身份對NameNode進行訪問的安全風險,另一方面當某用戶得到Data Nodeblock的位置信息后,可能在未經過Data Node認證的情況下直接從中得到數據;
第二,在各服務間的認證過程中,存在某用戶以Data Node身份來接收或提交Name Node任務的安全風險;
第三,數據在傳輸過程中,若未經過加密處理,則存在被非法竊取的安全風險。
針對上述這些安全風險,Hadoop主要通過基于訪問控制列表的服務級權限控制、基于令牌的認證機制以及基于Kerberos協議等手段來加強其安全性。
在對Hadoop源碼進行分析后,可以得出Hadoop的權限控制可分為兩個層級:一是系統級的服務級授權[6],主要針對Hadoop服務的訪問控制,利用訪問控制列表實現對服務級訪問權限的管理,其作為底層訪問控制具有優先權;二是HDFS文件權限控制以及Map Reduce隊列權限驗證,其中,HDFS自身同樣包含文件權限的管理[7]。
Hadoop以用戶名和組來配置服務的訪問權限,以此實現對訪問權限的管理。具體來說,Hadoop具有九種可以配置的訪問控制列表屬性[8],分別指定相應訪問權限的用戶或者用戶組。利用{HADOOP_CONF_DIR}/hadoop-policy.xml配置文件對上述九種屬性進行設置,能夠控制訪問用戶或用戶組,從而實現HBase數據庫底層HDFS文件的服務級安全訪問。
HDFS客戶端訪問數據的過程中,客戶端得到數據位置后可以直接訪問 Data Node,從而通過Socket獲取數據。若不對用戶身份進行認證,則可能在HDFS 請求數據時,非法用戶以假冒身份來訪問HDFS,從而構成嚴重的安全風險。針對這個問題,基于令牌的認證機制是有效的解決方案,即通過客戶端與服務端節點共享密鑰、相互認證,使客戶端必須在得到服務端響應其訪問請求后才能實現訪問[9]。該認證機制由Name Node進行管理,與Data Node無關聯。
Kerberos協議基于對稱密鑰算法,通過第三方進行密鑰的分發和身份確認,以此為開放系統的客戶端與服務器之間的網絡通信提供域內認證和跨域認證等服務。本文對其中的域內認證過程進行簡單分析,發現其類似于Hadoop的認證過程,如圖1所示。

圖1 Kerberos協議
從圖1 可以看到,Kerberos協議主要包括三個步驟,并且在啟用時要依賴于外部的Kerberos KDC[10]。在分析源碼后發現,Hadoop利用Java驗證及授權服務的登錄接口,可以強化Kerberos協議。
基于Hadoop的HBase數據庫,其安全機制實現了上述的基于令牌的認證機制以及Kerberos協議,而其自身的Coprocessor框架則實現了基于訪問控制列表的權限控制。前文中對基于令牌的認證機制以及Kerberos協議已經做過闡述,因此,在HBase數據庫安全機制的分析中,主要針對Coprocessor框架進行探討。
Coprocessor框架具有Observer與Endpoint兩種執行模式,HBase數據庫實現了3個基本的Observer接口以及一個Endpoint抽象類。作為HBase數據庫的重要框架,Coprocessor允許用戶在服務端插入某些執行代碼,使HBase數據庫實現聚合、訪問控制以及二次索引等[11]。
對源碼進行分析,可以發現繼承了Base Region Observer的Access Controller類是HBase數據庫訪問控制的關鍵所在,它實現了Master Observer以及Coprocessor Protocol 接口,能夠利用pre方法來檢驗權限,以此對HMaster、HRegion進行基于訪問控制列表權限的控制。
根據上述分析,本文對HBase數據庫進行安全性評價:
在保密性方面,HBase數據庫通過基于令牌的認證機制與Kerberos協議,能夠較好地實現認證與授權,而HBase ACL機制也為其他NoSQL數據庫提供了改進參考[12];在完整性方面,HBase數據庫的HDFS已經能夠滿足需要,但是大部分NoSQL 數據庫在此方面還有較大缺陷,可以借鑒HBase數據庫進行改進。
通過分析發現,HBase數據庫在操作權限方面可以更加細化。對此,本文提出對HBase數據庫進行權限擴展的改進方案。
權限控制是數據庫安全最基本的保障,而對于通常不具備固定列的NoSQL數據庫而言,這種數據結構使其難以細化權限控制。針對此問題,本文通過借鑒Oracle等關系型數據庫的權限控制技術,提出了NoSQL數據庫的權限控制改進方案:
第一,針對部分結構化的NoSQL數據庫,可以通過內建授權表,將其權限表中的Key拆分成對應的存儲結構的改進方案,以此實現權限控制的細化;
第二,針對數據結構較為雜亂的NoSQL數據庫,可以利用內建的鍵值來來保存權限信息,從而實現權限控制的細化[13]。用戶表包含用戶名及密碼信息,在進行登錄時使用,從而驗證用戶身份;權限表包含“用戶”、“表”以及“列”等信息,用來保存權限信息,在用戶登錄時驗證其訪問權限。兩個表的結構中僅有兩列,與NoSQL數據庫的鍵值相同。
Action是僅包含一個字節的枚舉類型,HBase數據庫用Action來保存權限的一個權限值。因此在不影響其余代碼的情況下,HBase數據庫可以擴展Action類型[14]。此外,對于權限的存儲,可以通過類似 POSIX系統的權限控制模型以位(bit)來實現,并且對Permission 中以 Action 作為參數的構造函數進行修改。具體代碼為:
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 ; }
}
從代碼中可以看到,權限在改進后被細化成若干操作權限,1位表示1種權限。僅需對Actions變量進行簡單的操作即可獲取權限信息,從而提升了效率,并且有效降低了空間資源的使用率。此外,當權限持續擴展時,該方法下僅需將 Actions變量擴展為Long、Double或者Bitmap類型即可。
本文通過實例測試的方式,對所提出的HBase數據庫安全改進方案進行驗證,以此證明其可行性[15]。本次實例測試的環境為:服務器的配置為兩個2.5 GHz四核處理器、16G內存;以3臺服務器來部署HBase數據庫、Hadoop平臺以及KDC;服務器之間通過100M局域網進行通信。Hadoop與HBase數據庫配置從KDC導出的keytab,以此與獨立運行于一個服務器的KDC進行認證。
實例測試中,首先新建了若干個用戶,然后各用戶執行 create、grant、disable 等不同命令,以此驗證其執行結果與預期是否一致。命令所對應的權限為GRANT、ABLE、READ、WRITE 等,部分命令的執行結果,如圖2所示。

圖2 讀寫命令及測試結果
通過上述的結果看出,采用本文所提出改進方案進行權限細分,其命令能夠被較好地執行,提高了對應操作的安全性,并且沒有影響數據庫的工作性能。
本文以HBase數據庫為研究對象,基于Hadoop對NoSQL數據庫的安全機制與改進方案僅需分析探討[16]。就目前而言,HBase數據庫提供內建的安全機制,是NoSQL數據庫當中安全機制較為完善的代表產品。隨著技術的不斷發展,其他NoSQL數據庫產品將日益重視并提高安全性。因此,本文以HBase數據庫為代表對NoSQL數據庫的安全性進行研究,能夠為其他NoSQL 數據庫的安全改進提供參考,具有十分重要的研究意義。