基于Linux的分布式防火墙设计与实现

基于Linux的分布式防火墙设计与实现

摘要:防火墙在网络安全中起着重要作用。但是,目前传统的边界防火墙暴露出越来越多的缺陷,无法适应新的网络应用。分布式防火墙是对传统防火墙的改进。文中介绍了分布式防火墙的概念,并给出了其在Linux上的设计与实现。

1 传统防火墙及其缺陷

防火墙是指设置在不同网络或网络安全域之间,根据一定的安全策略对网络间的通信实施访问控制的一系列部件的组合。

传统意义上的防火墙就是指边界防火墙,它将网络分为内网和外网两部分。它是网络间信息传输的唯一出入口,能够根据安全策略控制(允许、拒绝、监测)出入网络的信息流,且本身具有较强的抗攻击能力。它是提供信息安全服务、实现网络和信息安全的重要的、基本的安全装置。在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全。

传统防火墙依赖于网络的拓扑限制,它假定内网上的所有主机都是可信任的,而外网上的所有主机都是不可信的。当网络遵照拓扑限制时,这种模型工作得很好;但是,随着网络连接的扩充和新的网络应用的发展,这种模型暴露出了越来越多的缺陷,面临着极大的挑战。主要表现在:

(1) 对绕过防火墙的攻击无能为力;如果防火墙的规则设置不当,内网上的所有主机将暴露在外部攻击的直接威胁之下。

(2) 由于信任内网上的所有主机,而对来自网络内部的恶意攻击、未授权访问或无意的误操作“视而不见”。

(3) 是潜在的通信瓶颈和单一故障点。

(4) 与端到端加密(如VPN)有冲突。

(5) 由于依赖于网络拓扑,无法支持移动计算。

为了克服上述缺陷,产生了“分布式防火墙”( Distributed Firewall )的概念。

2 分布式防火墙

多台基于主机但受集中管理和配置的防火墙组成了分布式防火墙。在分布式防火墙中,安全策略仍然被集中定义,但是在每一个单独的网络端点(例如主机、路由器)上实施。

分布式防火墙中含有三个必需的组件:

(1) 描述安全策略的语言。

(2) 安全地发布策略的机制。

(3) 应用、实施策略的机制。

安全策略语言规定了哪些通信被允许,哪些通信被禁止,它应该支持多种类型的应用,还应支持权利委派和身份鉴别。策略制定后被发布到网络端点上。策略发布机制应该保证策略在传输过程中的完整性和真实性。策略发布有多种方式,可以直接“推”到终端系统上,可以由终端按需获取,也可以以证书的形式提供给用户。策略实施机制位于要保护的主机上,在处理出入的通信之前,它查询本地策略再做出允许或禁止的决定。

分布式防火墙克服了传统防火墙的缺陷,它的优势在于:

(1) 在网络内部增加了另一层安全。

(2) 有效抵御来自内部的攻击。

(3) 消除网络边界上的通信瓶颈和单一故障点。

(4) 支持基于加密和认证的网络应用。

(5) 与拓扑无关,支持移动计算。
3 总体设计

分布式防火墙的前两个组件从本质上说是安全授权问题。传统的授权机制包括访问控制列表(ACL)和公钥证书体系(X.509、PKI)。但是ACL不适用于开放、动态的分布式环境,证书体系在授予权限、信任模式、委托权利等方面也不能很好地满足分布式防火墙的要求。

信任管理(Trust Management)是解决分布式环境下授权、信任问题的一种新思想,它提供了适合网络应用的开放、动态、分布特性的安全解决框架。KeyNote是信任管理系统的一个实例。它提供了一种简练、灵活、易扩展和富于表达能力的语言来描述安全策略(Security Policy)和安全凭证(Security Credential),这种可编程的语言易读、易写,而且与应用无关,使KeyNote很容易与应用系统集成。本地策略绑定了公钥和直接授权;远程策略经DSA、RSA数字签名后作为安全凭证,采用了与安全策略相同的语法。安全凭证支持间接信任关系和权利委派,可以在不受信任的网络上传播、发布。因此,基于KeyNote实现防火墙的前两个组件是可行而有效的。

防火墙中应用的KeyNote体系结构中服务器进程根据外来的连接请求,调用Keynote API,将三元组(r,C,P)提交给信任管理引擎,该引擎使用通用的、与应用独立的一致性验证算法,这种深度优先算法采用递归的方式,试图在本地或者LDAP服务器上查找到至少一条能够满足请求的策略断言,从而做出策略是否被满足的判断结果,并返回给服务器进程。

实施策略的组件对进出主机的通信都进行了控制,不但可以保护主机应对外来的威胁,而且可以防止非法用户使用该主机访问网络,从而实现了双向过滤的功能。

4 实现

我们在Redhat Linux 7.2(kernel ver: 2.4.7)上开发、实现了分布式防火墙。Linux是当前比较流行的网络服务器平台,并且具有集成的、良好的安全特性和库,支持IPsec、SSL。同时,利用其开放的源代码,我们可以修改内核使之与KeyNote库libkeynote0(同样是开放源代码的)很好地协作。

4.1 系统结构

系统由三个组件构成:内核扩展集、用户级守候进程和设备驱动程序。我们的范例主要着眼于对TCP连接的控制。

(1) 内核扩展(Kernel Extension)。用户使用connect()和accept()这两个系统调用来创建向外的连接以及决定到来的连接请求。我们要根据策略对这两个系统调用加以修改,对某些连接进行过滤。策略上下文(Policy Context)是包含与某一连接相关的所有信息的容器,这些信息包括发起连接的用户ID,源IP地址、端口号,目的IP地址、端口号,等等。

(2) 策略驱动(Policy Driver)。这里实现了一个伪设备驱动/dev/policy作为内核中被修改的系统调用与用户空间的守候进程直接通信的渠道。我们把该驱动视为一个文件,它支持一般的文件操作,如open(),close(),read(),write(),ioctl()。

(3) 策略守候进程(Policy Daemon)。这是一个用户级进程,负责根据安全策略和安全凭证作出决策——允许还是拒绝连接。

4.2 系统流程


我们先说明对外来连接accept()进行过滤的工作流程。

第一步:首先,操作系统启动策略守候进程,并调用open()打开策略驱动。策略守候进程读取本地的包含策略和凭证的文件(当然,也可以定制进程启动时即从远程的LDAP服务器上下载、更新策略和凭证),open()将初始化有关数据结构。策略守候进程调用read(),试图从策略驱动中读取连接请求信息。如果驱动中没有请求信息,则守候进程阻塞。

第二步:服务器进程收到了连接请求,首先调用accept()。这个被修改过的系统调用形成策略上下文并提交到策略驱动中。服务器进程阻塞。

第三步:此时,read()返回请求消息,策略守候进程被唤醒。它读取该消息,调用KeyNote的一致性检查器(compliance checker)根据本地策略和凭证进行分析。如果未找到与此连接相关的策略,策略守候进程就联系远程的LDAP服务器查找、下载相应的凭证。若策略许可(即:找到策略或安全凭证,根据签名算法验证无误,并且符合凭证断言),则允许该连接,若在本地及远程服务器上均没有找到相应的策略或凭证,或者与策略、凭证的断言不符,则拒绝之。策略守候进程调用write()将自己的决策写入策略驱动中。

第四步: accept()从策略驱动中读取策略守候进程的决策,服务器进程被唤醒。若决策允许,accept()返回非负的套接字描述符;否则返回-1拒绝该连接请求。

对系统向外发起连接的connect()进行过滤的系统流程与此类似。

其它两个系统调用的功能是,close()关闭伪设备驱动,会释放已分配资源并禁用分布式防火墙;ioctl()用于内核与守候进程之间同步时的错误处理。

5 结论

分布式防火墙实施在各个网络端点上,克服了传统防火墙的缺陷,有效保护了主机,适应了新的网络应用的需要。我们构建了一个可运行的范例展示了分布式防火墙的可行性。其健壮性、有效性和可扩展性还需要作进一步的试验进行评估、测定。