本計畫所建構出之各子系統簡述如下:
支援多樣功能之雲端資料安全儲存 此部份之研究主題包含以下三項成果:
保護隱私的雲端入侵偵測 (1) 建立雲端環境
本實驗中我們採用三台筆記型電腦當作我們的雲,每一台電腦是雙核心 1.4GHz,
記憶體 2GB,硬碟 320GB,作業系統是 Ubuntu。安裝 Hadoop 來建立雲的環境,其 中一台電腦為 Master,另外兩台為 Slaver。
在安裝 Hadoop 之前,要先將每一台電腦的網路給設定好。這個網路設定是為了 確保每一台電腦可以正確的通訊,在本實驗中,我們將三台電腦分別設定為
192.168.0.161, 192.168.0.162, 192.168.0.164。可以利用"ping"或"telnet"來測試每一台電 腦是否可以正確的通聯。因為 Hadoop 必須執行在 Java 虛擬機器上且版本必須為第 6 版以上,所以我們要安裝 Sun Java 6 的套件,可用"apt-get install sun-java6-jre"來完成 Java 的安裝。安裝完 Java 後,我們必須確認 Java 安裝的路徑,在本實驗中為
"/usr/lib/jvm/java-6-sun",這個路徑是要用來設定 Hadoop 的設定檔,以確保 Hadoop 可以正確地找到 Java 安裝的位置。因為 Hadoop 是採用 SSH 當作每一個節點彼此的 通訊方式,因此我們安裝 OpenSSH 以及設定每一個節點用來認證彼此的金鑰。安裝 及設定完後可用"ssh ip"來確認安裝及設定是否成功。
完成好上述準備工作後(網路設定→安裝 Java→安裝設定 SSH),接著我們才可以 開始安裝 Hadoop。Hadoop 的安裝只要注意到其安裝的位置和使用者權限即可,在本 實驗中我們的安裝路徑為"/opt/hadoop-0.20.2"(其版本為 0.20.2),使用者為"hadoop"。
安裝為後要設定"hadoop-env.sh"、"core-site.xml"、"hdfs-site.xml"、"mapred-site.xml"、
"master"、"slaver"等相關檔案。完成其相關設定後我們可以開啟瀏覽器輸入:
http://node1:50030 來檢查 Hadoop 是否可以運行。其運行圖如下圖所示。
46
圖表十九:Hadoop 執行狀態 (2) 建立關鍵字資料庫
我們的入侵偵測服務是對電腦的網路封包做關鍵字比對,比對封包是否有和事先 定義好的攻擊特徵符合。一個封包可以分為 header 和 payload 兩大部分,我們針對這 兩部分做分析和比對,來檢查每一個封包內是否含有惡意的特徵值。因此,在 SNORT rule 當中,我們針對 Payload Detection 和 Non-payload Detection 兩大部分做分析和研 究,希望可以找到最少組的關鍵字來做比對又可以涵蓋大部分的 SNORT rule。分析 完 SNORT 規則後,我們選出三個關鍵字:"content"、"flow"、"icode"當作關鍵字來轉 換 SNORT 規則來成為我們的關鍵字資料庫。轉換的方法是保留上述所提到的關鍵 字,加上述關鍵字的內容經過 SHA-1 固定長度後附加在原來規則的後方當作比對的 關鍵字資料。最後我們將轉換後的關鍵字資料庫放到雲端上儲存。其轉換方法如下圖 所示。
圖表二十:SNORT rule 轉換方法和過程
SNORT rule 中含有大約 8800 條左右的規則,在 Figure 3 中我們表示為 ,而每一 個 可分為 和 兩部分,其中 包括 SNORT rule 的行為、來源方 IP 和 PORT、接收方 IP 和 PORT、網路流向等部分,而 是 SNORT rule 用來做比對的內容,每一個 又分 為 和 ,其中 代表 中要比對的關鍵字,而 帶關鍵字裡面要比對的內容。舉例來說,
假設 是 content:hello; ttl:64;,則 =content, =hello,其比對方式是比對每一個封包內 的 payload 部分,看是否含有 hello 這個內容,而 =ttl, =64,其比對方式是比對每
47
一個封包內 ttl 這個 header 是否其內容為 64。而比對的部份我們只關心 Payload 和 Non-payload 的部分,所以我們將我們要比對的關鍵字做成 Keyword List(KL)來過濾 分析 的內容。將取出的 中的 的部分我們使用 SHA-1 雜湊函數來固定其長度和格 式,表示為 ,然後將原先的 = || 轉換為 || 。將每一個收集起來成為對應 的 ,然後 將 || 放到雲端上儲存,當作是先定義好的特徵值。
(3) 保護隱私方法
我們利用 Song, Wanger, Perrig 的方法和 Java 撰寫出對應的 client-server 程式來達 到保護使用者上傳資訊的隱私。這個程式分為兩個部分:client 和 server。
Client 這程式具有以下能力:收集使用者電腦的封包、分析和轉換收集來的封包、
JpcapCaptor.openDevice(devices[Integer.parseInt("4")], 2048, false , 10); ",
然後開始收集流經這張網卡的封包" captor.loopPacket(-1, ps); "。
分析和轉換收集來的封包
由於我們是採用 SNORT rule,而 SNORT 目前只支援 ip, tcp, udp, icmp 等協定,所以我們針對這幾個協定收集及封包" p = ps.getPacket();
"," if( p != null && p instanceof IPPacket ) "," if( p != null && p instanceof TCPPacket ) "," if( p != null && p instanceof UDPPacket ) ","
if( p != null && p instanceof ICMPPacket ) ",上述功能就可將封包 header 的部份給收集起來;因為 SNORT 並不是每一個 header 都有比對,所以 我們根據我們分析 SNORT 的結果,將 SNORT rule 有可能比對得 header 給找出來," tcp.sequence "," icmp.code ",etc..。另一方面,由於 SNORT rule 有很大的部分都是比較 payload 的部分,所以我們還必須收集封包 內 payload 的部分" byte[] PData = p.data; ",將收集來的 payload 轉換成 16 進位的 ASCII 的格式表示。
加密收集來的封包
為了保護上傳到雲端上的封包的隱私,我們對這些封包做一個加密 的動作。一般而言,一個封包裡面會含有許多的 header,而我們只對 header 的內容做加密,然後將 header 轉換成我們是先定義好的關鍵字。
舉例來說,假設我們先前收集到的封包含有 header "icode"且其內容是
"15",則我們後將"15"做加密並且保留"icode"這個關鍵字;假設我們先 前收集到的封包的 payload 為"47 48 49"(16 進位 ASCII 表示法),則我們
48
對"47 48 49"做加密並對其附加一個關鍵字叫做"content"。
接著我們要說明我們加密的方法。由於收到要加密的內容長度都不 固定,所以我們會利用 SHA-1 雜奏函數來將其長度固定。加密的方法 如下圖所示。首先加密的內容經過 SHA-1 固定長度為 W,為了加密 W 我們要產生一把 key=a||h(a)||r 來和 W 做 xor 這個運算。Key 產生的方式 為先隨機選擇一個 t bits 長的隨機數 a,接著用 hash 算出 h(a)的值並且 取其前面 s bits,本實驗用的 hash 是 SHA-1 這個雜奏函數,最後再取一 個 n-s-t bits 長的隨機數 r(n 是 W 的 bit 數),則 key 就如下圖所示:key = a||h(a)||r。
圖:加密演算法示意圖
儲存收集來的封包
我們要將收集來的封包暫時儲存在 client 端,以等待 server 端傳回 的候選者名單做最後的比較。在這裡我們是將每一個收集到的封包用"
時間序號(從 1970 年 1 月 1 日 00:00:00 開始算)"當做 index,用"map"這 個結構的方式儲存在 client 端。
上傳資訊到雲端
利 用 socket programming 的 方 式 " out.writeObject(sendlist); " , "
out.flush(); ",將前面加密過的封包上傳到遠端的雲上。
比對候選者名單和儲存收集過的封包來判斷是否遭受惡意攻擊 將雲傳回來的候選者名單和儲存的收集來的封包直接做明文比 對,來判斷之前上傳到雲端的封包是否為惡意攻擊。
目前這個程式只支援在一般電腦上執行。使用該電腦的使用者必須擁有 root 以上 的執行能力(為了打開網卡收集封包)且該電腦必須安裝 jpcap 這個 library(支援收集封 包的 library,該 library 目前不支援 64bit 的作業系統)和 Sun-Java(執行 Java 程式)。接 著在一般電腦上執行"sudo java client",即可開始執行上述功能。執行畫面如下圖所示。
圖表二十一:收集封包示意圖
49
圖表二十二:封包加密上傳示意圖
圖表二十三:收到候選者名單示意圖
Server 這程式具有以下能力:讀取和儲存關鍵資料庫、做關鍵字比對來分析上傳 的封包是否為可能的惡意攻擊、回傳候選者名單給使用者做最後的判斷。
Server 在收到 client 的 request 時,Server 會先將收到的 request 做一個前置處理,
這個處理主要是要取出從 client 端傳來封包的時間序號,我們將這個時間序號當作 index 來識別每一個上傳的封包;接著我們將其他上傳的資訊寫入一個檔案裡面,用 這個 index 當作檔名,上傳到 Hadoop 的 HDFS 上面" Process p =
run.exec("/opt/hadoop-0.20.2/bin/hadoop dfs -moveFromLocal " + name + " ."); ";最 後我們在 Hadoop 上寫一個 www 的程式來做關鍵字比對的功能,當 Server 收到 client 的 request 時,就會去執行 www 這個程式來完成關鍵字比對的工作。
www 這個程式的功能是讀取和儲存關鍵資料庫以及做關鍵字比對且 使用 Hadoop 自動地將工作分配給 slaver 這些 nodes 去執行。首先 www 要先找到儲存在 HDFS 上的關鍵字資料庫" FileInputFormat.setInputPaths(conf, new
Path("/user/hadoop/sig")); ",接著取出其內容" map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) "," String line =
value.toString(); ",另一方面,我們還必須將前面所提到的 index 這個檔案從 HDFS 中 找出來" patternsFiles = DistributedCache.getLocalCacheFiles(job); ",
" BufferedReader fis =
new BufferedReader(new FileReader(patternsFile.toString())); ";找出來之後我們利 用下面流程來和關鍵字資料庫的資料做比對如下圖所示。
圖表二十四:關鍵字比對流程
50
我們將從關鍵字資料庫取出來的資料稱作 datai = rulei||signaturei,而 index 這個檔 案裡個資料稱作 packet。其中 signaturei 要和 packet 做比對,當比對正確時,我們才 會將 rulei 放到候選者名單 L 中,當作回答傳回給使用者。每一個 signaturei 和 packet 都會含有"content","flow","icode"這三個關鍵字,比較的內容是關鍵字後面的那一 串二進位的值,其比對的流程是先比"content",若正確則往下比"flow",若依然正確 則繼續往下比"icode",反之一旦失敗,則比下一條 datai。若關鍵字後面沒有那一串 二進位的值,則當作正確,繼續比下一個關鍵字。
接著我們將說明比對的方法為何,在這我們會說明上述所提到的正確和失敗,何 謂比對正確?何謂比對失敗?其關鍵字比對方法如下圖所示。首先先比對 signaturei 和 datai 關鍵字為 content 的部分,將這兩部分後面那一串二進位的值做 xor 的運算,
會得到一個 Ki=Ki,a||Ki,b||Ki,c 的值,假設 h(Ki,a)前面的 s bits 和 Ki,b 的值一樣,則判 斷為正確,反之則判斷為錯誤。將判斷正確的 rulei 和 Ki,c 放到候選者名單 L 中。
圖表二十五:關鍵字比對方法
目前這個 Server 程式會將收到的 Client 的 request 上傳到 Hadoop 的 HDFS 上,然 後再去執行在 Hadoop 上的 www 這隻程式,當 www 程式執行完畢將結果留在 Hadoop 的 HDFS 上時,Server 才去將結果給取回來,回傳給對應的 Client 端。
藉由前面雲端環境的建立和關鍵字資料庫的建立,此 client-server 程式根據 Song, Wanger, Perrig 的方法來完成保護隱私的功能,其正確執行流程如下圖所示。首先 Client 會收集封包 X,經過分析和轉換後將其長度固定為 W,利用 Chiphertext Generation 這步驟將 W 加密為 C 上傳到 Server;Server 處理收到的 C 後,經過 Signatures
藉由前面雲端環境的建立和關鍵字資料庫的建立,此 client-server 程式根據 Song, Wanger, Perrig 的方法來完成保護隱私的功能,其正確執行流程如下圖所示。首先 Client 會收集封包 X,經過分析和轉換後將其長度固定為 W,利用 Chiphertext Generation 這步驟將 W 加密為 C 上傳到 Server;Server 處理收到的 C 後,經過 Signatures