網絡技術是從1990年代中期發展起來的新技術,它把互聯網上分散的資源融為有機整體,實現資源的全面共享和有機協作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數據資源、信息資源、知識資源、專家資源、大型數據庫、網絡、傳感器等。 當前的互聯網只限于信息共享,網絡則被認為是互聯網發展的第三階段。 所有在防火墻和路由器上開放的端口都是一種安全風險。這也是一種稱之為"端口碰撞(port knocking )"技術的價值所在。端口碰撞技術是一種允許訪問預先配置好"碰撞"的防火墻服務的技術。所謂的碰撞是由一個嘗試訪問系統上關閉端口的序列組成。這些嘗試要么記錄在一個日志中,要么保存在一個后臺進程中,通過預先配置這個日志或者進程來監視打開相應端口的序列,如果嘗試序列與預先設置的序列相符合,就可以打開某個端口。 通過這種方式可以讓一個端口在需要的時候才打開,從而具有一定的技術優勢。對于黑客來說,很難在遠程利用處于關閉狀態端口的相關服務來攻擊系統。例如,對于遠程管理來說,在一個公開的服務器上開放SSH服務是很方便的,但是這也使得系統允許任何人都有可能嘗試訪問該系統。當然,對于這個端口的訪問,你可以給定一個IP地址范圍的限制,但是這樣一來,還是帶來了安全問題和訪問挑戰方面的問題。端口碰撞技術讓你在這兩個方面都會處理的很好:在大多數時間里,這個端口都是關閉的,但是知道這種方法的可以在任何時候任何地方打開這個端口。 概述 由于有些大家都很熟悉的服務存在一定的安全方面的問題,因此,大多數的的安全破壞都是從外網利用這些安全問題來實現的。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--上接受連接的能力,并且可以創建一定的信任級別--這種信任基于遠程系統知道正確的碰撞序列。對于那些已經實現了比較好的安全性的服務器來說,端口碰撞技術是一種最好的補充。 網絡的神奇作用吸引著越來越多的用戶加入其中,正因如此,網絡的承受能力也面臨著越來越嚴峻的考驗―從硬件上、軟件上、所用標準上......,各項技術都需要適時應勢,對應發展,這正是網絡迅速走向進步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!