1 MAC地址欺骗
目前很多网络都使用Hub进行连接的,众所周知,数据包经过Hub传输到其他网段时,Hub只是简单地把数据包复制到其他端口。因此,对于利用Hub组成的网络来说,没有安全而言,数据包很容易被用户拦截分析并实施网络攻击(MAC地址欺骗、IP地址欺骗及更高层面的信息骗取等)。为了防止这种数据包的无限扩散,人们越来越倾向于运用交换机来构建网络,交换机具有MAC地址学习功能,能够通过VLAN等技术将用户之间相互隔离,从而保证一定的网络安全性。
交换机队于某个目的MAC地址明确的单址包不会像Hub那样将该单址包简单复制到其他端口上,而是只发到起对应的特定的端口上。如同一般的计算机需要维持一张ARP高速缓冲表一样,每台交换机里面也需要维持一张MAC地址(有时是MAC地址和VLAN)与端口映射关系的缓冲表,称为地址表,正是依靠这张表,交换机才能将数据包发到对应端口。
地址表一般是交换机通过学习构造出来的。学习过程如下:
(1) 交换机取出每个数据包的源MAC地址,通过算法找到相应的位置,如果是新地址,则创建地址表项,填写相应的端口信息、生命周期时间等;
(2) 如果此地址已经存在,并且对应端口号也相同,则刷新生命周期时间;
(3) 如果此地址已经存在,但对应端口号不同,一般会改写端口号,刷新生命周期时间;
(4) 如果某个地址项在生命周期时间内没有被刷新,则将被老化删除。
如同ARP缓冲表存在地址欺骗的问题,交换机里的这种MAC地址表也存在地址欺骗问题。在实际应用中,人们已经发现早期设计的许多交换机都存在这个问题,以Cisco2912交换机为例,阐明一下如何进行MAC地址欺骗。
如图所示,两个用户PcA和PcB分别连接Cisco2912的portA和portB两个端口。
PortC 00.00.CC.CC.CC.CC Internet
|
|
Cisco2912
portA / portB
/
Hub Hub
| |
PcA PcB
00.00.AA.AA.AA.AA 00.00.BB.BB.BB.BB
假定PcA的MAC的地址是00.00.AA.AA.AA.AA
PcB的MAC的地址是00.00.BB.BB.BB.BB
在正常的情况下,Cisco2912里会保存如下的一对映射关系:
(00.00.AA.AA.AA.AA)<—>portA
(00.00.BB.BB.BB.BB) <—>portB
(00.00.CC.CC.CC.CC) <—>portC
依据这个映射关系,Cisco2912把从PortC上收到的发给PcA的包通过PortA发出,而不会从PortB发出。但是如果我们通过某种手段使交换机改变了这个映射关系,则Cisco2912就会将数据包转发到不应该去的端口,导致用户无法正常访问Internet等服务。最为简单的一种方法就是用户PcB构造一种数据包,该包的源MAC地址不再是自己的MAC地址00.00.BB.BB.BB.BB,而是PcA的MAC地址00.00.AA.AA.AA.AA,从上面的地址学习过程可以看出,Cisco2912就会错误的认为MAC地址00.00.AA.AA.AA.AA是从portB上来的,因此映射关系也就改为:
(00.00.AA.AA.AA.AA)<—>portB
(00.00.BB.BB.BB.BB) <—>portB
这样,Cisco2912就会错误地把从PortC上收到的目的地址为MAC A的数据包通过PortB发出,而不再发给PortA.。显然,如果PcB一直在发这种特意构造的包。用户PcA就无法通过Cisco2912正常访问Internet。更为严重的是,如果用户PcB构造portC上联设备(如路由器)的MAC地址(00.00.CC.CC.CC.CC),则会导致Cisco 2912下面所有的用户无法正常访问Internet等业务。
2 安全策略
网络中的上述问题主要集中在二层交换机,因此二层交换机的设计必须考虑到MAC地址学习的这种潜在的安全隐患。对此,提出以下几种安全策略。
(1) MAC地址与端口的绑定。基于IP地址欺骗,人们普遍的做法是采用IP地址与MAC地址进行绑定。MAC地址原来被认为是硬件地址,一般不可更改,所以把IP地址同MAC地址组合到一起管理就成为一种可行的办法,但是认为作为主机标识的MAC地址不能更改这种观点其实是错误的,如前所述,利用网络工具或者修改注册表的办法很容易就会更改某台主机的MAC地址。所以,为了防止MAC地址欺骗,防止交换机中MAC地址映射表混乱,最有效的办法就是实现MAC地址与交换机端口的绑定。这样,用户就无法通过更改MAC地址来进行某种恶意的攻击或者有效地防止某些环路导致的MAC地址重复。绑定可以实现手工静态绑定,也可以实现自动静态绑定。实现手工静态绑定需要网络管理员手工将用户的MAC地址和端口号输入到网络里去,对于一个较大规模的网络,这项工作显然不够轻松,而且非常容易出错。对于自动静态绑定,可以如下实现:在交换机刚开始工作时,不设置绑定命令,而是由交换机自动进行MAC地址学习,建立一张MAC地址与端口号的映射关系,等网络稳定之后,在通过网络管理界面配置绑定命令,一旦绑定命令生效,交换机自动将原来的映射关系绑定起来,在没有收到解除绑定命令时,该映射关系一直存在。这样,仅仅需要网络管理人员通过一条命令就可以实现所有的MAC地址同端口的静态绑定关系,不再需要手工一个个MAC地址的输入。当然,随着后期用户的不断加入,可以选择某段时间内集中进行这种绑定命令操作,从而有效地节省人力和保障网络安全。通过上面的阐述我们可以看出:解决IP地址欺骗最有效的措施是采用端口、MAC地址和IP地址三者同时绑定。
(2) 在一般情况下,二层交换机的MAC地址映射表是动态更新的,存在一个生命周期(老化)的问题,在一定的生命周期内,如果没有收到该MAC地址发来的数据包,那么该MAC地址与端口的映射关系就不存在,将被释放。如果在该生命周期内不断的收到该MAC地址发来的包,则该生命周期就会一直延续下去。假设MAC地址(00.00.AA.AA.AA.AA)原来是从PortA上来的,在交换机里就存在这么一条映射关系:
(00.00.AA.AA.AA.AA)<—>portA
但是如果将MAC地址(00.00.AA.AA.AA.AA)移到portB上,则一般交换机会里即将上条映射关系:
(00.00.AA.AA.AA.AA)<—>portB
这种采取的端口立即更新策略给MAC地址欺骗以可乘之机,MAC地址欺骗也正是利用这个来改变交换机里的地址和端口的映射关系。设想一下,假如再交换机里采取这种策略:当MAC地址(00.00.AA.AA.AA.AA)从另外一个端口PortB上来,但是映射表里已经存在和PortA的映射关系,这时对于portB上来的MAC地址(00.00.AA.AA.AA.AA)不予理会,仍然保持原来的映射关系,这样,MAC地址欺骗也就无法得逞。当然,当用户PcA不向portA发包,在其生命周期终结后,MAC地址(00.00.AA.AA.AA.AA)与portA的映射关系也就解除,这时用户PcB再实施MAC欺骗仍然能够成功,如果该用户一直在进行MAC地址欺骗,则用户PcA也就可能无法正常访问Internet等业务。通过改变地址学习的策略可以在一定程度上抵御MAC地址欺骗行为,只要用户PcA一直在线,用户PcB的MAC地址欺骗就一时无法得逞。
(3) 端口的地址学习优先级,可以根据交换机各个段口在网络中的不同位置给予不同的地址学习优先级。如图所示,PortC端口最重要,因为其他所有端口的用户都是通过它来进行Internet访问的,如果一旦该端口对应的MAC地址(00.00.CC.CC.CC.CC)遭到欺骗,则下面所有用户都无法访问Internet。所以可以给该端口分配一个较高的地址学习优先级,原则就是优先级高的端口学习MAC地址优先,如果某个MAC地址从优先级高的端口移到优先级低的端口上去,则MAC地址映射关系不会立即更新,而是等一定的生命周期终结后新的地址映射关系才能生效。这样,也可以在一定程度上有效的防止MAC地址欺骗行为。但是在分配优先级的时候可能会遇到困难,如用户之间的端口优先级怎么分配。
通过上述分析,我们可以看出,对于二层交换机而言,最大的安全隐患存在于MAC地址的学习过程。为了有效防止某种恶意攻击的MAC地址欺骗行为,我们在进行交换机设计时必须考虑一定的安全策略。