您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Linux安全网关接口SGI的设计与实现
作者简介:曲波教授,主要研究方向:计算机网络系统开发、网络安全、管理信息系统及电子商务。胡湜本科生,研究方向:计算机网络安全与信息对抗。Linux安全网关接口SGI的设计与实现曲波1胡湜2(1南京晓庄学院信息技术学院)(2北京航空航天大学电子信息工程学院)摘要:文章阐述了Linux安全网关接口SGI的基本结构和实现方法,以及实现SGI涉及的Linux防火墙内核接口模块、/proc文件系统内核接口等关键技术。关键字:安全网关接口、Linux防火墙、内核接口模块、防火墙钩子函数、/proc文件系统内核接口随着计算机网络技术的不断提高,计算机网络的应用也越来越普及,对计算机网络系统的安全管理也越来越重要。当前流行的各种操作系统都在计算机安全管理方面提供了丰富的功能。Linux操作系统不仅在其内核中提供了丰富的防火墙功能,还以钩子函数的方式为用户提供了防火墙内核接口。用户根据Linux防火墙内核接口规范设计内核接口模块装入内存,就可实现用户自行设计的防火墙功能或其它网络访问控制功能。笔者利用Linux内核防火墙内核接口模块,实现了一个通用的安全网关接口(以下简称SGI)。SGI类似一个专用的防火墙,控制流经的网络IP数据包的转发。笔者在多个网络应用系统中利用该接口实现网络的安全访问控制,收到了很好的效果。1.安全网关接口SGI的基本结构安全网关接口SGI的目标是实现一个通用的安全网关内核接口模块,实现对流经的IP数据包的转发控制。实现的方法是采用Linux的防火墙内核模块接口,通过防火墙钩子函数将自己挂接在系统的IP转发控制链中。SGI在内部维护一个Hash表,每一个表项包含一个代表着放行的IP地址。1.1SGI防火墙内核接口模块Linux防火墙Netfilter提供了一个抽象、通用化的框架,以IPv4为例,一共有5个防火墙钩子函数,分别为:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_POST_ROUTING和NF_IP_LOCAL_OUT。数据报进入系统进行IP校验后,经过第一个钩子函数NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,其决定该数据包需要转发还是发给本机;若该数据报是发给本机的,则该数据报经过钩子函数NF_IP_LOCAL_IN处理后传递给上层协议;若该数据报应该被转发则被NF_IP_FORWARD处理;经过转发的数据报经过最后一个钩子函数NF_IP_POST_ROUTING处理后,再传输到网络上。本地产生的数据报经过钩子函数NF_IP_LOCAL_OUT处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送到网络上。2内核模块可以对一个或多个这样的钩子函数进行注册挂接,并且在数据报经过这些钩子函数时被调用。SGI就是利用这种钩子函数实现内核接口模块并链接到防火墙内核接口钩子链上。1.2Hash表SGI防火墙内核接口模块的任务是确定对流经的IP数据包是否转发。所以,SGI需要维护一个数据表,该数据表中保存着需要转发的IP地址。每当SGI接口模块收到IP数据包后,立即在该数据表中查找该IP地址。若找到则转发放行,找不到则丢弃该IP包。显然,数据表的结构是决定查找速度的关键。一方面,数据表的内容是由用户进程动态确定的,要随时变化。另一方面,查找的速度要快,不降低系统效率。尽管二叉检索树可以满足上述要求,但其实现代价较高,所以笔者采用Hash表方法实现。使用Hash表结构一方面可提高在IP转发过程中的查询速度,另一方面也可简化数据结构,节约内存资源。1.3/proc文件系统内核接口如前所述,Hash表的内容是由用户进程动态确定的,而SGI模块属于内核层。在Linux操作系统下,用户进程不能直接存取系统内核数据,也不能直接调用内核函数。一般有两种方法可实现用户进程与内核进程的通信:一是使用设备文件,二是使用/proc文件系统。对于防火墙钩子函数来说,还可以通过套接字存取内核数据。笔者采用/proc文件系统实现用户进程与SGI接口模块的数据交换。由于/proc文件系统的主要作用是允许内核向应用进程报告它的状态,所以没有专门向内存输入数据而设置的机制。为能够写入/proc文件,在内核程序中要为相应的/proc文件提供专用的处理程序,即/proc文件系统内核接口。1.4网络管理用户进程网络管理用户进程的任务是通过SGI提供的/proc文件,向SGI内核模块设置所需转发的IP地址,包括插入、删除、查找等操作。采用标准的文件读写操作,按照SGI规定的数据格式与SGI内核模块交换数据。2.SGI的实现技术2.1Linux内核模块一个Linux内核模块至少包括两个函数:一个是初始化函数init_module(),在模块被插入到内核时调用;另一个是清除函数cleanup_module(),在模块从内核移走时调用。一般情况下,初始化函数或者在内存中注册一个处理程序,或者使用自己的代码替换一个内核函数;而清除函数的作用是清除初始化函数所作的任何事情,使内存模块可以安全地卸载。2.2Linux防火墙钩子函数及其注册Linux防火墙钩子函数是一个回调函数,其参数是系统内核调用用户钩子函数时由系统传进来的。由用户设计的钩子函数根据其挂接的位置及对流经的数据报的处理,回送不同的返回值。如果用钩子函数实现访问控制,则满足放行条件时返回NF_ACCEPT,继续正常传输数据报;否则返回NF_DROP,丢弃该数据报,不再传输。如果用钩子函数实现数据采集,则对数据报内容转储之后,返回NF_ACCEPT,继续正常传输数据报。防火墙钩子函数必须注册挂接后才能工作。注册使用的函数为nf_register_hook(),所带参数为指向下列结构体的指针:structnf_hook_opsiplimitfilter={{NULL,NULL},/*structlist_headlist,总是初始化为{NULL,NULL}*/fwm,PF_INET,NF_IP_FORWARD,NF_IP_PRI_FILTER};其中fwm为钩子函数;PF_INET表示钩子函数工作在IP层;NF_IP_FORWARD为钩子函数的挂接点,此例表示钩子函数在数据报转发时被调用;NF_IP_PRI_FILTER(=0)为函数优先级。取消注册的函数为nf_unregister_hook(),在卸载内存模块之前调用,拆掉挂接的钩子函数。32.3SGI内核接口模块与应用程序间的通信在Linux里有一个文件系统注册的标准机制。每个文件系统都有自己的函数来处理索引节点和文件操作,由一个特殊的结构体structfile_operations来存放指向所有函数的指针。该结构体里包含对/proc文件的打开、关闭、读、写等函数的指针。用create_proc_entry()函数创建新的/proc文件。在SGI内核模块接口中使用copy_from_user和copy_to_user函数实现内核与应用进程的数据交换。使用copy_from_user和copy_to_user的原因是由于Linux系统中的内存是分段的,所以指针不能指向内存中一个唯一的地址,只能指向内存段中唯一的地址。系统中有一个供系统内核使用的内存段,而每一个进程还有一个单独的内存段。进程只能存取自己的内存段。当需要将一个内存缓冲区中的内容在当前进程向内核传递时,内核函数接收到一个指向进程内存段中内存缓冲区的指针。此外,由SGI内核接口模块创建的/proc文件还应具备进程阻塞机制。当用户进程请求SGI内核模块服务时,若此时内核模块正忙,则将用户进程放入睡眠状态直到内核模块空闲。笔者采用的方法是/proc文件每次只可被一个进程写操作。如果用户进程要求写/proc文件时该文件正在被其它用户进程写操作,SGI内核模块就调用interruptible_sleep_on函数将当前用户进程放入WaitQ队列中。当前一用户进程对/proc文件的写操作结束后,SGI内核模块调用wake_up唤醒等待队列中的用户进程。2.4SGI接口模块的编译及安装SGI接口模块是一种内核模块,不能按普通应用程序的方法进行编译链接。另外在程序中大量使用了内核函数,需要使用内核函数的包含文件。一般Linux操作系统在安装过程中会将操作系统源码安装在/usr/src/linux-XXX子目录下,其中XXX是Linux的内核版本号。所以对防火墙模块的编译命令应如下所示:gcc-I/usr/src/linux-XXX–O2-DMODULE-D__KERNEL__-csgi.c-osgi.o其中sgi.c是SGI接口模块的C程序名。使用系统命令insmod装入模块,用rmmod卸载模块。3.结束语SGI注册了防火墙钩子函数,可对流经的IP数据报加以控制,决定取舍,实现多种网络控制功能。笔者在所研制的网络计费、安全审计、远程监控等多个计算机网络应用系统中,使用本文提出的安全网关接口SGI实现网络信息流的访问控制,收到了良好的效果。参考文献[1]AndrewS.Tanenbaum.ComputerNetworks(ThirdEdition)1996byPrenticeHall,Inc.[2]DouglasE.Comer&DavidL.Stevens.InternetworkingWithTCP/IPVol.III:Client-ServerProgrammingandApplications(SecondEdition)1996byPrenticeHall,Inc.DESIGNANDREALIZATIONOFTHELINUXSECURITYGATEWAYINTERFACEQuBo1HuShi2(1SchoolofInformationTechnology,NanjingXiaozhuangCollege,Nanjing210017)(2SchoolofElectronicsInformationEngineering,BeijingUniversityofAeronauticsandAstronautics,Beijing100083)AbstractThepaperdescribesthestructureandrealizationoftheLinuxsecuritygatewayinterface(SGI),andthecriticaltechniquesinvolvedinSGIsuchasthekernelinterfacemodulesoftheLinuxfirewall,andthekernelinterfaceofthe/procfilesystem.KeywordsSecuritygatewayinterface,Linuxfirewall,kernelinterfacemodule,firewall’sHookfunctions,kernelinterfaceofthe/procfilesystem
本文标题:Linux安全网关接口SGI的设计与实现
链接地址:https://www.777doc.com/doc-1249899 .html