开源大数据平台的安全实践
開源大數據平臺的安全實踐
劉杰
百度(中國)有限公司,北京 100085
摘要:開源大數據平臺的安全機制目前并不特別完善,特別是用戶認證、日志審計等方案還存在不少問題。分析了開源大數據平臺存在的安全隱患,在開源Hadoop平臺的基礎上提出了基于Giaho的大數據平臺用戶認證機制和基于高效的日志審計方案,并結合百度公司的實際應用闡述所提技術方案的有效性。該技術方案具有一定的普適性,可根據企業當前技術環境靈活使用。
關鍵詞:大數據安全;用戶認證;日志審計;數字安全
doi:10.11959/j.issn.2096-0271.2017050
論文引用格式:劉杰. 開源大數據平臺的安全實踐[J]. 大數據, 2017, 3(5): 38-44.
LIU J. Practice on security of big data platform[J]. Big Data Research, 2017, 3(5): 38-44.1? 引言
伴隨大數據技術的發展,數據資源逐漸成為最重要的資源。國家“十三五”規劃綱要中指出,實施國家大數據戰略,把大數據作為基礎性戰略資源,促進大數據發展。世界已經進入由數據主導的“大時代”。大數據是一場革命,將改變人們的工作、生活和思維方式。但是大數據是一把雙刃劍,使人們在享受大數據帶來的巨大價值的同時,也帶來了大數據的安全問題。大數據在數據采集、數據處理、數據存儲和數據內容安全等方面均存在著極大的風險。
Hadoop等開源軟件提供了適用于數據采集、數據處理、數據存儲和數據挖掘等各環節的大數據工具,包含完整的數據存儲和數據處理方案,已經成為大數據的工業標準。然而Hadoop等開源軟件的安全機制并不是非常完善,在用戶認證、安全審計等方面還有不少的問題。隨著企業對大數據平臺的依賴逐步加強,如何構建安全的大數據平臺成為企業用戶關注的重要問題。本文主要介紹了百度公司在開源大數據平臺的安全加固實踐,重點介紹Hadoop用戶認證、安全審計等方面的技術實現。
2 ?大數據平臺安全實現
大數據平臺是企業的核心數字資產,需要進行多層次、全方案安全加固和安全防護。開源大數據平臺各子系統的安全定義和安全接口是不同的,目前尚沒有統一的安全技術標準,各公司根據自身業務需求提供不同的安全加固方案。本文介紹百度公司針對開源大數據平臺的安全加固案例,開源大數據平臺安全加固主要包括邊界隔離、訪問控制、日志審計和數據保護4個方面。
邊界隔離是通過軟件定義安全技術,將大數據平臺劃分到特定的數據域,以便統一實施特定的安全策略;訪問控制涉及的主要技術是用戶認證和用戶授權,本文將介紹大數據平臺與百度Giano用戶認證系統集成方案;日志審計是“事后”安全分析的重要手段,通??赏ㄟ^分析系統日志實現,本文將介紹Hadoop平臺日志審計方案;數據保護用到的技術包括加密解密、數字水印、同態運算等。
2.1 大數據平臺用戶認證
用戶認證是大數據平臺安全的重要安全環節,要求系統需明確回答以下兩個問題:當前用戶是誰;當前用戶是不是仿冒的。為了解決用戶認證的問題,很多公司在開源大數據平臺中啟用Kerberos認證,然而,在開源大數據平臺中啟用Kerberos認證存在以下問題。
● 配置復雜。Kerberos生成證書和配置步驟十分復雜,調試也十分困難,沒有一定經驗很難操作實施。
● 延展性不佳。機器的擴容和減少都會造成證書的重新生成和分發,給運維造成很大困難。
● 存在單點失敗風險。Kerberos中心服務器存儲所有用戶的密鑰,中心服務器故障會導致整個大數據平臺不可用。同時,Kerberos要求嚴格的時鐘同步,不然會導致認證失敗。
考慮到Kerberos的復雜性,很多公司放棄了Kerberos認證。在沒有啟用Kerberos的情況下開源大數據平臺的用戶可隨意被篡改。例如Hadoop平臺的客戶端程序默認從當前服務器的環境變量中讀取HADOOP_USER_NAME作為用戶名,如果HADOOP_USER_NAME為空,則獲取當前操作系統用戶作為Hadoop的用戶。因此僅需在客戶端修改HADOOP_USER_NAME環境變量就可偽造用戶進行非法操作。
百度公司大數據團隊意識到開源大數據平臺安全方面的問題后,深入研究Hadoop等開源系統的內部原理,自主研發了基于Giano的大數據平臺用戶認證機制,并將Giano作為開源大數據平臺安全加固的核心技術方案,在內部推廣使用。
2.1.1 百度Giano簡介
Giano是百度公司開發的企業級安全平臺,面向互聯網數據中心(internet data center,IDC)環境提供一站式安全服務,包括安全登錄與權限管理、統一身份管理、認證鑒權審計、訪問控制、安全配置及變更管理、數據統計挖掘以及策略合規等。解決了從入口處的IDC安全登錄、進程啟用,到所有與服務及資源訪問相關的一攬子安全問題,滿足了應用環境隔離、跨域安全訪問、托管代理認證、權限管理實施、細粒度資源分配以及服務狀態全程監控分析等一系列典型實際需求。
Giano的核心設計源于先進的訪問控制安全理論,其實現過程中亦廣泛采用了高效的開發工具和嚴格的質量控制管理,使得Giano在安全性、可用性以及實際效率等方面均取得了滿意的結果。例如通常情況下,其典型中心服務器和客戶端每秒查詢率(query per second,QPS)可達到十萬甚至百萬級別。
2.1.2 Hadoop與Giano集成
由于開源大數據平臺本身組件比較多,各組件的集成比較瑣碎。本文以Hadoop分布式文件系統(Hadoop distributed file system,HDFS)為例,說明Hadoop和Giano的集成方案。
Hadoop系統主要由NameNode、DataNode和Client 3部分組成。其中NameNode負責管理元數據,而DataNode負責具體文件的存儲。NameNode的元數據信息主要包括目錄結構(目錄下有哪些子目錄和文件)、權限信息(目錄或文件的所有者、同組的用戶及其他用戶的讀、寫、進入權限)、文件分塊存儲信息(文件分成幾個數據塊以及數據塊存儲在哪些服務器上)。DataNode負責具體數據塊的存儲。Client是數據的訪問客戶端,通過客戶端可以把數據寫入集群,或者從集群讀取數據。
Hadoop系統與Giano集成后的操作流程如圖1所示。Client進行任何文件操作都需連接NameNode獲取文件元數據信息,因此可在NameNode上進行權限判斷。Client連接NameNode之前,可通過Giano系統獲得當前用戶的身份信息,根據用戶名向Giano申請訪問令牌,即安全認證憑證。拿到令牌信息后,客戶端將用戶名和令牌一起發送給NameNode,NameNode詢問Giano驗證用戶是否合法。通過Giano驗證后的用戶名可作為Hadoop用戶名,并以此用戶名判斷用戶是否有權限。
圖1 ?Hadoop與Giano集成后的操作流程
集成Giano后的業務情景分析和特點分析如下。
● 用戶名和登錄的操作系統賬號剝離。如Wang Ming和Li Qiang兩名員工同時以工作賬號登錄同一臺服務器訪問Hadoop集群,集成Giano后的Hadoop系統仍然可以區分出來到底是哪名員工正在訪問。
● 身份信息不可偽造。Hadoop與Giano集成后,服務端NameNode對客戶端傳遞過來的用戶名和令牌要進行驗證,客戶端無法仿冒其他用戶。
2.2 大數據平臺日志審計
2.2.1 日志審計方案
大數據平臺日志審計是大數據平臺安全的重要組成部分。日志審計需要記錄用戶在什么時間從哪臺服務器對文件做出了什么操作。對于Hadoop系統而言,可審計的文件操作如下。
● Rename:文件改名。
● Open:打開文件。
● Delete:刪除文件。
● listStatus:列出子目錄。
● create:創建文件。
● setPermission:設置文件權限。
● GetFileInfo:得到文件信息,包括路徑、文件長度、是否是目錄、數據塊副本數、數據塊大小、最后修改時間、最后獲取時間、文件權限等信息。
● mkdirs:創建目錄。
Hadoop日志審計功能開啟之后,所有的文件操作都會被記錄下來。在大型Hadoop集群中NameNode每秒需要處理數萬個文件操作,如果任何操作都記錄下來會嚴重影響NameNode的處理速度。另外,日志審計需要頻繁比對審計規則,有可能導致NameNode內存碎片化,進而引發大量Java垃圾收集(garbage collection,GC)操作,也會影響NameNode的處理速度。為了實現Hadoop日志審計功能,同時又能保證NameNode處理速度,本文提出了一種基于規則的高效日志審計方案,可為Hadoop提供按需審計服務。實際應用場景中,可利用本方案實現敏感數據的日志審計。
本技術方案可通過規則配置開啟任意目錄的若干操作審計,例如用戶A非常關心其業務數據什么時間被用戶刪除掉,他可以僅對目錄啟用刪除審計;用戶B需要知道其業務數據被哪些人訪問過,他可以對目錄開啟讀取審計。管理員可根據業務需求隨時調整審計規則,包括增加審計目錄、調整需要審計的操作指令等。規則調整后定時生效,不需要重啟集群。
如果hdfs://ns1/user/user1/a.db需要審計改名和打開操作,而hdfs://ns2/user/user1/b.db需要審計創建和刪除操作,則具體的配置規則如下。
<audit-config>
<audit-directory>
<path>hdfs://ns1/user/user1/a.db</path>
<commands>rename,open</commands>
</audit-directory>
<audit-directory>
<path>hdfs://ns2/user/user1/b.db</path>
<commands>create,delete</commands>
</audit-directory>
</audit-config>
2.2.2 目錄匹配算法
本文提出的技術方案是通過NameNode插件機制實現的,核心原理是擴展HdfsAuditLogger接口,增加高效的目錄匹配算法實現目錄匹配。NameNode的目錄匹配算法是采用字符樹的判斷方法,把所有需要判斷的目錄組成一個字符樹。字符樹的定義如下:
Class CharacterTree {
Char c; //當前節點字符
CharacterTree[]subTree; //子樹數組,按數組元素CharacterTree的字符c有序,可以加快查找速度
Boolean leaf; //是否是葉子節點,即最后一個字符
Set<String> commands;//僅 leaf= true時才不為空,保存目錄的審計命令的集合
}
本技術方案核心內容包括動態加載、目錄匹配、匯總輸出等模塊。動態加載模塊的主要功能是從配置文件中讀取目錄判定規則,并對規則配置項進行必要的過濾和容錯處理,生成目錄判斷規則樹。該模塊定期讀取配置文件,并判斷該配置文件是否發生了修改,如果發生了修改,則重新生成一個判斷規則樹,并用新生成的樹替換之前的樹。其具體實現方案是hdfssite.xml增加配置項用于設置審計規則,示例代碼如下。
<property>
<name>dfs.namenode.audit.file</name>
<value>/etc/hadoop/auditfile.xml</value>
</property>
<property>
<name>dfs.namenode.audit.file.check.interval</name>
<value>60000</value>
</property>
<property>
<name>dfs.namenode.audit.loggers</name>
<value>org.apache.hadoop.hdfs.namenode.CharacterTreeAuditLogger</value>
</property>
動態加載程序根據配置文件修改時間和上一次配置生效時間等因素判斷是否需要重新加載應用規則,當且僅當配置文件發生更改后才會重新加載,以減少系統消耗。動態加載機制確保配置規則修改后,不需要重新啟動集群即可生效。
當NameNode通過配置文件后,可以根據配置文件生成判斷規則樹,用于判定當前訪問行為是否需要進行審計,判定規則樹的生成流程如下。
步驟1 初始化字符樹,treeRoot作為字符樹的根節點,其字符是’/’。
步驟2 把所有的審計目錄配置項讀到一個新的列表中。
步驟3 依次對比列表中的目錄配置項。如果這個配置項的Namespace和當前Namespace不相同,則忽略,否則轉到步驟4。
步驟4 取出配置的路徑部分,如“/user/user1/a.db”,如果以字符‘/’結尾,則把最后‘/’符號去掉。
步驟5 調用treeRoot.addPath(path, 1,commands),將當前路徑的字符依次添加到字符樹里。
步驟6 所有配置項處理完后,判斷規則樹生成完畢。
上述步驟4中需要多次調用addPath指令構建字符樹,例如需要將path為“/user/user1/a.db”的配置項添加到字符樹的流程如下。
步驟1 從path取出一個字符,假如當前字符為“u”,執行步驟2。
步驟2 判斷子樹節點是否等于當前字符。如果相等,則執行步驟4,否則執行步驟3。
步驟3 初始化一個新的字符子樹,它的根節點為當前字符,并將該子樹添加到當前字符樹中,執行步驟4。
步驟4 把index的值增加1,如果當前index的值小于path的長度,重新執行步驟1。如果當前index的值等于path的長度,執行步驟5。
步驟5 設置當前字符樹的leaf的值為“true”,代表當前字符為最后一個字符,整個path處理完畢。
當目錄字符樹生成以后,系統會根據字符數判定當前訪問行為是否需要進行審計,如果需要審計,則輸出審計日志。審計結果輸出是通過調用logAuditEvent審計方法實現的,其接口定義如下。
public void logAuditEvent(boolean succeeded,
String userName,
InetAddress addr,
String cmd,
String src,
String dst,
FileStatus status,
UserGroupInfor mation ugi,
DelegationToken SecretManager dtSecretManager) {
//print information
}
當NameNode調用logAuditEvent方法輸出審計日志時,需要快速判斷當前訪問路徑是否需要審計,如果判定速度慢,會拖慢NameNode處理速度,進而影響整個集群的性能。本方案利用字符樹進行快速判定,其主要特點如下。
● 在審計過程中,一次只判斷一個字符,任何字符匹配不成功就立即返回。單線程測試每秒可執行1 000萬次判定,不會影響NameNode的處理速度。
● 在判斷過程中沒有鎖,多線程訪問沒有競爭。
● 在審計過程中,一次只取一個字符,不產出臨時字符串,可減少NameNode GC壓力。
2.3 實際應用
該技術方案已經在百度公司安全管理部的大數據集群穩定運行了半年。該集群有1 100臺服務器、38 000多個CPU核心、30 PB存儲空間、日運行作業近2萬個,存有安全軟件開發工具包(software development kit,SDK)、威脅情報、網址安全、電腦安全、內網安全等數據。這些數據分為3類:不涉及隱私的數據;用戶Cookie等雖然不直接包含隱私數據,但可以通過關聯找到用戶行為的半隱私數據;用戶手機號、訪問記錄等用戶隱私數據。
通過Hadoop本身的文件權限控制和Giano的集成,可以防止數據被非法訪問。通過審計程序可以跟蹤敏感數據的訪問情況。訪問分為兩種,第一種是非法拒絕訪問的記錄,記錄了哪位用戶嘗試訪問未授權的文件。第二種是有權限用戶的訪問,此信息對于數據泄露的追蹤有關鍵作用。
審計程序先把數據寫到本地硬盤上,然后通過消息傳輸系統上傳到Hadoop平臺進行分析。這個數據仍然是隱私數據,需要授權才能訪問,并且需要審計。
3 ?結束語
本文總結歸納了在生產實踐過程中針對開源大數據平臺的安全加固方案,重點介紹了關于Hadoop平臺的用戶認證和日志審計方案技術實現。其中,Hadoop用戶認證是集成百度Giano系統實現的,Hadoop日志審計是通過擴展NameNode提供高效目錄匹配算法實現的。這些技術方案具備一定的普適性,可根據企業當前技術環境靈活使用。
點擊下方?閱讀原文?即可獲取全文
作 者 簡 介
劉杰(1979?),男,百度(中國)有限公司商業安全研發部主任、研發架構師,主要研究方向為分布式計算、Linux內核文件系統、海量數據存儲與挖掘、大數據架構及數據安全防護技術。
?
《大數據》期刊
《大數據(Big?Data?Research,BDR)》雙月刊是由中華人民共和國工業和信息化部主管,人民郵電出版社主辦,中國計算機學會大數據專家委員會學術指導,北京信通傳媒有限責任公司出版的科技期刊。
關注《大數據》期刊微信公眾號,獲取更多內容
總結
以上是生活随笔為你收集整理的开源大数据平台的安全实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二进制转换为八进制-栈方式实现
- 下一篇: C语言解决汉诺塔问题