張俊 馬云飛 姚萌萌
摘要:隨著Internet的快速擴張,信息安全問題也日趨成為商家關注的焦點,VPN作為解決網(wǎng)絡通信安全問題的工具被越來越多的網(wǎng)絡安全廠商研發(fā)和生產(chǎn)。通過利用成熟的開源框架可以有效的減少開發(fā)成本,但同時也由于得不到好的技術支持會增加添加自己個性化元素的難度。添加自定義載荷是一種常用的VPN研發(fā)中的應用。該文利用IKEv1協(xié)議下的開源框架strongswan介紹了IKE的實現(xiàn)模型,并介紹了在strongswan中添加自定義載荷以及在配置文件中添加開關控制是否啟用該載荷的方法。
關鍵詞: 信息安全;VPN;strongswan;IKE;自定義載荷
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2014)02-0278-03
隨著internet的快速擴張,人們對網(wǎng)絡的依賴程度越來越高了。所以不管是軍隊、國家機關,還是企業(yè),甚至是個體之間的通信,對網(wǎng)絡信息安全的要求也越來越高。而TCP/IP協(xié)議的最初設計沒有考慮到安全性,因此IETF(Internet Engineering Task Force)開發(fā)了Internet Protocal Security(IPSEC)協(xié)議套件來實現(xiàn)通信的安全。IPSEC協(xié)議在下一代Internet中,將作為協(xié)議的一部分被加入IPV6中去。
在進行IPSEC通信之前,要求通信雙方協(xié)商起一套安全聯(lián)盟(SA),來決定保護數(shù)據(jù)包的加密算法、認證算法、密鑰及密鑰生存周期等。Internet Key Exchange(IKE)作為一種成熟的協(xié)商機制,具有安全、健壯的特點,在信息安全領域中常被用來進行動態(tài)的SA建立。該文使用IKEv1的開源框架strongswan 4.4.1討論IKE在linux操作系統(tǒng)上的實現(xiàn)并介紹了在strongswan上進行代碼改造實現(xiàn)添加新的功能載荷的方法。
1 IKE實現(xiàn)
1.1 IKE模型
1.2 模塊功能及運行過程分析
1.2.1 ipsec啟動腳本
ipsec啟動腳本是用戶控制程序行為的直接入口,對strongswan的所有控制都是通過ipsec腳本及其傳遞的參數(shù)實現(xiàn)的,基本功能包括:顯示當前所用的strongswan版本,開啟、關閉和重啟strongswan,重新解析并加載配置文件,控制全部或部分隧道的鏈接建立和斷開,顯示當前所有或部分隧道的狀態(tài)信息等。
啟動腳本并不實現(xiàn)具體的功能,其控制方式主要通過向starter進程發(fā)送信號量或直接調(diào)用whack程序給pluto發(fā)送whack消息,由starter和pluto來實現(xiàn)具體的功能。
1.2.2 starter進程
starter的主要功能是控制pluto的開關,以及解析配置文件ipsec.conf。starter是一個后臺進程,從啟動ipsec開始后starter就一直存在,到關閉ipsec之后結束。進程開始執(zhí)行時,starter會設置一組專用的信號量,用來接收ipsec啟動腳本傳來的開、關、重啟、重新加載配置文件以及pluto進程因為異常原因退出返回的通知消息。之后starter讀取ipsec.conf配置文件,加載證書及隧道conn,并根據(jù)配置文件指定的動作啟動pluto后臺進程。starter結束時同樣要發(fā)送消息通知pluto結束。
starter是通過構造whack消息,并將whack消息發(fā)送給pluto來進行和pluto間的通信的。
1.2.3 whack程序
whack程序提供了ipsec啟動腳本和pluto進程之間交互的功能,由ipsec啟動腳本直接調(diào)用,根據(jù)參數(shù)構造相應的whack消息并發(fā)送給pluto。
1.2.4 pluto進程
strongswan中最復雜的程序,也是整個框架的核心進程。pluto主要負責整個協(xié)商過程中消息的交互,并把協(xié)商得到的SA發(fā)送給內(nèi)核,同時也要接收由ipsec啟動腳本和starter進程發(fā)來的whack控制消息。pluto受到starter解析配置文件后生成的conn結構后,會把他們加入到pluto的connections全局鏈表,之后會安排所有的connections發(fā)起協(xié)商。pluto的協(xié)商是以有限狀態(tài)機實現(xiàn)的,每一個connections都會有對應的state結構記錄當前的狀態(tài)。狀態(tài)機規(guī)定了pluto在某一個特定狀態(tài)到下一狀態(tài)轉(zhuǎn)換時超時處理,消息中應該包含的載荷以及該狀態(tài)下應該發(fā)出的與對端通信設備交互的消息。經(jīng)過多次消息的交互(IKEV1規(guī)定了兩個階段共9條消息的交互,主模式6條,快速模式3條),最終通信雙方能協(xié)商起一套通信中可以使用的通過驗證的密鑰以及建立在雙方同意基礎上的安全服務(即安全聯(lián)盟SA)。pluto把SA發(fā)送給內(nèi)核后,往內(nèi)核添加相應的安全路由(SPD)。如果內(nèi)核沒有返回任何錯誤消息,則一次協(xié)商成功。
1.2.5 內(nèi)核
內(nèi)核需要接收pluto傳遞下來的SA和SPD,并在內(nèi)核下維護自己的SA和SPD鏈表。另外內(nèi)核還需要提供更新、刪除SA和SPD的接口,因為應用層可能會有重啟服務或者到期更新SA的事件發(fā)生。如果在添加或刪除的過程中有異常發(fā)生,則內(nèi)核需要返回錯誤消息通知上層。
2 IKE功能載荷擴充
2.1 功能開關添加
在實際應用中,VPN生產(chǎn)廠商經(jīng)常需要根據(jù)實際應用在現(xiàn)有的框架下加入自己產(chǎn)品特有的元素,例如帶有某個特定功能的載荷。這一節(jié)將詳細討論在strongswan開源框架下進行改造加入某個新的載荷,并添加一個開關使得可以通過在ipsec.conf中添加新的配置項控制協(xié)商過程中是否使用新載荷。
Ipsec.conf配置文件中每一個配置項都對應wordlist數(shù)組(keywords.c)中的一項,添加新的配置項的時候需要在wordlist中添加新的數(shù)組項。另外配置項的名字需要用一個strongswan自己定義的哈希算法做一次哈希,并用哈希值作為索引在哈希表lookup(keywords.c)中查找,哈希表lookup中“-1”的位置表示還沒有被占用,其他值表示這個以這個名字命名的配置項在wordlist中的索引值。新添加的項的名字在做過哈希算法后需要保證lookup中以其哈希值為索引查找到的哈希表項值為“-1”。把這個“-1”改成新添加的wordlist數(shù)組項的索引值。由于strongswan本身已經(jīng)支持很多配置項,因此lookup表中已經(jīng)有超過三分之二的表項被占用。想要得到一個可用的配置項名字需要多做嘗試或者擴大lookup表的大小以支持更大的哈希值。kw_token_t(keywords.h)中要添加新項的token, token_info(Args.c)中也需要添加相應的新數(shù)組項,定義新添加的項的類型以及所跟參數(shù)的格式。
confread_load(confread.c)函數(shù)主要負責解析配置文件,并將解析的結果組織成starter_config_t(confread.h)結構。confread_load中將調(diào)用函數(shù)load_conn(confread.c),load_conn根據(jù)parser_load_conf(confread.c)解析得到的config_parsed_t(parser.h)結構決定starter_conn_t中應該有的屬性。這里我們需要在starter_conn_t結構中添加我們的功能開關成員,并在load_conn函數(shù)中添加解讀我們自己添加的功能開關值的代碼。
最后starter會通過starter_whack_add_conn(starterwhack.c)組織whack消息通知pluto,whack消息中也需要添加代碼打包我們加入的功能開關。pluto收到whack消息后會組織自己的conn鏈表,這之后pluto在協(xié)商時之后就可以根據(jù)conn中功能開關的狀態(tài)來決定是否使用自定義載荷。
2.2 協(xié)商過程中自定義功能載荷的添加
自定義載荷的添加十分靈活,可以插入到一條消息的任何位置。假設當前我們需要在主模式的第一條消息中插入一條內(nèi)容為字符串“abcd”的載荷,插入位置為SA載荷和Pluto Vendor ID載荷之間。
3 結束語
strongswan框架和linux操作系統(tǒng)都是開源免費的,利用開源平臺進行產(chǎn)品開發(fā)對于減少成本很有幫助,但缺點就是得不到相應的技術支持。添加自定義的載荷是一種比較常用的應用,利用本文介紹的內(nèi)容進行改造可以實現(xiàn)載荷添加和協(xié)議改造。
參考文獻:
[1] 陳湖,王猛,聶躍光.基于windows的IKE的研究和設計[J].計算機技術與發(fā)展,2008,6,18:53-55.
[2] 謝希仁.計算機網(wǎng)絡[M]. 5版.北京:電子工業(yè)出版社,2009,1.
[3] 曹桂平.linux內(nèi)核網(wǎng)絡棧源代碼情景分析[M]. 北京:人民郵電出版社,2010,1.
[4] CHRISTIAN BENVENUTI.Understanding linux network internals[M].OReilly Media, Inc,2009,6.