問:我正在對(duì)各種類型的數(shù)據(jù)庫(kù)架構(gòu)進(jìn)行研究。您能告訴我非SQL結(jié)構(gòu)的數(shù)據(jù)庫(kù)(NoSQL)與主流商業(yè)關(guān)系型數(shù)據(jù)庫(kù)各自的安全性嗎?
對(duì)于要安全的存儲(chǔ)信息的數(shù)據(jù)庫(kù)來(lái)說(shuō),它需要提供保密性、完整性和可用性(confidentiality,integrity ,availability,簡(jiǎn)稱CIA)。需要時(shí),數(shù)據(jù)必須是可用的(可用性),但是只限于授權(quán)的個(gè)人或系統(tǒng)(保密性),而且數(shù)據(jù)只能由經(jīng)過授權(quán)的人來(lái)修改(完整性)。
關(guān)系型數(shù)據(jù)庫(kù)包括集成的功能如基于角色的安全、加密的通信和對(duì)行、字段訪問控制的支持,以及在存儲(chǔ)過程之上的通過用戶級(jí)別權(quán)限的訪問控制。企業(yè)級(jí)的關(guān)系型數(shù)據(jù)庫(kù)(Enterprise relational databases,RDBMS),如Oracle和微軟的SQL Server還有ACID(atomicity, consistency, isolation, durability:原子性、一致性、隔離性、耐久性)屬性,以保證數(shù)據(jù)庫(kù)的事務(wù)被可靠地處理;數(shù)據(jù)復(fù)制和日志功能確保耐久性和數(shù)據(jù)的完整性。但是,這些功能一般都是有成本的,主要是許可費(fèi)和數(shù)據(jù)訪問速度。
對(duì)于像Facebook這樣的社交網(wǎng)絡(luò)應(yīng)用以及像Amazon這樣的電子商務(wù)站點(diǎn)來(lái)說(shuō),它們需要處理海量的數(shù)據(jù),擴(kuò)展性和可用性是關(guān)鍵的數(shù)據(jù)庫(kù)需求。使數(shù)據(jù)可以跨越數(shù)百、甚至數(shù)千臺(tái)服務(wù)器進(jìn)行分發(fā),現(xiàn)在,許多公司已經(jīng)轉(zhuǎn)向了非關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)或非SQL數(shù)據(jù)庫(kù)(NoSQL)。然而,NoSQL數(shù)據(jù)庫(kù)的安全遠(yuǎn)沒有關(guān)系型數(shù)據(jù)庫(kù)那樣強(qiáng)鍵。
非SQL數(shù)據(jù)庫(kù)(NoSQL)有稱之為BASE(基于可用的、軟狀態(tài)、最終一致)的屬性,所以沒有在每個(gè)事務(wù)后要求一致性,該屬性對(duì)于數(shù)據(jù)庫(kù)最終保持在一致的狀態(tài)來(lái)說(shuō)足夠了。這意味著用戶可能無(wú)法看到最新的數(shù)據(jù),而是上次進(jìn)行快照時(shí)的數(shù)據(jù),例如庫(kù)存中的物品編號(hào)。因?yàn)槭聞?wù)沒有立刻寫入數(shù)據(jù)庫(kù),有可能同步發(fā)生的事務(wù)受到其它事務(wù)干擾。這種固有的競(jìng)爭(zhēng)條件(race condition),即不是所有的用戶一定會(huì)在同一時(shí)間查看同一個(gè)數(shù)據(jù),是數(shù)據(jù)庫(kù)處理時(shí)面臨的真正風(fēng)險(xiǎn),比如共享的事務(wù)。
NoSQL數(shù)據(jù)庫(kù)同樣缺乏保密性和完整性的特質(zhì)。例如NoSQL數(shù)據(jù)庫(kù)缺少圖式(schema),你不能在表、行或列上分隔權(quán)限并保持對(duì)數(shù)據(jù)的快速訪問,它們很少有內(nèi)建的安全機(jī)制。流行的非關(guān)系數(shù)據(jù)庫(kù)MongoDB的文檔寫道,“驗(yàn)證運(yùn)行Mongo數(shù)據(jù)庫(kù)的一個(gè)方法是在一個(gè)可信的環(huán)境中,沒有安全和認(rèn)證……當(dāng)然在這樣的配置中,必須確保只有可信的機(jī)器才能訪問數(shù)據(jù)庫(kù)的TCP端口”。而NoSQL數(shù)據(jù)庫(kù)Riak不支持認(rèn)證或授權(quán)。
這意味著保密性和完整性必須完全地由訪問數(shù)據(jù)的應(yīng)用來(lái)提供。把用于任何極具價(jià)值數(shù)據(jù)的最后一道防線放在應(yīng)用級(jí)別聽起來(lái)并不現(xiàn)實(shí)。應(yīng)用開發(fā)人員們不是以實(shí)施安全功能而工作的,更別提必須從頭開始編寫代碼了。這樣的話,你只剩下防火墻來(lái)保護(hù)你的數(shù)據(jù)了。