◆李曄鋒
MongoDB的RBAC訪問控制技術(shù)研究
◆李曄鋒1,2
(1.北京工業(yè)大學(xué)計(jì)算機(jī)學(xué)院 北京 100124;2.寧波工程學(xué)院電信學(xué)院 浙江 315211)
作為一種開源的NoSQL數(shù)據(jù)庫,MongoDB被廣泛應(yīng)用于大數(shù)據(jù)處理與分析中,因此它的安全性顯得至關(guān)重要。MongoDB使用基于角色的訪問控制(RBAC)方式來控制屬于不同角色的用戶對(duì)數(shù)據(jù)庫資源的訪問。本文針對(duì)MongoDB以文檔形式存儲(chǔ)數(shù)據(jù)和非SQL形式訪問數(shù)據(jù)的特點(diǎn),分析了該訪問控制模型中的各組成部分以及它們之間的關(guān)系,從而總結(jié)出這種訪問控制方式的優(yōu)缺點(diǎn)。
NoSQL;MongoDB;RBAC
MongoDB是開源的文檔型NoSQL數(shù)據(jù)庫,它擺脫了關(guān)系模型的限制,具有靈活的存儲(chǔ)結(jié)構(gòu),并且支持分布式部署,使得它的查詢性能遠(yuǎn)高于關(guān)系數(shù)據(jù)庫[1],因此被廣泛應(yīng)用于云計(jì)算和大數(shù)據(jù)環(huán)境[2]。但是NoSQL的安全性普遍相對(duì)薄弱,Zahid在他的學(xué)術(shù)論文[3]中對(duì)各種分片式的NoSQL數(shù)據(jù)庫進(jìn)行了比較,其中對(duì)MongoDB的評(píng)論如下:“數(shù)據(jù)庫的安全配置等級(jí)非常低,完全依賴于數(shù)據(jù)庫管理員”。因此,在學(xué)術(shù)界和企業(yè)界有不少提高M(jìn)ongoDB安全性的研究,例如Sathyadevan等人提出了一種提升MongoDB數(shù)據(jù)級(jí)別安全的解決方案[4],Hou等人對(duì)MongoDB的注入情況進(jìn)行了檢測(cè)和分析[5],師德清把MongoDB應(yīng)用到CRP系統(tǒng)中,并對(duì)它的安全認(rèn)證機(jī)制進(jìn)行分析[6],宋志毅等人實(shí)現(xiàn)了基于MongoDB的數(shù)據(jù)加密技術(shù)[7]。本文從訪問控制的角度分析MongoDB的安全性,首先在第一章介紹MongoDB的存儲(chǔ)和訪問特性,然后在第二章闡述現(xiàn)有的一些訪問控制技術(shù),接著在第三章重點(diǎn)分析MongoDB中RBAC模型的各組成部分以及它們之間的關(guān)系,最后在第四章總結(jié)全文。
1.1 MongoDB的數(shù)據(jù)存儲(chǔ)方式
MongoDB只有三種存儲(chǔ)對(duì)象:數(shù)據(jù)庫(Database)、集合(Collection)和文檔(Document),它們被統(tǒng)稱為資源(Resource)。數(shù)據(jù)庫是最高級(jí)存儲(chǔ)對(duì)象,由多個(gè)集合組成;集合相當(dāng)于關(guān)系數(shù)據(jù)庫的表,每個(gè)集合包含多個(gè)文檔;文檔是MongoDB的最小存儲(chǔ)單元,它采用了BSON結(jié)構(gòu),每個(gè)文檔包含多個(gè)“字段”和“取值”對(duì)。
BSON是一種類似json的二進(jìn)制存儲(chǔ)格式,它的優(yōu)點(diǎn)在于支持內(nèi)嵌的文檔對(duì)象和數(shù)據(jù)對(duì)象,與關(guān)系數(shù)據(jù)庫相比存儲(chǔ)結(jié)構(gòu)更加靈活,能夠更好地描述數(shù)據(jù)之間的聯(lián)系。例如,某個(gè)學(xué)生李明的語文和數(shù)學(xué)兩門課成績(jī)可以表示如下:
如果使用關(guān)系數(shù)據(jù)庫存儲(chǔ)這些信息,則需要把學(xué)生信息和課程信息分別存儲(chǔ)在兩張表中,而MongoDB通過這種文檔內(nèi)嵌的方式,能夠有效減少集合的數(shù)目,規(guī)避了連接操作,從而提高了查詢性能。此外,MongoDB還會(huì)為每個(gè)文檔對(duì)象生成全局唯一的ObjectID作為主鍵,它不但能夠用于區(qū)分不同的文檔,而且能夠用于排序、引用和創(chuàng)建索引,以達(dá)到更快的查詢速度。
1.2 MongoDB的數(shù)據(jù)訪問方式
作為一種NoSQL的數(shù)據(jù)庫,MongoDB使用了一種交互式的命令對(duì)數(shù)據(jù)庫進(jìn)行操作訪問。絕大多數(shù)的數(shù)據(jù)庫命令使用函數(shù)的方式實(shí)現(xiàn),例如,假設(shè)需要在1.1節(jié)定義的student集合中需要查找學(xué)生“李明”的語文課成績(jī),則可用如下的find命令實(shí)現(xiàn)
db.student.find({“姓名”:”李明”},
{“課程”:{$elemMatch:”語文”},”_id”:0,”課程.成績(jī)”:1})
命令返回的查詢結(jié)果也是BSON格式的文檔類型,它能夠作為中間結(jié)果保存在某一個(gè)變量中,為下一個(gè)查詢命令所使用。這種數(shù)據(jù)訪問方式雖然更加靈活,但是對(duì)數(shù)據(jù)庫管理員有更高的技術(shù)要求。
在20世紀(jì)60年代末,科研工作者提出了訪問控制技術(shù),其主要目的是防止信息和資源被非常用戶訪問使用,或被合法用戶進(jìn)行非授權(quán)的使用。經(jīng)過40多年的發(fā)展,一些訪問控制模型已被廣泛應(yīng)用到各種應(yīng)用中,包括自主訪問控制(DAC)、強(qiáng)制訪問控制(MAC)和基于角色的訪問控制(RBAC)等。
自主訪問控制使用關(guān)聯(lián)表實(shí)現(xiàn)主體對(duì)客體的訪問。關(guān)聯(lián)表可以基于主體或者基于客體,前者以主體為核心,為每個(gè)主體創(chuàng)建一個(gè)可被它訪問的客體以及訪問權(quán)限的明細(xì)表,后者以客體為核心,存儲(chǔ)可以對(duì)它訪問的主體以及訪問權(quán)限的明細(xì)表。這種訪問控制技術(shù)的優(yōu)點(diǎn)在于靈活性較好,實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)在于關(guān)聯(lián)表占用大量的存儲(chǔ)空間,并且對(duì)權(quán)限的傳遞以及客體的副本管理相當(dāng)困難。
強(qiáng)制訪問控制為每個(gè)主體和客體分配安全標(biāo)簽,每種標(biāo)簽以不同的取值來表示安全等級(jí),這樣主體對(duì)客體的訪問權(quán)限取決于安全標(biāo)簽的等級(jí)組合。這處訪問控制技術(shù)同樣實(shí)現(xiàn)簡(jiǎn)單,并且數(shù)據(jù)只能根據(jù)標(biāo)簽等級(jí)從一級(jí)流向一級(jí),具有較強(qiáng)的機(jī)密性,缺點(diǎn)在于靈活性不夠,而且犧牲了數(shù)據(jù)的完整性。
基于角色的訪問控制模型由喬治梅森大學(xué)的Sandhu等人于1996年首次提出,經(jīng)過不斷的完善形成了RBAC96模型簇[8],它的核心思想是在用戶和權(quán)限之間引入了角色(Role)的概念,如圖1所示,通過用戶分配(UA)和權(quán)限分配(PA)為用戶(主體)和權(quán)限之間的關(guān)聯(lián)。相比DAC和MAC,它更具靈活性和安全性,但是缺乏操作順序的控制機(jī)制。
圖1 RBAC模型核心結(jié)構(gòu)
2004年,Sandhu等人又提出了一種使用控制模型(UCON)[9],被學(xué)術(shù)界命名為“下一代訪問控制模型”。該模型對(duì)傳統(tǒng)的存取控制進(jìn)行了一定的擴(kuò)展,定義了授權(quán)(Authorization)、義務(wù)(Obligation)和條件(Condition)三個(gè)新的因素,以及存取控制的連續(xù)性(Continuity)和可變性(Mutability)兩個(gè)新的屬性,具有更高的安全性、靈活性和有效性,但是模型的定義也更加抽象,不利于具體實(shí)現(xiàn),因此并沒有在信息安全領(lǐng)域得到廣泛應(yīng)用。
MongoDB使用RBAC管理用戶的訪問控制,它的核心結(jié)構(gòu)與圖1類似,只不過它把具體的操作行為(Action)與被操作的對(duì)象放在一起統(tǒng)稱為權(quán)限(Previlege)。
3.1 MongoDB的用戶
MongoDB在安裝完成后沒有任何用戶,不用登錄即可任意創(chuàng)建數(shù)據(jù)庫和集合,也可以對(duì)元數(shù)據(jù)庫admin中的部分集合進(jìn)行操作,因此不具有任何安全性,必須手動(dòng)創(chuàng)建用戶才能激活驗(yàn)證功能。
MongoDB使用db.createUser命令創(chuàng)建用戶,所有的用戶信息被存儲(chǔ)在admin數(shù)據(jù)庫下的system.users集合中。默認(rèn)情況下,用戶屬于創(chuàng)建時(shí)所在的數(shù)據(jù)庫,并只能對(duì)該數(shù)據(jù)庫進(jìn)行操作。但是在admin數(shù)據(jù)庫下創(chuàng)建的用戶可以被賦予相應(yīng)的角色訪問多個(gè)數(shù)據(jù)庫。例如,使用下面的命令即可創(chuàng)建一個(gè)超級(jí)用戶sa,它被賦予root角色,可以對(duì)整個(gè)數(shù)據(jù)庫執(zhí)行任何操作。
use admin
db.createUser({user:”sa”,pwd:”123456”,roles:[“root”]})
此后,重新啟動(dòng)Mongd服務(wù)并加上--auth參數(shù),然后再啟動(dòng)Mongo控制臺(tái),需要先切換到admin數(shù)據(jù)庫下,再使用db.auth命令進(jìn)行登錄驗(yàn)證才可以進(jìn)一步的操作。
3.2 MongoDB的權(quán)限
MongoDB的權(quán)限由操作行為和被操作的對(duì)象組成,用BSON結(jié)構(gòu)可以表示如下:
其中resource字段表示被操作的對(duì)象,可以是數(shù)據(jù)庫或集合,也可以是分布式模式下的集群。另一個(gè)字段actions表示行為,它們可以是操作性的,例如1.2節(jié)所述的數(shù)據(jù)查找find命令,以及數(shù)據(jù)插入insert操作等,也可以是控制性的,例如3.1節(jié)所述的createUser命令,以及修改密碼changePassword等等。
每個(gè)權(quán)限定義中只能指定一個(gè)資源,但是可以有多個(gè)訪問行為,表示可以對(duì)某個(gè)資源進(jìn)行哪些操作。因此,MongoDB中的權(quán)限不再拘泥于傳統(tǒng)的“讀”、“寫”和“執(zhí)行”等操作,更加靈活機(jī)動(dòng)以適應(yīng)用戶的各種需要。
3.3 MongoDB的角色
角色是MongoDB訪問控制模型中的核心組件,也是連接用戶和權(quán)限的紐帶。MongoDB中已經(jīng)自帶了一些系統(tǒng)定義的角色,此外用戶還可以通過組合權(quán)限自定義角色。MongoDB中角色的BSON描述形式如下:
其中的privileges字段中以數(shù)組的形式包含了該角色擁有的權(quán)限,每個(gè)權(quán)限的構(gòu)造如3.2節(jié)所述;roles字段中包含了該角色繼承的其它角色,每個(gè)被繼承的角色表現(xiàn)形式為:{role:“<角色名>”,db:“<數(shù)據(jù)庫名>”}。角色繼承是MongoDB的重大特點(diǎn),例如3.1節(jié)中定義超級(jí)用戶sa時(shí)用到的root角色就是由多個(gè)基本角色中繼承而來。
在系統(tǒng)自帶的角色中,包含同一類型行為的權(quán)限被放在了一起,例如read角色擁有一些只讀行為如find、listCollections、 listIndex等的權(quán)限,而userAdmin角色中包含了一些管理級(jí)的行為如createRole、createUser、changePassword等。行為跟角色之間是多對(duì)多關(guān)系,即一個(gè)角色可以有多個(gè)行為,而某個(gè)行為可以出現(xiàn)在不同的角色中。類似,用戶跟角色之間也是多對(duì)多關(guān)系,即一個(gè)用戶可以擁有多個(gè)角色,而某個(gè)角色可以屬于不同的用戶(比如有多名系統(tǒng)管理員角色)。
用戶的自定義角色通過createRole命令創(chuàng)建,并存放在admin數(shù)據(jù)庫的system.roles集合中。對(duì)于在admin數(shù)據(jù)庫中創(chuàng)建的角色,它可以擁有操作任意數(shù)據(jù)庫的權(quán)限,并且能夠繼承在任意數(shù)據(jù)庫中創(chuàng)建的其它角色;對(duì)于在普通數(shù)據(jù)庫中創(chuàng)建的角色,只能擁有操作本數(shù)據(jù)庫的權(quán)限,并且只能繼承在本數(shù)據(jù)庫中創(chuàng)建的其它角色。
3.4 MongoDB的RBAC模型安全隱患
盡管MongoDB的RBAC的模型具有較強(qiáng)的靈活性,但由于它的角色并沒有等級(jí)劃分,導(dǎo)致一些低端角色可以分配高端角色。在3.3節(jié)中提到的userAdmin角色無法對(duì)數(shù)據(jù)庫進(jìn)行find、update等訪問行為,但它可以執(zhí)行createRole、createUser等數(shù)據(jù)庫管理行為,從而能夠創(chuàng)建具有root角色的用戶來獲取數(shù)據(jù)庫中的具體內(nèi)容。由于MongoDB的角色具有繼承的特性,因此一旦與該角色相關(guān)的賬戶信息被遺失,對(duì)數(shù)據(jù)庫的安全將造成極大的威脅。
解決這個(gè)問題的關(guān)鍵在于制訂角色的安全等級(jí)劃分機(jī)制,即低等級(jí)的角色無法創(chuàng)建或?yàn)橛脩舴峙涓叩燃?jí)的角色,保證角色中的權(quán)限不被濫用。
本文通過對(duì)比傳統(tǒng)的訪問控制技術(shù),研究了MongoDB的RBAC模型。總體而言,MongoDB的這種訪問控制機(jī)制具有較高的靈活性和安全性,但由于角色沒有被劃分安全等級(jí),一些低端角色能夠分配高端角色,從而獲取更高的訪問權(quán)限。因此,在MongoDB數(shù)據(jù)庫的使用過程中,必須確保一些關(guān)鍵角色的信息不被丟失,以免造成嚴(yán)重的安全事故。
[1]Plugge E,Hawkins T,Membrey P.The Definitive Guide to MongoDB:The NoSQL Database for Cloud and Desktop Computing[J].Springer Ebooks,2010.
[2]杜衛(wèi)華.淺析基于MongoDB的云數(shù)據(jù)管理技術(shù)的研究與應(yīng)用[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2014.
[3] Zahid A,Masood R,Shibli M A.Security of sharded NoSQL databases:A comparative analysis[C]// Information Assurance and Cyber Security.IEEE,2014.
[4]Sathyadevan S,Muraleedharan N,Rajan S P.Enhancement of Data Level Security in MongoDB[M]// Intelligent Distributed Computing.Springer International Publishing,2015.
[5] Hou B,Qian K,Li L,et al.MongoDB NoSQL Injection Analysis and Detection[C]// IEEE,International Conference on Cyber Security and Cloud Computing.IEEE,2016.
[6]師德清.淺析MongoDB數(shù)據(jù)庫在CRP系統(tǒng)中的安全認(rèn)證機(jī)制[J].科協(xié)論壇,2011.
[7]宋志毅,馬兆豐,黃勤龍.基于保序加密的MongoDB數(shù)據(jù)加密技術(shù)研究與實(shí)現(xiàn)[C].中國(guó)通信學(xué)會(huì)學(xué)術(shù)年會(huì),2014.
[8]Sandhu R.Rationale for the RBAC96 family of access control models[C]// ACM Workshop on Role-Based Access Control.ACM,1996.
[9]Park J,Sandhu R.The UCON ABC,usage control model[J].Acm Transactions on Information & System Security,2004.