在IPSec的安全體系中,有兩個很重要的資料庫。一個是SPD - Security Policy Database;另一個是SAD - Security Association Database。顧名思義,SPD中定義了若干策略,說明對於各個IP資料流應當做出怎樣的處理,是透傳、丟棄,還是執行IPSec加解密。SAD則負責儲存已經建立的SA相關資訊,比如SA的各種參數,如密碼編譯演算法、認證演算法、存留時間等。
下面以一個例子為線索,說明它們之間的關聯關係。網路結構如下:
描述:
裝置10.0.68.5在Spoke-2-East的區域網路10.0.68.0/24內部。它想要跟另一台位於VPN-GW1-EAST的區域網路10.1.1.0/24中的裝置10.1.1.5進行通訊。
通訊過程如下:
1. 當一個IP包從10.0.68.5發往目的地址10.1.1.5,資料包首先通過區域網路裝置到達路由器SPOKE-2-EAST。它上面的配置資訊確定了通過網路介面serial0/0來講此資料包路由到Internet。
2. 在資料包被路由出去之前,路由器會首先檢查serial0/0介面的SPD。
SPD的內容如下:
研究一下這個SPD。其中每一行代表一個SPD Entry。Local IP / Local Port / Remote IP / Remote Port / Protocol都是traffic selector。Action表示對滿足條件的IP流執行怎樣的策略,是DISCARD / BYPASS,或者是應用IPSEC加密? Policy表示,一旦採用IPSec加密,那麼在協商SA時應當建議怎樣的演算法等等。目前SA entry都為空白,因為還沒有建立任何SA。
再仔細觀察,可以發現每個Traffic Selector都有一個sharing? 這表示什麼意思呢?RFC4301規定,每個Selector都包含一個PFP flag(Populate from packet)。它可以設定成True或者False。當此標誌被設定為True,則表示在建立一個SA時使用packet中的Traffic selector payload來作為selector,否則使用SPD中的Selector。舉一個具體的例子,比如,現在10.0.68.5想要想10.1.1.5發送http請求。根據SPD,它滿足最上面的index為9的規則。由於SA不存在,所以在IKE_AUTH交換後將產生必要的SA。在產生新的SA時,發現規則9中的Local
IP / Remote IP的PFP flag都為false,也就是說允許SA sharing。那麼將利用規則9中的Traffic Selector來產生一個共用SA,所有從10.0.68.5到10.1.1.0/24網段的TCP流都將使用這個新產生的SA來加密。相反的,如果PFP為True,也就是不允許SA sharing,那麼在產生SA時將使用IKE_AUTH訊息中的Traffic Selector Payload中協商好的Traffic Selector。假如Traffic Selector Payload中指定Tsi為10.0.68.5,而Tsr為10.1.1.5,那麼新產生的SA只對10.0.68.8和10.1.1.5之間的TCP資料流提供IPSec保護。
稍作總結,PFP flag描述了在產生一個SA時是使用SPD Entry中的Traffic Selector還是使用IKE_AUTH / IKE_CREATE_CHILD訊息的Traffic Selector Payload中的Traffic Selector。如果使用前者,意味著SPD中的每條規則將只對應一對SA,如此處的從10.0.68.5與10.1.1.0/24網段的一對SA。而如果使用後者,那麼產生的新SA可能只是對應著SPD Entry中描述的一個子集,如此處,可能10.0.68.5和10.1.1.5之間就有一對專用SA,而10.0.68.5再與10.1.1.8通訊可能會建立起另外一對SA。這樣,一個SPD
Entry所對應的Policy可能產生多個SA。
在這裡,我們發現在SPD Entry中有一對SAD Entry的指標。但是,其實在RFC4301中對SPD Entry結構的定義中,並沒有要求在SPD Entry中包含SAD Entry的指標。此處的SPD表只是實現的一種方式。在具體實現中,完全可以沒有這個指標。當從SPD中瞭解到需要對一個IP流採用的策略後,再到SAD中尋找是否有對應的SA。在SPD中包含SAD Entry的指標可以提高效率。但是如果一個SPD Entry對應多個SA,此處就需要有一種機制從多個SA Entry指標中找到最匹配的一個。
SAD:
SPD是一個策略資料庫,描述了對每一個IP資料報應該採取的策略,是透傳、丟棄或者做IPSec加解密。同時,它還為SA的建立提供協商用的參數,比如,加密套件,存留時間等。新產生的SA則被插入到SAD中。每當發出或者接收到一個資料包的時候,如果對它的策略是IPSec,那麼就要去SAD中找到對應的SA,根據SA中提供的參數,對資料包進行加解密、產生校正和、封裝成AH/ESP等操作。
3. 到目前為止,我們已經從SPD和SAD中瞭解到負責此IP資料報的SA還沒有建立。Spoke-2-East將首先向遠端的VPN-GW1-East發起第一個IKE的協商請求。協商成功後,兩個安全網關之間將為從10.0.68.5和10.1.1.0/24之間的通訊產生一個Ipsec SA。
4. 當VPN-GW1-East收到加密的資料包的時候。它將首先利用外層的目的地址、ESP協議號和ESP頭部的SPI為索引,從SAD中檢索SA。如果找到,利用SA的參數對資料包進行解密,然後對解密的資料包應用SPD規則。此時,使用的是內部IP,因為資料包已經被解密了。