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