單包授權#
作者:Michael Rash
譯者:BlueDog
摘要#
單數據包授權填補了端口敲門中的空白。
由於無數個軟體、協議及其錯綜複雜的相互依賴關係形成了一個龐大系統,這種結構的複雜性使得確保系統的任何特定屬性 — 特別是安全性,就變得極其困難。即便是那些專門設計以增強安全性的軟體,在擁有深入洞察力的專家的挑剔眼光下,也可能被發現存在潛在的弱點。從防火牆到 SSH 協議的實現中都發現了漏洞。例如,OpenSSH 是由世界上一些最注重安全性的開發人員開發出來的,但它偶爾也會包含可遠程利用的漏洞。這是一個需要注意的重要事實,表明安全性非常難實現,因此支持縱深防禦方法。本文研究了單數據包授權 (SPA) 的概念,作為一種超越端口敲門的下一代被動身份驗證技術。
當攻擊者試圖利用伺服器軟體(而不是客戶端軟體)中的漏洞時,第一步是偵察,即攻擊者需要找到一個目標。Nmap 已出色地實現了這一過程的自動化,因此很容易構建一個可能易受攻擊的目標系統列表。如果您碰巧正在運行的伺服器軟體中存在零日漏洞,那麼您肯定不想出現在此目標列表中!端口敲門技術和單數據包授權技術都使用以默認丟棄方式配置的數據包過濾器,同時僅向能夠通過被動機制證明其身份的 IP 地址提供服務。無需 TCP/IP 堆棧訪問即可通過這種被動方式驗證遠程 IP 地址。以這種方式進行保護時,Nmap 甚至無法判斷伺服器是否正在運行,即使攻擊者擁有零日漏洞,他們也無能為力。
本文是關於單數據包授權的兩部分系列文章的第一部分,它為單數據包授權奠定了理論基礎,並解釋了它為何是超越端口敲門的下一代被動授權技術。下一章將提供有關如何使用 fwknop 為 SSH 守護程序提供單數據包授權保護的實踐指導。
端口敲門簡介#
端口敲門是一種早期技術,它利用 TCP 和 UDP 數據包頭中的端口字段來傳遞信息。通常,這些協議用於封裝應用程序層數據,但端口敲門通過使用端口號本身作為數據字段,將信息編碼為發送到各個端口的數據包序列。這些數據包通常通過防火牆日誌或數據包捕獲機制(如 libpcap)進行監控。通常情況下,會有一個端口敲門客戶端和一個端口敲門伺服器。在這種情況下(以及本文的其餘部分中,除非另有說明),術語客戶端和伺服器分別指發送和監控數據包的軟體組件。客戶端負責生成端口序列,伺服器負責被動接收序列,並在收到有效序列後重新配置數據包過濾器以允許連接到受保護的服務。
典型的端口敲門場景是端口敲門伺服器配置數據包過濾器以阻止對服務(如 SSH)的所有訪問,直至端口敲門客戶端發送特定的端口敲門序列。例如,伺服器可能要求客戶端按以下順序向以下端口發送 TCP SYN 數據包:
- 23400
- 1001
- 2003
- 65501
如果伺服器監視此敲門序列,則會重新配置數據包過濾器,以允許來自發出該序列的 IP 地址的 SSH 連接。利用數據包過濾器提供的連接跟蹤機制(如 Netfilter 中的 conntrack 系統),即使敲門伺服器創建的初始規則在超時後被刪除,SSH 會話仍然可以保持建立狀態。端口敲門序列可以加密,許多實現已在 http://www.portknocking.org 上列出。有關端口敲門操作的圖形表示,請參見圖 1。
圖 1. 端口敲門操作
端口敲門的局限性#
端口敲門可以有效限制對服務的訪問,但局限性在哪裡呢?首先,加密敲門序列不可避免地會帶來信息傳輸,而信息量的大小與加密算法有關。對於對稱加密算法,加密數據量至少與塊大小相當(例如,高級加密標準中採用的 Rijndael 對稱塊密碼,塊大小為 128 位)。對於非對稱加密算法,加密數據量會更大。
例如,GnuPG 中使用的原始 ElGamal 算法在對數據進行加密時,密文長度是明文長度的兩倍。即便 GnuPG 採用了壓縮技術(有時可以使密文長度小於原始明文長度),但 GnuPG 密鑰通常較大,導致即使是短小消息的密文也會達到數百字節。
端口敲門場景下尤為重要。由於 TCP 和 UDP 頭部僅提供 16 位寬度的端口字段,因此端口敲門序列中每個數據包僅能承載兩個字節的信息(假設包頭中其他字段不參與承載數據,即便參與,承載量級也遠小於數據載荷)。因此,對於分組密碼而言,密碼序列至少需要包含 B/(2*8) 個數據包,其中 B 為分組大小(以比特為單位)。從當前網絡的普遍速度和可靠性來看,這本身並不可怕,真正的問題在於亂序投遞。
亂序投遞數據對解密造成困難,由於端口敲門客戶端與服務端不存在類似 TCP 意義上的 “連接” 概念,因此服務端無法對亂序數據包進行重新排序。
數據包可能走不同的路由,部分路由可能是慢的,因此客戶端必須求助一種人為機制來儘量減小亂序到達的可能性:時間。在敲門序列中每個數據包之間引入時間間隔(比如半秒),通常可以保證數據包到達服務端時仍然是有序的。現在,對於 128 位塊大小,對應的端口敲門序列為 128/(2*8) = 8 個數據包。當考慮半秒的延遲時,僅僅傳遞序列就需要四秒。對於更大的消息(比如非對稱密碼產生的消息),這樣的數據傳輸速度是不可接受的。
數據傳輸能力的限制還給端口敲門方案帶來另一個限制。很難有效防禦重放攻擊。任何能夠監視客戶端發往伺服器的敲門序列的人都可以自由地針對伺服器重放該序列,以試圖獲得相同的訪問權限。如果該序列通過 NAT 設備傳遞,並且服務端的數據包過濾規則允許的源 IP 是外部的 NAT 地址,則這是一個特別嚴重的問題。比如,如果端口敲門客戶端位於 RFC 1918 子網比如 10.10.1.0/24,而端口敲門伺服器位於只能通過公網訪問的遠端網絡上,那麼伺服器必須允許來自 NAT IP 的訪問。那麼,相同子網上的任何人只要能重放該序列,就可以獲得相同的訪問權限。另外,只要規則存在,相同子網上的任何人都有相同的訪問權限,一旦實例化規則以接受來自 NAT 地址的連接(此時不需要序列重放,SPA 也是如此)。
為了嘗試解決重放問題,人們對傳統的端口敲門進行了各種修改,例如引入時間窗口、使用 S/Key 風格的哈希迭代,甚至在每次使用後簡單地更改加密密鑰。然而,這些方法都需要端口敲門客戶端和伺服器維護某種狀態,並且當涉及多個用戶時,其可擴展性並不是很好。
端口敲門的另一個限制是,惡意第三方只需將一個額外的數據包偽裝成客戶端通過線路發送的端口序列,就極易破壞敲門序列。攻擊者只需將數據包的源地址設置為與真實客戶端的源地址相同,並選擇與客戶端發送的最後一個數據包相同的端口號。這個額外的包會破壞敲門序列,因此伺服器不會允許合法客戶端進行任何其他訪問。儘管人們實際執行此操作的可能性相對較小(他們仍然需要能夠監視從客戶端發出的數據包),但主要問題是此類攻擊非常容易執行。只需一個數據包,攻擊者甚至不需要與原始數據包數據路徑處於同一鏈路上。
最後,任何能夠監視客戶端和伺服器之間流量的入侵檢測系統 (IDS) 都可以輕鬆地將敲門序列檢測為端口掃描。對於加密的敲門序列尤其如此,它們往往比簡單的共享序列更長。對於 IDS 而言,端口敲門看起來就像是從單個 IP 地址在相對較短的時間內對各種端口進行一系列探測,這非常符合端口掃描的定義。
單包授權#
綜上所述,端口敲門提供了增強安全性的諸多好處,但也存在一些需要解決的嚴重局限性。單包授權是一種相對較新的協議,它保留了端口敲門的所有好處,但修復了上面討論的局限性。第一個公開可用的 SPA 實現於 2005 年 5 月發布,作為稱為 fwknop(http://www.cipherdyne.org/fwknop)的軟體的一部分。最初創建於 2004 年的 fwknop 是第一個將被動操作系統指紋識別和端口敲門相結合的端口敲門實現(這使得可以執行諸如 “僅接受來自 Linux-2.4 系統的敲門序列” 之類的操作),但 SPA 方法現在是 fwknop 提供的最流行(也是默認的)身份驗證方法。需要注意的是,fwknop 提供身份驗證和授權服務,但本文的範圍不包括對兩者之間差異的全面討論。
單數據包授權要求與端口敲門類似的體系結構。二者均有客戶端和伺服器組件,伺服器控制默認丟棄數據包的過濾器,並且伺服器被動監視數據包。然而,端口敲門和 SPA 的體系結構相似性也僅限於此。
單數據包授權將數據傳輸轉移至其所屬的位置 —— 應用層。這意味著,SPA 能夠在每個數據包中發送多達最小 MTU 值(以太網網絡上的 1500 字節)的數據,而端口敲門只能在每個數據包中發送兩個字節的數據。這遠遠超過了端口敲門可能的數據傳輸速率,並且能夠輕鬆訪問如此數量的數據包數據,從而開闢了巨大的可能性。本文其餘部分討論了 fwknop 實現的單數據包授權。
fwknop 在應用程序層定義了以下數據包格式:
- 16 字節隨機數據
- 客戶端用戶名
- 客戶端時間戳
- fwknop 版本
- 模式(訪問模式 / 命令模式)
- 訪問(或命令字符串)
- MD5 校驗和
SPA 數據包格式中許多字段長度可變,但以 “:” 字符分割(字段經過 base64 編碼,因此嵌入的冒號不會破壞此語法)。fwknop 客戶端構建上述數據包格式後,整個數據包將使用兩種加密算法之一進行加密:具有 128 位共享密鑰的 Rijndael 對稱分組密碼或使用 GnuPG 生成的具有高達 2048 位公鑰 / 私鑰對的非對稱 ElGamal 算法。fwknop 客戶端默認通過 UDP 端口 62201 發送 SPA 數據包,但這可以通過命令行輕鬆更改;請參見 --Server-port 參數。(fwknop 提供了許多配置選項 —— 請參見資源以獲取文檔和手冊頁的鏈接。)有關 SPA 操作的圖形表示,請參見圖 2。
圖 2. SPA 操作
16 字節的隨機數據解決了端口碰撞中最高優先級的限制之一 —— 重放問題。每個 SPA 數據包加密前添加 16 字節隨機數據,fwknop 伺服器解密後,緩存整個數據包的 MD5 校驗和。隨機數據使每個 SPA 數據包都不同(即使發送相同的訪問指令),因此每個數據包的 MD5 校驗和也不同。若新數據包的 MD5 校驗和與先前數據包匹配,fwknop 伺服器不採取任何操作,並寫入 syslog 警告消息。因此,被第三方攔截的 SPA 數據包無法在網絡上重播以繞過默認丟棄數據包的過濾器。
fwknop 將客戶端用戶名和時間戳放入數據包中,fwknop 伺服器使用用戶名為遠程用戶維護不同的授權級別。fwknop 可安裝在多用戶系統上,每個用戶可被授權通過遠程 fwknop 伺服器連接到不同的服務。fwknop 版本字段用於保持向後兼容性。新版本中可添加或刪除字段,但通過使用版本號,fwknop 伺服器可與舊客戶端構建 SPA 數據包的方式兼容。模式字段告訴 fwknop 伺服器客戶端是要訪問服務還是執行命令(下一個字段使用特定的訪問控制指令或命令)。例如,要訪問 TCP 端口 22,訪問字段將包含字符串,tcp/22,其中 <IP 地址> 是客戶端選擇放入數據包的任意 IP 地址。最後,MD5 校驗和字段包含客戶端在傳輸前未加密的數據包的 MD5 校驗和。伺服器在解密後使用此字段驗證消息完整性。
SPA 數據包傳輸更多數據解決了重放問題和端口敲門方案中極低的數據傳輸速率。端口敲門中的另外兩個限制也可以被解決。首先,SPA 協議的單數據包性質意味著惡意第三方無法僅僅通過欺騙數據包到與受監視的 SPA 數據包發送的相同端口來破壞身份驗證方案。最後,由於 SPA 協議只需要一個數據包,因此對於任何中間 IDS,它看起來都不像端口掃描。任何 IDS 都只能看到一個看似毫無意義的數據塊,似乎是隨機發送到某個 IP 地址的。
結論#
單數據包授權在保護服務方面提供了類似端口敲門的安全優勢,這些服務使用默認丟棄策略配置的數據包過濾器。任何人以這種方式掃描受保護的目標服務時,都無法檢測到此類服務正在監聽,這使得利用零日漏洞也更加困難。SPA 為端口敲門實現的諸多限制提供了巧妙的解決方案。這些解決方案使 SPA 能夠解決重放問題、實現支持非對稱加密使用的數據傳輸速率、挫敗簡單的欺騙攻擊,並避開監視網絡端口掃描的入侵檢測系統的偵察。
請參閱下個月的 LJ,了解本文的第二部分,其中將詳細展示如何使用 SPA。
參考資料#
- Krzywinski, M. 2003.“端口敲門:跨越關閉端口的網絡認證”。SysAdmin 雜誌 12:12-17
- ElGamal 加密:http://en.wikipedia.org/wiki/ElGamal_encryption
- 在我撰寫本文時,我所知道的其他 SPA 實現只有一個,可從 http://www.unspecific.com/spa 獲得
- 另一個名為 Tumbler(http://tumbler.sourceforge.net)的實現使用單個數據包,但它使用哈希有效負載而不是加密有效負載,這導致了截然不同的架構
- fwknop 文檔和手冊頁:http://www.cipherdyne.org/fwknop/docs