2012年10月30日 星期二

建立Windows 與Linux的IPSec傳輸模式連線 (Setup IPSec Transport Mode Between Windows and Linux)

IPSec是IETF(Internet Engineering TaskForce)於1992年主導發展的一套開放標準的網路層安全協定(Network Layer Security Protocol),用以建立二端設備的安全性通道,由於IPSec具有開放性的工業標準 、可同時應用於IPv4和IPv6、具備私密性、完整性與雙向驗證的安全性能力 ,加以網路層協定擁有應用程式的使用透明性與彈性等諸多優點,所以很適合用來解決企業網路(Intranet)和商際網路(Extranet)的各種傳輸安全性問題。
IPSec的彈性在於可支援二種操作模式--傳輸模式(Transport Mode)和通道模式(Tunnel Mode)。傳輸模式會將IPSec的AH/ESP標頭如三明治一般插入在原始IP標頭和資料體(payload)之間,因此原始IP封包標頭並不會被修改或加密,攻擊者可以看到原始的標頭資訊,而IPSec傳輸模式主要設計用於主機端點對主機端點的安全性傳遞;另一個道模式(Tunnel Mode)會利用一個新的IP標頭來封包整個原始封包,所以攻擊者在ESP加密下並不會看到原始標頭資訊,通道模式可用來做為主機對網段、網段與網段之間或閘道器對閘道器間的安全性傳遞服務,但由於它會新增一個IP標頭,所以它的封包會較大。
本文的實務範例乃是公司使用CentOS Linux的 Samba服務提供了一些SMB網路共用目錄,而某些samba目錄存放著企業的私密性資料,基於安全性理由,希望Windows用戶端存取這些Samba資源時可以確保其傳輸私密性、完整性與相互驗證的安全性,因此決定利用IPSec這個網路層安全性來提供這項安全性需求,但是因為牽涉到二個不同平台的IPSec服務較為複雜,所以本文將說明如何在Linux和Windows平台設定安全性的IPsec連線。

規劃 IPSec 協定協議與連線參數

由於不同的IPSec軟體實作與採用的預設值不同,所以需先考慮與規劃二端的協議參數以便能夠成功地建立安全性關聯(SA),本案的基本設計及構想如下:
  • 本案目的在讓企業網路內多部Windows系統可以安全性連接存取Samba資源,屬於主機端點對主機端點連線,故採用傳輸模式(Transport Mode)。
  • 由於Windows的IPSec內定上基於NAT相容性問題並未啟用AH,所以本案亦僅採用ESP來驗證和加密。
  • 驗證方法採用較方便簡單設定的預先共用金鑰(Pre shared Key),而非較安全但卻須要較麻煩處理的憑證。
  • 由於Windows新版的IPSec並未啟用完全正向加密 (PFS),所以本案亦不使用PFS。
  • ESP加密演算法採AES128,驗證完整性演算法採SHA-1,如此的設計純粹這是Windows系統預設優先選用的演算法,直接採用,省卻需要額外設定的麻煩。

Linux IPsec 軟體– Openswan

Linux系統的發行版本眾多,不同的發行版本可能採用不同的IPsec軟體,而較為著名和常見的Linux IPSec套件有:
  • IPSec-tools:IPSec-tools可能是Linux上最常見的IPSec軟體,它支援使用SetKey手動建立連線,亦即所有IPSec連接所需的參數均由管理員提供,不使用IKE協議來自動認證對端和協商參數,如果須要使用IKE協定來自動建立IPsec連接通道(Automatic keying),那就須要搭配底下的Raccon軟體。
  • Raccon:IKE Daemon 用以自動協議IPSec金鑰
  • Openswan :Openswan是來自於FreeS/WAN原始碼繼續開發的IPSec軟體,本身即可以支援完整的IKE。
  • Libreswan:2012年Openswan名稱擁有權的法律爭議問題,讓大部份的原Openswan 開發人員重新改寫出另一個IPSec版本--Libreswan,於CentOS 7中Libreswan亦取代了openswan。
  • Strongswan:另一個FreeS/WAN 的後續版本,主要乃在提供完整的IKEv2協定和嚴謹的X.509憑證驗證方法並支援智慧卡,CentOS 7可透過EPEL安裝。
本文採用 CentOS Linux來實現IPsec安全性服務,而CentOS 從 6.x版後已經由Openswan取代了IPSec-tools ,Openswan是開放原始碼的一套Linux IPSec協定實作軟體,由已經中止發展的早期FreeS/WAN 繼續開發而來,其主要的特性如下:
  • Openswan 支援Tunnel Mode(VPN)和Transport Mode
  • Openswan j為 ISAKMP Daemon
  • 支援 NAT-Traversal
Openswan 組態檔 設定Openswan IPsec牽涉到二個重要的組態檔—ipsec.conf和ipsec.secrets,其檔案重要參數說明列表如下。 ipsec.conf (/etc/ipsec.conf) 檔案 ipsec.conf為Openswan IPSec 主要組態與連線控制設定檔,主要是要設定IPsec使用模式、各種加密方式與參數與金鑰交換的方式…等。 下表為ipsec.conf組態檔內重要參數及說明,若您需要所有參數的說明可利用"man 5 ipsec.conf"命令直接檢視其輔助說明。
參數 說明
Type 連線類型,主要的值有:
  • tunnel (預設):採用通道模式,主要用來建立主機對主機、主機對網段、網段對網段的通道,常被用來建立VPN通道。
  • transport:採用傳輸模式,只能應用於主機端點對主機端點的安全性傳輸。
  • passthrough:不使用IPSec
  • drop:封包將被丟棄
  • reject:封包將被丟棄並回應ICMP訊息
Authby IPSec的驗證方法:
  • secret :共用密碼 (Share Secret)
  • rsasig:RSA 數位簽署 (digital signatures),
auto
  • start:當ipsec啟動或系統重新開機時自動啟動此ipsec連線
  • add:ipsec啟動時並不會啟動連線,須要使用 ipsec auto --up <name>指令手動啟動
Left IPSec左手邊主機設備
Leftsubnet IPSec左手邊主機設備所保護的網段
Leftid 左手邊主機設備的FQDN,前面須附加@符號,如果DNS沒有左手邊主機設備資料,請勿使用此參數。
Leftrsasigkey 左手邊主機的RSA簽署公開金鑰,這可由 ipsec showhostkey --left 命令取得
Leftnexthop 想要連接到右邊主機設備所須要轉送的下一個 router
leftcert 假如您需要使用憑證來進行驗證,則設定leftrsasigkey=%cert並利用leftcert指出憑證位置(.pem),預設的位置在 /etc/ipsec.d/certs目錄下
Right IPSec右手邊主機設備
Rightsubnet IPSec右手邊主機設備所保護的網段
Rightid 右手邊主機設備的FQDN,前面須附加@符號,如果DNS沒有右手邊主機設備資料,請勿使用此參數。
Rightrsasigkey 右手邊主機的RSA簽署公開金鑰,這可由 ipsec showhostkey --right 命令取得
Rightnexthop 想要連接到左邊主機設備所須要轉送的下一個 router
ike 定義階段一(ISAKMP SA)所使用的加密及驗證演算法 ,格式為 "加密法1-雜湊1;Diffie-Hellman 模組1, 加密法2-雜湊2;Diffie-Hellman 模組2, ..."
  • 加密法:3des、aes .....
  • 雜湊:sha1、md5 ......
  • Diffie-Hellman模組:modp1024、modp1536 ..........
例如:ike=3des-sha1,aes-sha1,    ike=aes, ike=aes128-md5;modp2048,    ike=aes128-sha1;dh22,    ike=3des-md5;modp1024,aes-sha1;modp1536,   ike=modp1536
ikev2 是否啟用 IKEv2協議,可能值為 yes或 no。
phase2 設定階段二(IPSec SA)使用的IPsec協定,esp(預設)或ah
phase2alg 設定階段二(IPSEC SA)所使用的演算法,例如 3des-md5、aes256-sha1;modp2048、aes-sha1,aes-md5
keyingtries 嘗試金鑰協議的次數,可為一數值或%forever (0)。
ikelifetime 階段一 SA(IKE SA) 的金鑰須重新商議時間
keylife 階段二 SA(IPSec SA) 的金鑰須重新商議時間
rekeymargi 連線屆期或金鑰通道到期的時間 (單位為m, h, d)而須要重新商議
compress 連線是否使用壓縮
ipsec.secret (/etc/ipsec.secret) ipsec.secrets 提供了 IKE/IPSec驗證所需的相關資訊,可能的內容包括了預先共用密碼(preshared secret)、RSA私密金鑰或X.509憑證,所以若使用pre-share key的方式來做認證,則需要在此檔案內設定pre-share key字串,若是採用憑證方式認證,則憑證檔案(.pem)資訊亦需在此檔案中加以設定。 本文的目的在建立linux與Windows的IPSec傳輸模式連線,Linux系統將架設為Samba伺服器而提供Samba目錄,Windows平台需要以IPSec加密方式存取samba目錄以確保Samba資源的傳輸安全性,所以底下將分別設定並說明Linux和Windows平台如何建立IPsec傳輸通道。 Openswan ipsec命令 Openswan的ipsec命令可以讓我們控制啟動與連線、檢查openswan的狀態或除錯,所以是必備的ipsec管理指令,常用而重要的選項列表說明如下:
IPSec 重要命令 說明
ipsec verify 檢查Openswan的安裝狀況是否OK
ipsec setup {--start|--stop|--restart|--status} 啟動或停止Openswan IPSec子系統
ipsec barf [--short] 顯示相當詳細的IPSec除錯
ipsec auto --rereadsecrets 強迫IPSec 新載入ipsec.secrets檔案的資料
ipsec auto [--verbose] --up connection-name 啟動特定名稱的連線
ipsec auto --{add|delete|replace|down} connection-name 控制特定名稱的連線
ipsec look 顯示Opsenswan相關狀態資訊
ipsec auto --status 顯示Opsenswan ipsec的詳細狀態

建立 Linux Openswan IPSec 傳輸模式連線

為了整合Linux與Windows的IPSec,首先建立Linux  IPSec連線參數,所以本節將說明如何在CentOS 6.x系統上,安裝、設定與建立OpenSwan傳輸模式連線組態。

一. 檢查與安裝 openswan

首先,您須要確認您的CentOS 6己經安裝了openswan: # rpm –q openswan 若您的機器尚未安裝openswan,請使用yum指令執行安裝: # yum –y install openswan

二. 調整系統參數

為了能夠正確的啟動與執行IPSec,您須要編輯/etc/sysctl.conf檔案以調整一些系統參數, 首先,需要修改二項TCP/IP系統設定:

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
其次,加入下列數行
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
最後,請執行 sysctl –p 重新載入上述變更的設定。
三. 啟動並驗證IPsec
一旦調整系統參數後,為了確認安裝和系統環境有無問題,我們可以初次啟動IPSec服務並檢查,如下圖所示,尚未啟動IPSec前,執行 " ipsec --version"可看出系統尚未有IPSec堆疊存在,一旦使用 "service ipsec start"命令啟動了ipsec後,openswan就會自動載入netkey(Native linux IPsec stack),然後以 "ipsec verify"驗證和檢查機器上的IPSec執行環境,如有發生紅色的失敗,則需要根據錯誤訊息來重新調整設定,最後,利用chkconfig來設定每次啟動系統時均會自動啟動IPSec服務。
ipsec2
四.設定IPSe連線組態
建立Openswan IPSec連線參數需要編輯/etc/ipsec.conf和/etc/ipsec.secret,本範例的IPSec連接規劃如下:
  • 使用主機端點對主機端點的傳輸模式(Transport Mode)
  • 驗證方法採用預先共用金鑰 :在此並不採用安全性較高的簽署公開金鑰或憑證,主要是顧及與Windows互用溝通的方便容易性,至於預先共用金鑰的安全性較差問題,我們可藉由採用較長的共用金鑰長度來稍加彌補。
由於採用預先共用金鑰(Preshare Key)驗證方以及主機對主機的傳輸模式(Transport Mode),因此/etc/ipsec.conf組態檔的內容就較為簡單:
config setup
        protostack=netkey     (使用 netkey協定堆疊)
        oe=off         (停用機會加密)
        uniqueids=yes   (確保參與者的ID唯一)
conn sambaconn
       type=transport       (使用傳輸模式,只能用於主機對主機的傳輸)
       authby=secret        (採用預先共享金鑰 (PreshareKey)驗證方式 (secret或rsasig))
       left=192.168.2.171      (左手邊主機)
       right=%any   (右手邊主機)
       leftprotoport=6/445    (指定 TCP 445 流量需使用IPSec)
       rightprotoport=6/%any  (當右手邊主機使用TCP任何連接埠連接至左手邊主機的TCP 445(SMB)時需使用IPSec)
       auto=start        (自動啟動連線)
       rekey=yes   (連線即將到期時請重新協議)
       pfs=no     (不使用 Perfect forward secrecy產生金鑰)
       ike=aes128-sha1,3des-sha1;dh23     (定義階段一所使用的加密與驗證演算法)
       phase2=esp      (設定階段二 (IPSec SA)採用ESP加密)
       phase2alg=aes128-sha1,3des-sha1     (設定階段二採用3de加密和sha1雜湊演算法)
       keyingtries=0     (協議的次數)
       keylife=900s         (階段二 SA(IPSec SA) 的金鑰須重新商議時間)
       ikelifetime=7200s   (階段一 SA(IKE SA) 的金鑰須重新商議時間)
       rekeymargin=90s    (金鑰到期時間前90秒需重新協議金鑰)
       rekeyfuzz=5%       (rekeymargin所加上的隨機百分比)
       compress=no     (不要壓縮)
接下來,您需要在ipsec.secrets檔案內設定IPsec驗證的私密性資料,由於本文範例使用預先共用金鑰,所以內容相當簡單,只須格式如下的一行即可:
myip %any : PSK "shared secret with clients hosts"
例如本範的CentOS linux設定如下的組態行,由於預先共用金鑰的安全性不若憑證公開金鑰簽署驗證能力,所以採用了一個較長的共用金鑰。
192.168.2.171 %any : PSK "kajTghrn1623YTw%6G&9HB15GBmaki9012kLjsUyDA"

Samba組態的調整

由於Samba所使用的SMB/CIFS協定可以使用TCP139和TCP 445兩個連接埠,基於安全性和IPSec方便設定的考量須139連接埠關閉,而讓Samba只接受較安全的TCP 445連接埠,所以在samba的組態檔/etc/samba/smb.conf檔案內的[global]設定段內新增了以下二行:
disable netbios = yes
smb ports = 445
然後,重啟動smb服務即可。

建立Windows IPSec傳輸模式連線

Windows從Vista以後的作業系統使用『具有進階安全性的Windows防火牆』管理主控台(wf.msc) 內的『連線安全性規則』來建立IPsec連線,由於整合了Windows 防火牆規則,所以您需要二個步驟來完成IPSec連線設定:
  1. 先建立適當流量的輸入或輸出規則並設定『僅允許安全連線』和『要求連線必須加密』。
  2. 次建立相對的連線安全性規則:用以設定端點、設定驗證需求條件和設定驗證方法。
由於企業網路的存取用戶端機器眾多,所以一個較佳的方式是透過群組原則的方式來建立Windows防火牆輸出規則和連線安全性規則,因為群組原則具有一致與強制性的效果,且可大幅降低管理設定的負荷。
使用群組原則建立『僅允許安全連線』Windows防火牆輸出規則
管理員欲使用群組原則來建立『僅允許安全連線』Windows防火牆SMB協定輸出規則,需要針對TCP 445連接埠,整個步驟與說明如下:
  1. 啟動【群組原則管理】主控台並編輯『Default Domain Policy』群組原則物件。
  2. 請在群組原則編輯器內瀏覽至下列位置,並利用滑鼠右鍵功能表按一下『新增規則』:
    『電腦設定↘Windows設定↘安全性設定↘具有進階安全性的Windows防火牆↘具有進階安全性的Windows防火牆-LDAP://CN.......↘輸出規則』
    winfw1
  3. 請在出現的『新增輸出規則精靈』程式上,選擇『自訂』選項,按『下一步』繼續。
     winfw8
  4. 接下來的『程式』設定頁,接受預設的『所有程式』,然後按『下一步』繼續。
  5. 請於『通訊協定與連接埠』設定頁,選取"TCP" 通訊協定類型,並在『遠端連接埠』中選取『特定連接埠』並輸入 "445" 連接埠,然後按『下一步』繼續。
     winfw9
  6. 於『領域』設定頁中的遠端IP位址中輸入Linux的IP位址。
    winfw10
  7. 接下來的『執行動作』設定頁,請選取『僅允許安全連線』,並按下下方的『自訂』按鈕,並於出現的『允許在設定安全時自訂』對話方塊上選擇『需要加密連線』選項,然後按一下『確定』結束對話方塊,再按一下『下一步』繼續。
    winfw6
  8. 接下來的『電腦』及『設定檔』二個設定頁,請直接接受預設值,按『下一步』繼續即可。
  9. 最後的『名稱』設定頁,請輸入易懂的規則名稱後,按『完成』按鈕以完成輸出規則設定工作。
    winfw11
使用群組原則建立連線安全性規則
一旦建立了『僅允許安全連線』的SMB協定輸出規則之後,接下來您還需要建立另一個連線安全性規則以設定IPSec協議相關的參數,步驟與說明如下:
  1. 請在群組原則編輯器內的下列位置執行『新增規則』:
    『電腦設定↘Windows設定↘安全性設定↘具有進階安全性的Windows防火牆↘具有進階安全性的Windows防火牆-LDAP://CN.......↘連線安全性規則』
    winfw12 
  2. 接下來於出現的『新增連線安全性規則精靈』程式的『規則類型』設定頁中選擇『自訂』選項。
    winfw13
  3. 『端點』設定頁,於端點2中輸入Linux IP位址,如下圖所示:
    winfw14
  4. 於『要求條件』設定頁, 核選『需要對輸入及輸出連線執行驗證』以便強制IPSec的輸出與入驗證。
    >winfw15
  5. 於『驗證方法』設定頁,選取『進階』選項,再按一下『自訂』按鈕。
    winfw16
  6. 接下來請於『自訂進階驗證方法』對話方塊,按『新增』按鈕,然後選擇『預先共用金鑰』驗證方法並輸與上節Openswan的/etc/ipsec.secrets檔案內相同的共用金鑰,完成後按『確定』與『下一步』繼續。
    winfw20
  7. 『通訊協定與連接埠』設定頁中選擇 『TCP』通訊協定並在端點2連接埠上選擇『特定連接埠』和『445』,按『下一步』繼續。
    winfw21
  8. 『設定檔』設定頁,接受預設值,直接按『下一步』繼續。
  9. 最後,請輸入規則名稱完成設定。
    winfw22
一旦群組原則的連線安全性規則建立完成,用戶端可以直接輸入gpupdate命令立即重新套用新的原則設定或等待一段時間後自動重新整理後就會生效。

連線測試

一旦Linux系統上的Opsenswan組態檔設定完成,另一方面,Active Directory群組原則的輸出規則與連線安全性規則業已建立成功,最後您必須連線測試結果是否如預期一般,強制Windows用戶端存取Linux SAMBA服務時會自動協議IPSec以完成安全性的連接與資料傳送。
由於Windows 提供了不錯的IPSec監視工具可供檢視IPSec連線參數,所以您可以在網域內的任一部Windows機器的執行對話方塊,執行 \\linuxserver,並輸入正確的使用者名稱與密碼,若您可以如下圖看到所欲存取的Samba目錄,則就表示連線存取成功而可以進一步的確認是否有如預期的經由IPSec驗證及加密傳輸,但若根本無法連線,則可能是Windows和linux 的IPSec參數設定不同而無法協議的關係,須要調整設定。
run3
連線成功後,怹可以在Linux機器或Windows系統上檢查IPSec連線是否建立以及如何建立,如在Windows系統上,請啟動『具有進階安全性的Windows防火牆』工具,按一下『監視↘安全性關聯』,並分別檢視底下的『主要模式』和『快速模式』內容,如下圖為Windows與Linux Samba連線後所擷取的畫面,您可以由圖中看中階段一使用AES128加密、DH金鑰交換和預先共用金鑰驗證方法,而階段二採用ESP協定搭配AES128演算算做資料傳輸加密,ESP 也提供完整性,不啟用AH。
mode
在Windows 平台也可以使用net advfirewall monitor show 命令來取得IPSec連線協議相關的監視資料。
winfw27
另一方面,在Linux系統上,您可以利用 "ipsec auto --status" 命令來檢視IPsec連線狀況,您可以從顯示結果內看出目前有和那些機器成功的建立主要模和快速模式連線並協議那些參數。
ipsecauto
其次,您也可以利用tcpdump 來檢查或確認是否有與那部機器正在加密傳送。
tcpdump
最後,若有IPSec連線錯誤發生,管理員還可透過"ipsec barf"命令來協助診斷可能原因,ipsec barf指令會從/proc/net/*和 /var/log/*等相關的記錄檔收集除錯相關資料,而這些除錯的資料對於管理人員除錯上有相當的助益。

結語

IPsec這個網路層安全性協定提供了與應用程無關的安全性傳輸能力,而傳統的Linux IPsec在一般文件與用途上常被以通道模式的方式來建立VPN,但本文卻示範了另一種常被忽略的主機對主機安全性傳輸的傳輸模式,並選用了二個不同平台來加以整合IPsec的連線,亦即示範了Windows IPSec如何與Linux Openswan IPSec如何建立安全性的主機端點連線,而其中較為困難之處在於階段一(主要模式)與階段二(快速模式)之參數協議,因為不同廠商的IPSec,其內建使用的加密演算法不同,IKE金鑰交換參數不同,驗證方法也不同,所以必需於二端設定適當而一致的組態才能夠成功的建立IKE SA與IPSec SA,此外,若以安全性和密碼學的角度分析,本文所採用的方法有些安全上的弱點:
  • 採用Pre Shared Key驗證方法:本文採用的預先共用金鑰雖然較不安全,但簡單、方便且互通性高,另一種憑證方式自然是比較安全的方式,但卻須要處理憑證發行、撤銷等問題,不過在高度安全性要求下建議採用憑證為主的驗證方法
  • 不啟用完全正向加密 (PFS)方式:採用完全正向加密 (PFS)將會讓階段二協商進行新的Diffie-Hellman交換,雖然這種操作比較慢,但可以確保不會依賴先前用過的任何秘密金鑰,避免從同樣的初始秘密金鑰材料中摘取密鑰perfect forward secrecy (or PFS),所以較為安全,但由於Windows的IPSec內定上並未啟用此項功能,再加以圖形介面也無法啟用此項功能,所以本文也未啟用pfs,但如果基於更高安全性的考量,建議Windows使用 netsh advfirewall consec set rule qmpfs=…. 指令啟用pfs,而且openswan的組態檔/etc/ipsec.conf內將pfs改為yes即可。
  • 採用SHA1演算法:本文ESP加密採用AES128演算法,安全性問題不大,但完整性與驗證上採用了SHA1的160位元摘要值卻稍嫌不足,如果基於較高安全性的考量,建議可採用SHA-2來取代SHA-1,將比較能夠抵擋常見的暴力攻擊與生日攻擊。

本文採用CentOS 6.x 版的Openswan,後續的CentOS 7已由Libreswan取代了Openswan,另外也可由EPEL儲存庫安裝另一套完整支援IKEv2協定以及具有EAP和憑證驗證能力的Strongswan耷件。