SSH的工作原理
SSH簡介
傳統的網路服務程序,比如FTP,POP,Telnet,本質上都是不安全的,因為它們在網路上用明文傳送數據、用戶賬號和用戶口令,很容易受到中間人攻擊方式的攻擊,攻擊者會冒充真正的伺服器接收用戶傳給伺服器的數據,然後再冒充用戶把數據傳給真正的伺服器。
為了滿足安全性的需求,IETF的網路工作小組制定了Secure Shell(縮寫為SSH),這是一項創建在應用層和傳輸層基礎上的安全協議,為計算機上的Shell提供安全的傳輸和使用環境。
SSH是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議。利用SSH協議可以有效防止遠程管理過程中的信息泄漏問題。通過SSH可以對所有傳輸的數據進行加密,也能夠防止DNS欺騙和IP欺騙。
本文將會重點討論SSH中用到的加密演算法和建立安全連接的過程。
使用到的技術
為了保證信息傳輸的安全性,SSH使用了對稱加密、非對稱加密和散列等技術。
對稱加密
對稱密鑰加密又稱為對稱加密、私鑰加密、共享密鑰加密,是密碼學中一類加密演算法。這類演算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單地相互推算的密鑰。
SSH使用對稱密鑰加密整個連接過程中傳輸的信息。值得注意的是,用戶自己創建的public/private密鑰對僅僅用於驗證,不會用在加密連接上。對稱加密允許對密碼進行身份驗證,以防止第三方窺探。
共享密鑰通過密鑰交換演算法生成,它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰。客戶端和服務端都參與了這個過程,過程的細節將在後面闡述。
生成的密鑰將用來加密這次會話過程中客戶端和服務端傳輸的數據。這個過程會在驗證客戶身份之前完成。
SSH支持多種對稱密鑰演算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客戶端和服務端可以配置採用演算法的列表。客戶端列表中第一個能被服務端支持的演算法將被採用。
比如在Ubuntu 14.04上,客戶端和服務端默認的配置如下:
aes128-ctr
,
aes192-ctr
aes256-ctr
arcfour256
arcfour128
aes128-cbc
blowfish-cbc
cast128-cbc
aes192-cbc
aes256-cbc
arcfour
。 也就是說,如果兩台Ubuntu 14.04採用默認配置,它們總是會採用
演算法來加密連接。
非對稱加密
在非對稱加密方法中,需要一對密鑰,一個是私鑰,一個是公鑰。這兩個密鑰數學相關。用公鑰加密後所得的信息,只能用私鑰才能解密。如果知道了其中一個,並不能計算另外一個。因此,如果公開了一對密鑰中的一個,並不會危害到另外一個的秘密性質。
SSH在一些地方使用了非對稱加密。
在密鑰交換過程中使用到了非對稱加密。在這個階段,客戶端和服務端生成臨時密鑰對,並且交換公鑰來生成共享密鑰。
在身份驗證的過程中也使用了非對稱加密。SSH密鑰對用來向服務端驗證客戶端身份。客戶端創建一對密鑰,然後將公鑰上傳到遠程伺服器上,寫入文件
~/.ssh/authorized_keys
。
在創建共享密鑰後,客戶端必須向服務端證明身份。服務端會使用文件中的公鑰加密一段信息,並將加密後的信息發送給客戶端。如果客戶端可以能夠破解這段信息,那麼就能夠證明自己擁有相關的私鑰。之後服務端會為客戶端設置shell環境。
散列
散列是電腦科學中一種對資料的處理方法,它通過某種特定的演算法將要檢索的項與湧來檢索的索引關聯起來,生成一種便於搜索的數據結構(散列表)。它也常用做一種資訊安全的方法,由一串資料中經過散列演算法計算出來的資料指紋,來識別檔案和資料是否有被篡改。
SSH主要使用了散列消息認證碼(Keyed-hash message authentication code,縮寫為HMAC),來確認消息沒有被篡改。
上面提到的對稱加密協商過程中,會使用消息認證碼(MAC)演算法。這個演算法會從客戶端支持的演算法中選出。
在密鑰協商完成後,所有的消息都必須攜帶MAC,用於通信雙方驗證消息的一致性。MAC值由共享密鑰,消息的分組序列和實際消息內容計算得到。
在對稱加密區域之外,MAC本身作為分組的最後部分被發送。研究者通常建議先機密數據,然後計算MAC
SSH工作流程
SSH協議採用客戶端-服務端模型對兩方進行身份驗證,並對它們之間的數據進行加密。
服務端在指定埠監聽連接請求。它負責協商安全連接,認證連接方,並為客戶端生成正確的shell環境。
客戶端負責協商安全連接,驗證伺服器的身份是否與以前記錄的信息相匹配,並提供憑證進行身份驗證。
SSH會話分為兩個階段。第一個是同意和建立加密來保護未來的溝通。第二個階段是對用戶進行身份驗證,並發現是否應該授予對伺服器的訪問許可權。
會話加密協商
當客戶端發起請求後,服務端返回支持的協議版本。如果客戶端可以匹配其中一個協議版本,則連接繼續。服務端會提供它的公共主機密鑰,客戶端可以用這個密鑰來驗證服務端是否合法。
此時,通信雙方採用迪菲-赫爾曼演算法來協商會話密鑰。
該演算法的大致過程如下:
雙方協定共享一個大素數。
雙方協定一個加密演算法。
雙方各自生成一個素數,並保密。這個素數將作為私鑰。
雙方使用協定的演算法,由各自的私鑰和共享的素數計算得到公鑰。
雙方交換生成的公鑰。
雙方使用各自的私鑰,另外一方的公鑰和共享的素數,計算得到一個共享密鑰。雙方計算得到的共享密鑰應該是一樣的。
使用共享密鑰加密後面的會話。
用於其餘連接的共享密鑰加密被稱為二進位數據包協議。上述過程允許雙方平等地參與生成共享密鑰。
生成的密鑰是對稱密鑰,這意味著用於加密消息的密鑰也可以用於解密。其目的是將後面的通信包裝在不能被外部人員解密的加密隧道中。
在生成會話密鑰後,就開始進行用戶身份驗證。
驗證用戶身份
根據伺服器接受的方式,有幾種不同的方法可用於身份驗證。
最簡單的方法是密碼驗證,其中伺服器要求客戶端輸入嘗試登陸賬號的密碼。密碼是通過協商加密發送的。
雖然密碼被加密,但由於密碼的複雜性受到限制,因此通常不建議使用此方法。與其他身份驗證的方法相比,自動腳本相對容易攻破正常長度的密碼。
最為推薦的選擇是使用SSH密鑰對。SSH密鑰對是非對稱密鑰。
公鑰用於加密只能用私鑰解密的數據。公鑰可以自由共享,因為沒有從公鑰中導出私鑰的方法。
驗證流程如下:
客戶端首先向服務端發送密鑰對的ID。
服務端檢查文件 authorized_keys 尋找該ID的公鑰。
如果找到,服務端生成一個隨機數,並使用公鑰加密這個數。
服務端將加密後的信息發送給客戶端。
如果客戶端擁有對應的私鑰,那麼就能使用私鑰解密消息,得到服務端生成的隨機數。
客戶端使用解密後的數和會話使用的共享密鑰得到一個值,然後計算這個值的MD5散列值。
客戶端將這個MD5散列值發送回服務端。
服務端用會話共享密鑰和生成的隨機值計算得到自己的MD5散列值。然後比較客戶端傳回的值和自身生成的值。如果匹配,則證明客戶端擁有私鑰,客戶端驗證通過。
可以看到,密鑰的不對稱性允許服務端使用公鑰加密消息給客戶端。然後,客戶端可以通過正確解密消息來證明它擁有私鑰。
後記
筆者本科專業是信息安全,不過畢業後並沒有從事安全行業,工作4年課堂上學習的知識基本忘的差不多了。 而SSH算是工作中最常用到的東西之一,其工作原理涉及不少密碼學的東西。 寫這篇博文,一是希望能幫助讀者了解SSH,二也是希望自己能撿起一些專業知識。在互聯網/軟體相關行業里,不論是否從事安全工作,了解這些東西都是很有必要的。


※五分鐘帶你看完 WWDC 2017 新品發布
※全球最大球鞋市集現身荷蘭,現場最貴的球鞋竟然是……
※還在等什麼?Nike Air Foamposite Pro新品中國區確定發售!
※萬眾期待聯乘之作
※華人社群,海禁,人口,香料貿易,種植園,中間階層
TAG:輕芒 |
※深度理解PLC的工作原理
※Flux架構的工作原理
※先理解Mask R-CNN的工作原理,然後構建顏色填充器應用
※談一談爬蟲工作中HTTP代理ip的重要性
※模塊化AWG的工作原理及使用方法
※掌握「334原理」,輕鬆玩轉HRBP工作
※多份專利公布 一窺Magic Leap One內部結構和工作原理
※多份專利公布,一窺Magic Leap One內部結構和工作原理
※TWICE私下和熒幕形象不同?合作過的工作人員公開對Twice的評價
※IBM、Intel、NVIDIA和 AMD 等因 AI 工作負載「將重新設計處理器」
※Snow Peak 以日本傳統工作服為主題推出「LOCAL WEAR」和服系列
※Dior、范思哲、CHANEL世界著名服裝設計師背後的工作狀態
※HUAWEI MateBook X Pro,工作之餘的移動影院
※前SIE副總裁主動請纓《怪物獵人 世界》NS版移植工作
※IBM Cloud推出最強英偉達GPU,簡化AI和HPC工作負載
※有趣!PLOS ONE:聲音還會影響基因工作
※微軟與Hi-Rez工作室合作SMITE Pro League Mixer獨家合作
※BoA公開作為SM公司理事的工作日常,你能猜到她具體是做什麼嗎?
※前端生態混亂,AMP&MIP在努力做標準化工作
※硝化細菌的作用以及工作原理