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