APP下载

IKE框架实现和功能扩充的研究

2014-02-17张俊马云飞姚萌萌

电脑知识与技术 2014年2期
关键词:信息安全

张俊 马云飞 姚萌萌

摘要:随着Internet的快速扩张,信息安全问题也日趋成为商家关注的焦点,VPN作为解决网络通信安全问题的工具被越来越多的网络安全厂商研发和生产。通过利用成熟的开源框架可以有效的减少开发成本,但同时也由于得不到好的技术支持会增加添加自己个性化元素的难度。添加自定义载荷是一种常用的VPN研发中的应用。该文利用IKEv1协议下的开源框架strongswan介绍了IKE的实现模型,并介绍了在strongswan中添加自定义载荷以及在配置文件中添加开关控制是否启用该载荷的方法。

关键词: 信息安全;VPN;strongswan;IKE;自定义载荷

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)02-0278-03

随着internet的快速扩张,人们对网络的依赖程度越来越高了。所以不管是军队、国家机关,还是企业,甚至是个体之间的通信,对网络信息安全的要求也越来越高。而TCP/IP协议的最初设计没有考虑到安全性,因此IETF(Internet Engineering Task Force)开发了Internet Protocal Security(IPSEC)协议套件来实现通信的安全。IPSEC协议在下一代Internet中,将作为协议的一部分被加入IPV6中去。

在进行IPSEC通信之前,要求通信双方协商起一套安全联盟(SA),来决定保护数据包的加密算法、认证算法、密钥及密钥生存周期等。Internet Key Exchange(IKE)作为一种成熟的协商机制,具有安全、健壮的特点,在信息安全领域中常被用来进行动态的SA建立。该文使用IKEv1的开源框架strongswan 4.4.1讨论IKE在linux操作系统上的实现并介绍了在strongswan上进行代码改造实现添加新的功能载荷的方法。

1 IKE实现

1.1 IKE模型

1.2 模块功能及运行过程分析

1.2.1 ipsec启动脚本

ipsec启动脚本是用户控制程序行为的直接入口,对strongswan的所有控制都是通过ipsec脚本及其传递的参数实现的,基本功能包括:显示当前所用的strongswan版本,开启、关闭和重启strongswan,重新解析并加载配置文件,控制全部或部分隧道的链接建立和断开,显示当前所有或部分隧道的状态信息等。

启动脚本并不实现具体的功能,其控制方式主要通过向starter进程发送信号量或直接调用whack程序给pluto发送whack消息,由starter和pluto来实现具体的功能。

1.2.2 starter进程

starter的主要功能是控制pluto的开关,以及解析配置文件ipsec.conf。starter是一个后台进程,从启动ipsec开始后starter就一直存在,到关闭ipsec之后结束。进程开始执行时,starter会设置一组专用的信号量,用来接收ipsec启动脚本传来的开、关、重启、重新加载配置文件以及pluto进程因为异常原因退出返回的通知消息。之后starter读取ipsec.conf配置文件,加载证书及隧道conn,并根据配置文件指定的动作启动pluto后台进程。starter结束时同样要发送消息通知pluto结束。

starter是通过构造whack消息,并将whack消息发送给pluto来进行和pluto间的通信的。

1.2.3 whack程序

whack程序提供了ipsec启动脚本和pluto进程之间交互的功能,由ipsec启动脚本直接调用,根据参数构造相应的whack消息并发送给pluto。

1.2.4 pluto进程

strongswan中最复杂的程序,也是整个框架的核心进程。pluto主要负责整个协商过程中消息的交互,并把协商得到的SA发送给内核,同时也要接收由ipsec启动脚本和starter进程发来的whack控制消息。pluto受到starter解析配置文件后生成的conn结构后,会把他们加入到pluto的connections全局链表,之后会安排所有的connections发起协商。pluto的协商是以有限状态机实现的,每一个connections都会有对应的state结构记录当前的状态。状态机规定了pluto在某一个特定状态到下一状态转换时超时处理,消息中应该包含的载荷以及该状态下应该发出的与对端通信设备交互的消息。经过多次消息的交互(IKEV1规定了两个阶段共9条消息的交互,主模式6条,快速模式3条),最终通信双方能协商起一套通信中可以使用的通过验证的密钥以及建立在双方同意基础上的安全服务(即安全联盟SA)。pluto把SA发送给内核后,往内核添加相应的安全路由(SPD)。如果内核没有返回任何错误消息,则一次协商成功。

1.2.5 内核

内核需要接收pluto传递下来的SA和SPD,并在内核下维护自己的SA和SPD链表。另外内核还需要提供更新、删除SA和SPD的接口,因为应用层可能会有重启服务或者到期更新SA的事件发生。如果在添加或删除的过程中有异常发生,则内核需要返回错误消息通知上层。

2 IKE功能载荷扩充

2.1 功能开关添加

在实际应用中,VPN生产厂商经常需要根据实际应用在现有的框架下加入自己产品特有的元素,例如带有某个特定功能的载荷。这一节将详细讨论在strongswan开源框架下进行改造加入某个新的载荷,并添加一个开关使得可以通过在ipsec.conf中添加新的配置项控制协商过程中是否使用新载荷。

Ipsec.conf配置文件中每一个配置项都对应wordlist数组(keywords.c)中的一项,添加新的配置项的时候需要在wordlist中添加新的数组项。另外配置项的名字需要用一个strongswan自己定义的哈希算法做一次哈希,并用哈希值作为索引在哈希表lookup(keywords.c)中查找,哈希表lookup中“-1”的位置表示还没有被占用,其他值表示这个以这个名字命名的配置项在wordlist中的索引值。新添加的项的名字在做过哈希算法后需要保证lookup中以其哈希值为索引查找到的哈希表项值为“-1”。把这个“-1”改成新添加的wordlist数组项的索引值。由于strongswan本身已经支持很多配置项,因此lookup表中已经有超过三分之二的表项被占用。想要得到一个可用的配置项名字需要多做尝试或者扩大lookup表的大小以支持更大的哈希值。kw_token_t(keywords.h)中要添加新项的token, token_info(Args.c)中也需要添加相应的新数组项,定义新添加的项的类型以及所跟参数的格式。

confread_load(confread.c)函数主要负责解析配置文件,并将解析的结果组织成starter_config_t(confread.h)结构。confread_load中将调用函数load_conn(confread.c),load_conn根据parser_load_conf(confread.c)解析得到的config_parsed_t(parser.h)结构决定starter_conn_t中应该有的属性。这里我们需要在starter_conn_t结构中添加我们的功能开关成员,并在load_conn函数中添加解读我们自己添加的功能开关值的代码。

最后starter会通过starter_whack_add_conn(starterwhack.c)组织whack消息通知pluto,whack消息中也需要添加代码打包我们加入的功能开关。pluto收到whack消息后会组织自己的conn链表,这之后pluto在协商时之后就可以根据conn中功能开关的状态来决定是否使用自定义载荷。

2.2 协商过程中自定义功能载荷的添加

自定义载荷的添加十分灵活,可以插入到一条消息的任何位置。假设当前我们需要在主模式的第一条消息中插入一条内容为字符串“abcd”的载荷,插入位置为SA载荷和Pluto Vendor ID载荷之间。

3 结束语

strongswan框架和linux操作系统都是开源免费的,利用开源平台进行产品开发对于减少成本很有帮助,但缺点就是得不到相应的技术支持。添加自定义的载荷是一种比较常用的应用,利用本文介绍的内容进行改造可以实现载荷添加和协议改造。

参考文献:

[1] 陈湖,王猛,聂跃光.基于windows的IKE的研究和设计[J].计算机技术与发展,2008,6,18:53-55.

[2] 谢希仁.计算机网络[M]. 5版.北京:电子工业出版社,2009,1.

[3] 曹桂平.linux内核网络栈源代码情景分析[M]. 北京:人民邮电出版社,2010,1.

[4] CHRISTIAN BENVENUTI.Understanding linux network internals[M].OReilly Media, Inc,2009,6.

猜你喜欢

信息安全
《信息安全与通信保密》征稿函
信息安全专业人才培养探索与实践
保护信息安全要滴水不漏
高校信息安全防护
保护个人信息安全刻不容缓
信息安全