埠碰撞技術讓開放埠更安全(轉)

PigBaby2007發表於2007-08-08
所有在防火牆和路由器上開放的埠都是一種安全風險。這也是一種稱之為"埠碰撞(port knocking )"技術的價值所在。埠碰撞技術是一種允許訪問預先配置好"碰撞"的防火牆服務的技術。所謂的碰撞是由一個嘗試訪問系統上關閉埠的序列組成。這些嘗試要麼記錄在一個日誌中,要麼儲存在一個後臺程式中,透過預先配置這個日誌或者程式來監視開啟相應埠的序列,如果嘗試序列與預先設定的序列相符合,就可以開啟某個埠。
  透過這種方式可以讓一個埠在需要的時候才開啟,從而具有一定的技術優勢。對於駭客來說,很難在遠端利用處於關閉狀態埠的相關服務來攻擊系統。例如,對於遠端管理來說,在一個公開的伺服器上開放SSH服務是很方便的,但是這也使得系統允許任何人都有可能嘗試訪問該系統。當然,對於這個埠的訪問,你可以給定一個IP地址範圍的限制,但是這樣一來,還是帶來了安全問題和訪問挑戰方面的問題。埠碰撞技術讓你在這兩個方面都會處理的很好:在大多數時間裡,這個埠都是關閉的,但是知道這種方法的可以在任何時候任何地方開啟這個埠。
[@more@]


  概述

  由於有些大家都很熟悉的服務存在一定的安全方面的問題,因此,大多數的的安全破壞都是從外網利用這些安全問題來實現的。FTP和SSH使用的是大家都很熟悉的埠,因此長期以來,這些服務一直都存在著各種各樣的攻擊方法。而在大多數情況下,這些服務都是讓內部使用者來使用的,因此內部使用者是使用埠碰撞技術的主要候選人。

  很顯然,對於那些你需要公開的訪問服務,例如HTTP和SMTP服務,埠碰撞技術則不適合用於這種場合。因為網頁服務和電子郵件服務需要允許來自任何地方的連線。然而,對於所有其他的服務來說,最好的實際操作是將所有非必須的埠都關閉。因而,從存在安全方面的問題的角度來考慮,象SSH這樣一種非常有用的服務也常常需要處於關閉狀態。

  這就是埠碰撞技術非常有用的地方。首先,透過探測技術是不會發現這種基於埠碰撞技術配置的伺服器的。防火牆軟體將會自動拒絕所有的埠掃描或者任何直接連線嘗試。並且透過選擇一系列非連續的埠號來實現埠碰撞(我們將在隨後介紹),你可以減輕對安全問題的顧慮,因為一個標準的埠掃描器一般不太可能得到一個正確的碰撞序列。透過使用這種方法,在得到良好的安全性的同時,還可以實現遠端訪問。

  你可能會問自己,我為什麼需要這種方法?事實上你可能用不上這種技術。這種技術只是增加當前網路的安全性,在可能存在的駭客和需要保護的服務之間建立一個不易覺察的安全層。如果遠端使用者不知道伺服器在監聽一個特定的埠,那麼你將大大減少透過這個埠危及系統的次數。更進一步地,遠端使用者不太可能確定伺服器是否使用了埠碰撞技術,因此也不太可能來使用暴力嘗試來猜測正確地序列。

  埠碰撞的細節問題

  可以使用不同的方法來配置埠碰撞。你可以使用基於靜態埠序列的方式來實現授權訪問。例如,伺服器可以這樣設定,在它按順序接收到與埠2033、3022、6712、4998、以及4113的連線嘗試後,開啟TCP埠22。如果伺服器接收到一個不正確的序列則關閉該埠,或者使用一個定時器來關閉該埠。監控防火牆日誌的後臺程式在截獲這些被拒絕的嘗試後,將在防火牆中增加一個新的防火牆規則來開啟必要的埠,授權使用者訪問該埠。


  還可以使用動態配置技術來開啟埠。首先,你需要建立一個埠集合,在本文的例子中,我們將使用埠1040到埠1049。透過提供一個開始序列--例如1042、1044、1043--隨後,對於你希望開啟的埠,你可能還需要給伺服器提供相應的接收資訊。在序列1042、1044、以及1043後,你需要讓伺服器知道你想讓它開啟埠443。之所以採用這種設計,是為了增加開啟不同伺服器必要埠的靈活性和選項而不需要採用靜態配置。

  加密通訊可能也可以增加額外層次的安全性。如果你擔心別人嗅探你的資料包或者擔心有人盜竊你的碰撞序列的話,採用這種加密方式將非常有益。對於埠碰撞來說,使用加密技術是一種最安全的方法,並且我們將在隨後的文章中看到,加密技術是在原型中經常使用的一種方法。

  使用knockclient和knockdaemon

  Portknocking.org公司已經用Perl語言實現了埠碰撞技術,現在可以從該公司的網站下載這個工具。檔案portknocking-0.1.tgz中包含knockclient和knockdaemon兩個程式。該版本允許遠端使用者開啟埠0到255,並且自動使用Crypt::Blowfish執行加密工作。你只需要在遠端系統上使用必要的命令選項來呼叫knockclient程式即可。例如,要在遠端系統上開啟特定IP上的埠22,你可以使用這樣的命令:knockclient -client 192.168.0.1 -remote 10.1.42.1 -port 22 -time 0。

  在這個例子中,我們要開啟IP地址為10.1.42.1的伺服器上的埠22,並且只允許IP地址為192.168.0.1d的主機與這個伺服器之間只能有一個連線。由於-time的標識為0,因此我們要開啟的埠在開放時間上沒有限制。如果time的時間為255的話,那麼該命令就是要關閉這個埠。其他從1到254之間的time值表示埠開啟的時間(以分鐘計算)。在knockclient和knockdaemon之間的共享密碼用於加密碰撞序列,並且使得遠端主機和本地主機之間的資訊只有他們自己能夠理解。另外,在這種實現中,要使用遠端主機的埠745 到埠1000。伺服器的埠開啟之後,需要關閉遠端主機的這些埠,並且防火牆的日誌需要開啟。然後後臺程式預設狀態下就會監聽這些埠的8個碰撞。Perl模式 file&::Tail 用於檢測新增到防火牆日誌上的新的行資訊,並且knockdaemon將會分析這些行資訊。

  雖然這僅僅是一個原型,但是卻執行的很好。很顯然,埠碰撞技術的核心是遠端主機發起的碰撞序列是否能夠開啟一個埠。寫出這樣的一個程式或者將其加入到當前可用的資源中是一件並不困難的事情,並且可以很容易的實現各個系統的定製。例如,如果訪問一個NATIP地址,你可以根據碰撞序列來配置策略,實現動態轉發對內部主機的SSH訪問。另外,根據你的配置,使用埠碰撞技術還可以實現備份或者執行其他的作業。

  總結

  埠碰撞技術對於增加一層看不見的認證來說還是非常有益處的。只有提供了正確的埠序號的使用者才可以有一次獲得可用服務如SSH等的機會。這使得伺服器可以具有從任意IP--如一個移動或者動態的IP--上接受連線的能力,並且可以建立一定的信任級別--這種信任基於遠端系統知道正確的碰撞序列。對於那些已經實現了比較好的安全性的伺服器來說,埠碰撞技術是一種最好的補充。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10144097/viewspace-934425/,如需轉載,請註明出處,否則將追究法律責任。

相關文章