張 堯,劉笑凱
(華北計算機(jī)系統(tǒng)工程研究所,北京100083)
IPSec VPN 是一種常見的VPN 技術(shù),具有速度快、安全可信等特點(diǎn)。 由于IPSec 國際協(xié)議中的標(biāo)準(zhǔn)算法可能存在算法安全性和協(xié)議安全性等問題,因此國家密碼管理局制定了國家密碼算法標(biāo)準(zhǔn)以及VPN 技術(shù)規(guī)范。 基于國家技術(shù)標(biāo)準(zhǔn)的指導(dǎo),采用國密算法實(shí)現(xiàn)改進(jìn)的IPSec 協(xié)議, 能夠提高IPSec VPN 的安全性,滿足安全產(chǎn)品自主安全的需要。
IPSec 是一種用于保護(hù)網(wǎng)絡(luò)通信過程IP 數(shù)據(jù)包安全的安全協(xié)議技術(shù),可在由主機(jī)、網(wǎng)關(guān)作為端點(diǎn)構(gòu)成的點(diǎn)到點(diǎn)的網(wǎng)絡(luò)層鏈路上構(gòu)建安全隧道,提供基于網(wǎng)絡(luò)層的通信安全保護(hù)功能。 在采用IPSec 技術(shù)實(shí)現(xiàn)VPN 時,通過在雙方網(wǎng)關(guān)之間建立IPSec 加密隧道,來實(shí)現(xiàn)由雙方物理子網(wǎng)構(gòu)建的虛擬局域網(wǎng)。
IPSec 主要由四部分組成: 因特網(wǎng)密鑰交換(Internet Key Exchange,IKE)協(xié)議、認(rèn)證頭(Authentication Header,AH) 協(xié) 議、 安 全 載 荷(Encapsulating Security Payload,ESP)協(xié)議以及上述模塊中所需的加密算法和認(rèn)證算法。 其安全體系結(jié)構(gòu)如圖1 所示[1-2]。
圖1 IPSec 安全體系
AH 協(xié)議能夠為數(shù)據(jù)包提供完整性保護(hù)、數(shù)據(jù)源認(rèn)證和防重放等安全功能,一般用于只需確保數(shù)據(jù)完整性、檢驗發(fā)送方身份,無需數(shù)據(jù)保密的場景下。 其通過在原始數(shù)據(jù)包頭部之后增加AH 頭部段的方式實(shí)現(xiàn)。
ESP 協(xié)議除了可實(shí)現(xiàn)AH 協(xié)議所提供的各項安全功能外,還對數(shù)據(jù)包整體進(jìn)行加密,實(shí)現(xiàn)數(shù)據(jù)的保密性。 根據(jù)ESP 協(xié)議對數(shù)據(jù)的封裝模式不同,分為隧道模式和傳輸模式, 前者僅對IP 負(fù)載進(jìn)行保護(hù),后者則將原始IP 層頭部連同負(fù)載一起進(jìn)行加密保護(hù)[3]。
為了實(shí)現(xiàn)AH 和ESP 協(xié)議,通信雙方需要首先采用密鑰管理協(xié)議來建立安全聯(lián)盟(Security Association,SA),以同步密鑰和身份信息。
IKE 協(xié)議包括ISAKMP、Oakley 和SKEME 三個協(xié)議。 其 中ISAKMP 主 要 定 義 在IKE 伙 伴(IKE Peer)之間的IKE 聯(lián)盟(IKE SA)建立過程;而Oakley 和SKEME協(xié)議主要通過迪菲-赫爾曼(Diffie-Hellman,DH)密鑰交換算法實(shí)現(xiàn)雙方身份驗證和密鑰安全分發(fā)。 目前,由RFC 文檔所規(guī)定的IKE 協(xié)議共有IKEv1 和IKEv2 兩個版本。
IKEv1 的協(xié)商過程分為兩個階段。 其中第一階段主要用于協(xié)商建立IKE SA,又分為主模式、野蠻模式兩種交互策略。 主模式是使用最頻繁的協(xié)商策略,協(xié)商雙方通過交換3 對消息,確定對等體雙方IKEv1 安全策略、協(xié)商密鑰信息、驗證身份,最終建立SA; 野蠻模式雙方僅交換3 條消息即建立SA,通過犧牲一定的安全性來提高協(xié)商效率。 第二階段在第一階段的IKE SA 保護(hù)下進(jìn)行,用于協(xié)商IPSec SA所需的密鑰和參數(shù)、封裝方式、認(rèn)證方式等,雙方交換1 對信息。
IPSec 通過密碼算法來保證數(shù)據(jù)機(jī)密性、完整性,采用非對稱密鑰的特性來實(shí)現(xiàn)密鑰安全協(xié)商。 在IPSec 中使用了對稱加密算法、公鑰算法、摘要算法和DH 密鑰交換算法。 在國際標(biāo)準(zhǔn)中,對稱算法包括AES、3DES 等,摘要算法包括MD5、SHA 等,非對稱算法包括RSA、ECC 等[4]。
國密算法是一套由我國密碼安全機(jī)構(gòu)自主研發(fā)的密碼算法,可用于國家信息安全相關(guān)各個領(lǐng)域中,其中由我國《IPSec 技術(shù)規(guī)范》中所規(guī)定在IPSec 協(xié)商過程中要使用到的算法包括SM2 橢圓曲線算法、SM1 或SM4 分組密碼算法、SM3 密碼雜湊算法[5]。
SM2 橢圓曲線公鑰算法是國密標(biāo)準(zhǔn)中的非對稱算法,屬于對橢圓曲線密碼學(xué)(Elliptic Curve Cryptography,ECC)算法的一種拓展,其數(shù)學(xué)基礎(chǔ)建立在橢圓曲線離散對數(shù)問題上。 SM2 算法所規(guī)定公鑰長度為512 位,私鑰長度256 位[6]。
與RSA 算法相比,采用基于ECC 的SM2 算法能夠在密鑰長度相當(dāng)?shù)那闆r下,提供更高的安全性保護(hù)。 192 位SM2 密碼的強(qiáng)度能夠超過2 048 位的RSA 密碼。
SM3 算法是國密標(biāo)準(zhǔn)中的雜湊算法,其功能包括數(shù)字簽名與驗證、消息認(rèn)證碼生成和偽隨機(jī)數(shù)的生成等,可用于多種密碼應(yīng)用。 SM3 算法的安全性及效率與SHA-256 相當(dāng)[5]。
SM4 算法是國密標(biāo)準(zhǔn)中的分組對稱密鑰算法,明文、密鑰、密文長度均為128 位,加密和解密所用密鑰相同,可用于流式數(shù)據(jù)的快速解密。 SM4 算法的實(shí)現(xiàn)流程如圖2 所示。
圖2 SM4 算法實(shí)現(xiàn)流程
SM4 算法的加密與密鑰擴(kuò)展算法均通過32 輪非線性迭代過程實(shí)現(xiàn)。 輪函數(shù)中使用輪密鑰對128位數(shù)據(jù)進(jìn)行處理,在解密所使用的輪密鑰是加密輪密鑰的逆序。 在加密過程中,首先將128 位密鑰按照每32 位一組分為4 組,然后進(jìn)行密鑰擴(kuò)展,生成32 組32 位輪密鑰,再將輸入明文按照32 位一組分成4 組,進(jìn)行循環(huán)運(yùn)算,得到128 位密文。
基于Linux 2.x 操作系統(tǒng)內(nèi)核協(xié)議棧,F(xiàn)reeS/WAN提供了開源的IPSec 協(xié)議的內(nèi)核態(tài)實(shí)現(xiàn)。 而Openswan項目繼承該項目進(jìn)行了后續(xù)開發(fā)[7-8]。 通過對比國際IPSec 標(biāo)準(zhǔn)與我國國密IPSec 標(biāo)準(zhǔn),找出所需更改的部分對Openswan 的相關(guān)代碼模塊進(jìn)行替換,能夠?qū)崿F(xiàn)基于國密算法的IPSec VPN。
Openswan 項目的架構(gòu)如圖3 所示。
圖3 Openswan 項目架構(gòu)示意圖
Openswan 實(shí)現(xiàn)分為應(yīng)用態(tài)和內(nèi)核態(tài)的兩部分,其中Pluto 模塊、Whack 模塊位于Linux 用戶態(tài)。Whack 模塊負(fù)責(zé)建立連接前的參數(shù)配置、管理VPN連接狀態(tài)、系統(tǒng)日志等;Pluto 模塊負(fù)責(zé)進(jìn)行IKE 協(xié)商、建立SA;Klips 模塊在Linux 內(nèi)核態(tài)下運(yùn)行,接收來自Linux 內(nèi)核協(xié)議棧的網(wǎng)絡(luò)數(shù)據(jù)包,根據(jù)已經(jīng)配置的SA,對數(shù)據(jù)包進(jìn)行AH 協(xié)議、ESP 協(xié)議的封裝或解封處理。
在Openswan 項目中,由Pluto 模塊在用戶態(tài)實(shí)現(xiàn)IKE 協(xié)商。IKE 的協(xié)商過程中,采用交換數(shù)字證書的形式,由通信雙方各自進(jìn)行身份認(rèn)證,確認(rèn)對方已得到授權(quán)。 根據(jù)國密要求,在IKE 協(xié)商過程中需要使用基于X.509 格式的國密SM2 數(shù)字證書進(jìn)行身份認(rèn)證,在IKE 認(rèn)證過程中,首先要采用國密SM2算法進(jìn)行數(shù)字證書簽名、驗簽。
根據(jù)IKEv1 標(biāo)準(zhǔn),認(rèn)證第一階段的主模式協(xié)商過程在Pluto 模塊中的實(shí)現(xiàn)如圖4 所示。
認(rèn)證第二階段的快速模式協(xié)商過程在Pluto 模塊中的實(shí)現(xiàn)如圖5 所示。
在國密標(biāo)準(zhǔn)中,IKE 主模式協(xié)商的流程與圖中所示一致,但其中SA 載荷部分需要替換成國密SM3、SM4 相關(guān)參數(shù)。 具體實(shí)現(xiàn)如表1 所示。
圖4 Pluto 模塊中IKE 主模式協(xié)商實(shí)現(xiàn)
圖5 Pluto 模塊中IKE 快速模式協(xié)商實(shí)現(xiàn)過程
表1 國密標(biāo)準(zhǔn)SA 載荷參數(shù)
根據(jù)Pluto 模塊相關(guān)函數(shù)的處理流程,證書相關(guān)數(shù)據(jù)應(yīng)在主模式第二包中CERT 相關(guān)字段中進(jìn)行處理。 因此,在Openswan 源碼中,向main_inI1_outR1相關(guān)流程里添加國密證書導(dǎo)出操作。 向main_inR1_outI2 相關(guān)流程里添加響應(yīng)方國密證書導(dǎo)入操作,從而實(shí)現(xiàn)協(xié)商流程的國密算法替換。
在IPSec VPN 通道成功建立,SA 成功生成后,雙方在業(yè)務(wù)通信階段使用ESP 協(xié)議的隧道模式來加密保護(hù)數(shù)據(jù)報文。 根據(jù)國密要求,在ESP 協(xié)議包的傳輸過程中,需要采用SM1 或SM4 對稱加密算法進(jìn)行數(shù)據(jù)機(jī)密性的保護(hù),并且選用SM3 或SHA-1算法來進(jìn)行數(shù)據(jù)內(nèi)容的完整性保護(hù)。
由于Openswan 項目代碼中用戶態(tài)和內(nèi)核態(tài)兩部分各自使用獨(dú)立的算法模塊,因此需要在內(nèi)核態(tài)中 再 次 實(shí) 現(xiàn)SM1 或SM4、SM3 或SHA-1 算 法。 內(nèi) 核態(tài)的加密算法調(diào)用流程如圖6 所示。
圖6 內(nèi)核態(tài)的加密算法調(diào)用流程
在Openswan 源碼實(shí)現(xiàn)中,內(nèi)核協(xié)議棧收到的網(wǎng)絡(luò)業(yè)務(wù)數(shù)據(jù)由Linux 在內(nèi)核態(tài)直接執(zhí)行加密算法,以便減少操作系統(tǒng)狀態(tài)切換過程中產(chǎn)生的不必要的性能損失。 這一過程中,Linux 采用XFRM 框架進(jìn)行算法查找和調(diào)用。 在使用國密算法進(jìn)行替換時,需要在內(nèi)核進(jìn)行國密算法的注冊。 其過程如下:
(1)根據(jù)Linux 內(nèi)核源碼中的算法標(biāo)識結(jié)構(gòu)定義,構(gòu)建國密算法的加密算法標(biāo)識結(jié)構(gòu)。
在Linux 內(nèi)核中,XFRM 框架對加密算法標(biāo)識的定義包括位于源碼目錄下的xfrm.h 頭文件里,其數(shù)據(jù)結(jié)構(gòu)包括xfrm_algo_desc 和sadb_alg_desc。 在Linux內(nèi)核源碼include/linux./pfkeyv2.h 中添加XFRM 在SPDB 中 查 找SM1、SM3、SM4 國 密 算 法 所 用 到 的 算法標(biāo)識,并在net/xfrm/xfrm_alog.c 中加入這些國密算法所需的算法描述結(jié)構(gòu)。 這樣就完成構(gòu)建國密算法的加密算法標(biāo)識結(jié)構(gòu)的過程。
(2)在Linux 內(nèi)核的算法庫中對國密算法進(jìn)行注冊。 在Linux 內(nèi)核中的NETLINK 模塊里,提供算法注冊的方式,其中crypto_alg 結(jié)構(gòu)用于描述對稱加密算法,shash_alg 結(jié)構(gòu)用于描述雜湊算法。 由驅(qū)動程序調(diào)用XFRM 框架的crypto_register_alg 函數(shù),完成向操作系統(tǒng)內(nèi)核注冊國密加密算法的過程。
基于國密SM2、SM3、SM4 等算法,在Openswan 開源項目和在Linux 操作系統(tǒng)的基礎(chǔ)上進(jìn)行代碼修改和算法的替換,從而設(shè)計并實(shí)現(xiàn)了基于國密算法的IPSec VPN 系統(tǒng)。 經(jīng)實(shí)驗,替換后的IPSec VPN 能夠達(dá)到與預(yù)期相當(dāng)?shù)耐掏铝?,在保證了性能的同時,提高了VPN 的自主可控水平。