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上ping192.168.0.2,如果ping得通則說明設置正確。否則請檢查網絡,確保1.2.3.4與5.6.7.8之間可以通信,允許TCP-IP轉發,和兩個網絡間的防火牆沒有規則禁止數據包通過或偽裝數據包。當成功完成了手工(固定)密鑰連接後,便應當開始配置自動密鑰 (automativekeying)。
自動密鑰連接 (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