分类: LINUX
2007-05-02 16:55:30
IP安全加密--IPSec使用了网络通信加密技术。虽然不能加密数据包的头部和尾部信息 (如源/目的IP地址、端口号、CRC校验值等),但可对数据包数据进行加密。由于加密过程发生在IP 层,因此可在不改变POP/WWW等协议的情况下进行网络协议的安全加密。同时它也可以用于实现局域网间(通过互联网)的安全连接。
IP协议的安全体系结构
IPv4 的包本身没有提供任何安全保护,黑客可以通过信息包探测、IP电子欺骗、连接截获、replay攻击(是一种不断发相同序列号的包使系统崩溃的攻击方法) 等方法来攻击。因此,我们收到的数据包存在着以下危险:并非来自合法的发送者; 数据在传输过程中被人修改; 数据内容已被人窃取(例如军事机密等重要信息的对话)。IPsec的目的就是为了实现数据传输的完整性(源地址验证和保证数据没有被修改)和机密性(没有 被人看过)以及提供一定程度的对replay攻击的保护。IPsec可用它为IP及其上层协议(TCP和UDP等)提供安全保护。
IPsec的基本结构,它是利用认证头标(AH)和封装化安全净荷(ESP)来实 现数据的认证和加密。前者用来实现数据的完整性,后者用来实现数据的机密性。同时对数据的传输规定了两种模式:传送模式和通道模式。在传送模式中,IP头 与上层协议头之间嵌入一个新的IPsec头(AH或ESP); 在通道模式中,要保护的整个IP包都封装到另一个IP数据包里,同时在外部与内部IP头之间嵌入一个新的IPsec头。两种IPsec头都可以同时以传送 模式和通道模式工作。
原始的数据包
传送模式受保护的数据包
通道模式受保护的数据包
IPsec数据包的保护机制
IPsec是由四大组件组成,它们是因特网密钥交换进程、IPsec进程本身、安全联盟数据库和安全策略数据库。
IPsec 中有两个重要的数据库,分别是安全联盟数据库SAD和安全策略数据库SPD。SAD中的每一个元组是一个安全联盟SA,它是构成IPsec的基础,是两个 通信实体经协商建立起来的一种协定,它决定了用来保护数据包安全的IPsec协议、转码方式、密钥以及密钥的有效存在时间等。SPD中的每一个元组是一条 策略,策略是指应用于数据包的安全服务以及如何对数据包进行处理,是人机之间的安全接口,包括策略定义、表示、管理以及策略与IPsec系统各组件间的交 互。两个数据库联合使用。对于发送方,每个SPD的元组都有指针指向相关的SAD的元组。如果一个SPD的元组没有指向适合发送包的SA,那么将会创建新 的SA或SA束,并将SPD的元组和新的SA元组链接起来。对于接收方,通过包头信息包含的IP目的地址、IP安全协议类型(AH或ESP)和SPI(安 全参数索引)在SAD中查找对应的SA。SA中其他字段为序列号、序列号溢出标志、Anti-replay 窗口、AH认证算法和密钥、ESP加密算法和密钥及初始化矩阵、ESP认证算法及密钥等等。
因特网密钥交换(IKE)是IPsec最为重要的部分,在用IPsec保护一个 IP包之前,必须先建立一个SA,IKE用于动态建立SA。IKE代表IPsec对SA进行协商,并对SAD数据库进行填充。 IKE是一个混合型的协议,它建立在由Internet安全联盟和密钥管理协议(ISAKMP)定义的一个框架上。IKE使用了两个阶段的ISAKMP。 第一阶段建立IKE安全联盟,第二阶段利用这个既定的安全联盟,为IPsec协商具体的安全联盟。
IPsec进程本身就是用来实现整个IPsec 的守护进程,用户可以通过和这个进程打交道来管理自己的安全策略,实现适合自己需要的网络安全。当然,每个开发组织的源代码不一样,但是它们都必须遵守 RFC的规范,最终的目的都应该是差不多的。通常,IPsec的源代码是嵌入到内核IP层源代码中的,也有人提出在其层次在IP之上,TCP之下,两种方 式都可以。
基于IPsec的虚拟专用网
当IPsec用于路由器时,就可以建立虚拟专用网。路由器连入内部网的一端,是一个受保护的网络,另一端则是不安全的公共网络。两个这样的路由器建立 起一个安全通道,通信就可以通过这个通道从一个本地的保护子网发送到一个远程的保护子网,这就形成了一个VPN。
在这个VPN中,每一个具有IPsec的路由器都是一个网络聚合点,试图对VPN进 行通信分析将会失败。目的地是VPN的所有通信都经过路由器上的SA来定义加密或认证的算法和密钥等参数,即从VPN的一个路由器出来的数据包只要符合安 全策略,就会用相应的SA来加密或认证(加上AH或ESP报头)。整个安全传输过程由IKE控制,密钥自动生成,保护子网内的用户根本不需要考虑安全,所 有的加密和解密由两端的路由器全权代理。
以下是数据包的处理过程,发送方的处理过程:
(1) 源主机TCP层通过调用ip_output()函数,调用IP层, 令其发送一个数据包
给路由器;
(2) 路由器针对目的主机的数据包,查询策略引擎,根据安全策略强制加上AH或
ESP头;
(3) IKE处理,对没有SA的安全策略建立新的SA;
(4) SA处理, 增加序列号字段;
(5) 通道模式处理,通常VPN用的是通道模式,因此加上一个额外的IP头;
(6) 路由器发送这个安全的数据包。
接收方的处理过程:
(1) 另一端的路由器收到这个包,剥去额外的IP头,并利用数据包的AH或ESP
头调用 IPsec层;
(2) IPsec层从AH或ESP头摘录出SPI,从IP头中选出源和目的地址及协议;
(3) IPsec层用以上的参数从SAD中取出所需的SA,如果没找到,就丢弃这个包;
(4) SAD返回SA,IPsec将会根据AH和ESP定义的规则对这个包进行处理;
(5) 验证和这个包对应的策略,进而决定IPsec处理的应用是否正确,策略是通
过SA中的指针获得或利用选择符查询SPD得来;
(6) 如果验证正确,那么解密并把这个包转发到真正的目的主机。
Linux上安装IPsec的例子
src/linux,并编译、安装和重启内核,以测试新内核。在使IPSec正常工 作之前必须保证网络工作正常。接着将IPSec for Linux源代码解压到/usr/local/src目录下,运行安装程序"make menugo",对内核进行"补丁"。再运行内核的配置程序。最后就是安装IPSec工具和内核。
#cd /usr/src/
#cp /usr/src/linux-2.4.2 linux
#cd /usr/src/linux
#make menuconfig
#cd ../
#tar zvxf freeswan-1.91-1.tar.gz
#cd freeswan-1.91
#make menugo
确保已保存好内核的配置。特别要注意本机网卡的型号,在编译内核时要把网卡的驱动程序加进去,否则,网络将不通。
现在我们需要修改LILO配置文件lilo.conf,并重新运行lilo和重新启动系统内核。
lilo.conf文件例子如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
image=/usr/src/linux/arch/i386/boot/bzImage boot/vmlinuz-2.2.10-ipsec
label=linux-ipsec
root=/dev/hda1
read-only
image=/boot/vmlinuz-2.2.10
label=linux
root=/dev/hda1
read-only
重新运行lilo,系统提示:
linux-ipsec *
linux
然后重新启动带有IPSec支持的 2.4.2内核的系统。系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径 加入到用户环境变量中。IPSec的网络设置。首先,需要允许网关服务器的TCP-IP转发。在Orbita Linux 3.0系统中的实现方法:
直接修改/proc文件系统,执行以下命令即可:
#vi /proc/sys/net/ipv4/ip_forward
把"0"改为"1"。
由于大多数人都使用了缺省的禁止IP转发安全策略,但必须允许数据从远程网络或主机 传送到本地网络或主机中。而且,任何使用了IPSec的内部网络的所有伪(masquerade)规则都必须在允许IPSec的规则之后进行,否则主机将 试图伪装(masquerade)数据包,而不是将它们传递给IPSec。
以下例子说明了如何在两个已使用了IP masquerading伪装的受保护网络之间通过IPSec进行安全的互联网连接:
手工(固定)密钥连接 (Manual connection keying)
先通过使用手工(固定)密钥,并编辑ipsec.conf和防火墙规则来建立安全连接。在ipsec.conf省参数中,使用随机数生成器产生一个数字,并保留其16进制前导字符0x。我们需要修改的参数如下:
conn my-tunnel
type=tunnel
left=1.2.3.4
leftnexthop=1.2.3.1
leftsubnet=10.0.0.0/24
right=5.6.7.8
rightnexthop=5.6.7.1
rightsubnet=192.168.0.0/24
spibase=0x200
esp=3des-md5-96
espenckey=0x01234567_89abcdef_02468ace_13579bdf_12345678_9abcdef0
espauthkey=0x12345678_9abcdef0_2468ace0_13579bdf
设置完成后,复制ipsec.donf和ipsec.secrets文件到其他需要使用此安全模式的机器中。剩下的工作就是修改防火墙规则,使其只将数据包转发,而不将其伪装(masquerade)。在服务器1.2.3.4上增加以下规则:
-A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
-A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
记住,要确保这些规则在伪装(masquerade)规则之前,如以下所示:
#
# FORWARD RULES
#
ipchains -P forward DENY
#
-A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
-A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
-A forward -p all -j MASQ -s 10.0.0.0/24 -d 0.0.0.0/0
在服务器5.6.7.8上重复类似工作:
-A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
-A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
记住,要确保这些规则在伪装(masquerade)规则之前,如以下所示:
#
# FORWARD RULES
#
-P forward DENY
#
-A forward -p all -j ACCEPT -s 192.168.0.0/24 -d 10.0.0.0/24
-A forward -p all -j ACCEPT -s 10.0.0.0/24 -d 192.168.0.0/24
-A forward -p all -j MASQ -s 192.168.0.0/24 -d 0.0.0.0/0
现在我们可以利用这个手工构造的ipsec通道,建立网络A与网络B之间的通信。
ipsec manual --up my-tunnel
从客户机10.0.0.2上ping 192.168.0.2,如果ping得通则说明设置正确。否则请检查网络,确保1.2.3.4与5.6.7.8之间可以通信,允许TCP-IP转发,和 两个网络间的防火墙没有规则禁止数据包通过或伪装数据包。当成功完成了手工(固定)密钥连接后,便应当开始配置自动密钥 (automative keying)。
自动密钥连接 (Automatic connection keying)
对于一个商业应用来说,使用手工(固定)密钥是不安全和不可靠的。在自动密钥连接模 式下产生一个256位共享密钥,将其复制到连接通道的各个节点上后,那些企图截取数据包的网络攻击者将很难攻破这种安全连接。在自动密钥连接模式下,一个 密钥的有效期是8个小时,这种配置有效地阻止了那些企图用暴力法猜出密钥的攻击者。下面我们在前一个例子的基础上建立自动密钥连接配置:
ipsec.conf文件中编辑通道配置,如下例:
conn my-tunnel
type=tunnel
left=1.2.3.4
leftnexthop=1.2.3.1
leftsubnet=10.0.0.0/24
right=5.6.7.8
rightnexthop=5.6.7.1
rightsubnet=192.168.0.0/24
keyexchange=ike
keylife=8h
keyingtries=0
然后启动pluto守护进程。在通道的另一端连接pluto守护进程以建立一个连接。需要提醒的是,因为pluto守护进程运行在端口500/UDP,你需要在防火墙开一个"洞"使数据包能够顺利通过:
-A input -p udp -j ACCEPT -s 0.0.0.0/0 -i eth0 -d 0.0.0.0/0 500
使用"%search"关键字比列出要建立的通道清单更方便。方法如下:在每一个通道配置中增加一行:
auto=start
编辑ipsec.secrets文件:
plutoload=%search
plutostart=%search
如果一切正常,/var/log/messages中将有类似如下记录:
Oct 16 02:10:41 server ipsec_setup: Starting FreeS/WAN IPSEC...
Oct 16 02:10:41 server ipsec_setup: /usr/local/lib/ipsec/spi: message size is 28.
Oct 16 02:10:41 server ipsec_setup: KLIPS debug `none'
Oct 16 02:10:41 server ipsec_setup: KLIPS ipsec0 on eth0 1.2.3.4/255.255.255.0 broadcast
而在/var/log/secure文件中将有类似如下记录:
Oct 16 02:10:42 server Pluto[25157]: Starting Pluto (FreeS/WAN Version snap1999Jun14b)
Oct 16 02:10:44 server Pluto[25157]: added connection description "my-tunnel"
Oct 16 02:10:44 server Pluto[25157]: listening for IKE messages
Oct 16 02:10:44 server Pluto[25157]: adding interface ipsec0/eth0 1.2.3.4Jun 26 02:10:44 server
用命令ipsec look查看信息:
Destination GateWay Genmask Flags Mss Window irtt Iface
0.0.0.0 192.168.0.0 0.0.0.0 US 40 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 40 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 40 0 0 ipsec0
11.2.3.0 0.0.0.0 255.255.255.0 U 40 0 0 lo
在/proc/net/route查看路由表时:
Destination Gateway Genmask Flags Metric Ref Use Iface
1.2.3.4 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
11.2.3.0 0.0.0.0 255.255.255.0 U 0 0 0 lo
1.2.3.0 0.0.0.0 255.255.255.0 U 0 0 0 ipsec0
192.168.0.0 1.2.3.1 255.255.255.0 UG 0 0 0 ipsec0
(T002)