SSH簡介
傳統(tǒng)的網(wǎng)絡(luò)服務(wù)程序藕筋,比如FTP纵散,POP,Telnet隐圾,本質(zhì)上都是不安全的伍掀,因為它們在網(wǎng)絡(luò)上用明文傳送數(shù)據(jù)、用戶賬號和用戶口令暇藏,很容易受到中間人攻擊方式的攻擊蜜笤,攻擊者會冒充真正的服務(wù)器接收用戶傳給服務(wù)器的數(shù)據(jù),然后再冒充用戶把數(shù)據(jù)傳給真正的服務(wù)器盐碱。
為了滿足安全性的需求把兔,IETF的網(wǎng)絡(luò)工作小組制定了Secure Shell(縮寫為SSH),這是一項創(chuàng)建在應(yīng)用層和傳輸層基礎(chǔ)上的安全協(xié)議瓮顽,為計算機上的Shell提供安全的傳輸和使用環(huán)境县好。
SSH是目前較可靠,專為遠程登錄會話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議趣倾。利用SSH協(xié)議可以有效防止遠程管理過程中的信息泄漏問題聘惦。通過SSH可以對所有傳輸?shù)臄?shù)據(jù)進行加密危尿,也能夠防止DNS欺騙和IP欺騙牺弹。
本文將會重點討論SSH中用到的加密算法和建立安全連接的過程剥悟。
使用到的技術(shù)
為了保證信息傳輸?shù)陌踩裕?strong>SSH使用了對稱加密捎谨、非對稱加密和散列等技術(shù)。
對稱加密
對稱密鑰加密又稱為對稱加密禀酱、私鑰加密炬守、共享密鑰加密,是密碼學中一類加密算法剂跟。這類算法在加密和解密時使用相同的密鑰减途,或是使用兩個可以簡單地相互推算的密鑰。
SSH使用對稱密鑰加密整個連接過程中傳輸?shù)男畔⒉芮ⅰV档米⒁獾氖趋⒅茫脩糇约簞?chuàng)建的public/private密鑰對僅僅用于驗證,不會用在加密連接上送淆。對稱加密允許對密碼進行身份驗證税产,以防止第三方窺探。
共享密鑰通過密鑰交換算法生成偷崩,它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創(chuàng)建起一個密鑰辟拷。客戶端和服務(wù)端都參與了這個過程阐斜,過程的細節(jié)將在后面闡述衫冻。
生成的密鑰將用來加密這次會話過程中客戶端和服務(wù)端傳輸?shù)臄?shù)據(jù)。這個過程會在驗證客戶身份之前完成谒出。
SSH支持多種對稱密鑰算法隅俘,包括AES,Blowfish到推,3DES考赛,CAST128和Arcfour±虿猓客戶端和服務(wù)端可以配置采用算法的列表∵蠛恚客戶端列表中第一個能被服務(wù)端支持的算法將被采用捣卤。
比如在Ubuntu 14.04上,客戶端和服務(wù)端默認的配置如下:aes128-ctr
,aes192-ctr
,aes256-ctr
,arcfour256
,arcfour128
,aes128-gcm@openssh.com
,aes256-gcm@openssh.com
,chacha20-poly1305@openssh.com
,aes128-cbc
,blowfish-cbc
,cast128-cbc
,aes192-cbc
,aes256-cbc
,arcfour
八孝。
也就是說董朝,如果兩臺Ubuntu 14.04采用默認配置,它們總是會采用aes128-ctr
算法來加密連接干跛。
非對稱加密
在非對稱加密方法中子姜,需要一對密鑰,一個是私鑰楼入,一個是公鑰哥捕。這兩個密鑰數(shù)學相關(guān)牧抽。用公鑰加密后所得的信息,只能用私鑰才能解密遥赚。如果知道了其中一個扬舒,并不能計算另外一個。因此凫佛,如果公開了一對密鑰中的一個讲坎,并不會危害到另外一個的秘密性質(zhì)。
SSH在一些地方使用了非對稱加密愧薛。
在密鑰交換過程中使用到了非對稱加密晨炕。在這個階段,客戶端和服務(wù)端生成臨時密鑰對毫炉,并且交換公鑰來生成共享密鑰瓮栗。
在身份驗證的過程中也使用了非對稱加密。SSH密鑰對用來向服務(wù)端驗證客戶端身份碘箍∽窆荩客戶端創(chuàng)建一對密鑰,然后將公鑰上傳到遠程服務(wù)器上丰榴,寫入文件~/.ssh/authorized_keys
货邓。
在創(chuàng)建共享密鑰后,客戶端必須向服務(wù)端證明身份四濒。服務(wù)端會使用文件中的公鑰加密一段信息换况,并將加密后的信息發(fā)送給客戶端。如果客戶端可以能夠破解這段信息盗蟆,那么就能夠證明自己擁有相關(guān)的私鑰戈二。之后服務(wù)端會為客戶端設(shè)置shell環(huán)境。
散列
散列是電腦科學中一種對資料的處理方法喳资,它通過某種特定的算法將要檢索的項與涌來檢索的索引關(guān)聯(lián)起來觉吭,生成一種便于搜索的數(shù)據(jù)結(jié)構(gòu)(散列表)。它也常用做一種資訊安全的方法仆邓,由一串資料中經(jīng)過散列算法計算出來的資料指紋鲜滩,來識別檔案和資料是否有被篡改。
SSH主要使用了散列消息認證碼(Keyed-hash message authentication code节值,縮寫為HMAC)徙硅,來確認消息沒有被篡改。
上面提到的對稱加密協(xié)商過程中搞疗,會使用消息認證碼(MAC)算法嗓蘑。這個算法會從客戶端支持的算法中選出。
在密鑰協(xié)商完成后,所有的消息都必須攜帶MAC桩皿,用于通信雙方驗證消息的一致性豌汇。MAC值由共享密鑰,消息的分組序列和實際消息內(nèi)容計算得到业簿。
在對稱加密區(qū)域之外瘤礁,MAC本身作為分組的最后部分被發(fā)送。研究者通常建議先機密數(shù)據(jù)梅尤,然后計算MAC
SSH工作流程
SSH協(xié)議采用客戶端-服務(wù)端模型對兩方進行身份驗證柜思,并對它們之間的數(shù)據(jù)進行加密。
服務(wù)端在指定端口監(jiān)聽連接請求巷燥。它負責協(xié)商安全連接赡盘,認證連接方,并為客戶端生成正確的shell環(huán)境缰揪。
客戶端負責協(xié)商安全連接陨享,驗證服務(wù)器的身份是否與以前記錄的信息相匹配,并提供憑證進行身份驗證钝腺。
SSH會話分為兩個階段抛姑。第一個是同意和建立加密來保護未來的溝通。第二個階段是對用戶進行身份驗證艳狐,并發(fā)現(xiàn)是否應(yīng)該授予對服務(wù)器的訪問權(quán)限定硝。
會話加密協(xié)商
當客戶端發(fā)起請求后,服務(wù)端返回支持的協(xié)議版本毫目。如果客戶端可以匹配其中一個協(xié)議版本蔬啡,則連接繼續(xù)。服務(wù)端會提供它的公共主機密鑰镀虐,客戶端可以用這個密鑰來驗證服務(wù)端是否合法箱蟆。
此時,通信雙方采用迪菲-赫爾曼算法來協(xié)商會話密鑰刮便。
該算法的大致過程如下:
- 雙方協(xié)定共享一個大素數(shù)空猜。
- 雙方協(xié)定一個加密算法。
- 雙方各自生成一個素數(shù)恨旱,并保密抄肖。這個素數(shù)將作為私鑰。
- 雙方使用協(xié)定的算法窖杀,由各自的私鑰和共享的素數(shù)計算得到公鑰。
- 雙方交換生成的公鑰裙士。
- 雙方使用各自的私鑰入客,另外一方的公鑰和共享的素數(shù),計算得到一個共享密鑰。雙方計算得到的共享密鑰應(yīng)該是一樣的桌硫。
- 使用共享密鑰加密后面的會話夭咬。
用于其余連接的共享密鑰加密被稱為二進制數(shù)據(jù)包協(xié)議。上述過程允許雙方平等地參與生成共享密鑰铆隘。
生成的密鑰是對稱密鑰卓舵,這意味著用于加密消息的密鑰也可以用于解密。其目的是將后面的通信包裝在不能被外部人員解密的加密隧道中膀钠。
在生成會話密鑰后掏湾,就開始進行用戶身份驗證。
驗證用戶身份
根據(jù)服務(wù)器接受的方式肿嘲,有幾種不同的方法可用于身份驗證融击。
最簡單的方法是密碼驗證,其中服務(wù)器要求客戶端輸入嘗試登陸賬號的密碼雳窟。密碼是通過協(xié)商加密發(fā)送的尊浪。
雖然密碼被加密,但由于密碼的復雜性受到限制封救,因此通常不建議使用此方法拇涤。與其他身份驗證的方法相比,自動腳本相對容易攻破正常長度的密碼誉结。
最為推薦的選擇是使用SSH密鑰對鹅士。SSH密鑰對是非對稱密鑰。
公鑰用于加密只能用私鑰解密的數(shù)據(jù)搓彻。公鑰可以自由共享如绸,因為沒有從公鑰中導出私鑰的方法。
驗證流程如下:
- 客戶端首先向服務(wù)端發(fā)送密鑰對的ID旭贬。
- 服務(wù)端檢查文件
authorized_keys
尋找該ID的公鑰怔接。 - 如果找到,服務(wù)端生成一個隨機數(shù)稀轨,并使用公鑰加密這個數(shù)扼脐。
- 服務(wù)端將加密后的信息發(fā)送給客戶端。
- 如果客戶端擁有對應(yīng)的私鑰奋刽,那么就能使用私鑰解密消息瓦侮,得到服務(wù)端生成的隨機數(shù)。
- 客戶端使用解密后的數(shù)和會話使用的共享密鑰得到一個值佣谐,然后計算這個值的MD5散列值肚吏。
- 客戶端將這個MD5散列值發(fā)送回服務(wù)端。
- 服務(wù)端用會話共享密鑰和生成的隨機值計算得到自己的MD5散列值狭魂。然后比較客戶端傳回的值和自身生成的值罚攀。如果匹配党觅,則證明客戶端擁有私鑰,客戶端驗證通過斋泄。
可以看到杯瞻,密鑰的不對稱性允許服務(wù)端使用公鑰加密消息給客戶端。然后炫掐,客戶端可以通過正確解密消息來證明它擁有私鑰魁莉。
后記
筆者本科專業(yè)是信息安全,不過畢業(yè)后并沒有從事安全行業(yè)募胃,工作4年課堂上學習的知識基本忘的差不多了旗唁。
而SSH算是工作中最常用到的東西之一,其工作原理涉及不少密碼學的東西摔认。
寫這篇博文逆皮,一是希望能幫助讀者了解SSH,二也是希望自己能撿起一些專業(yè)知識参袱。在互聯(lián)網(wǎng)/軟件相關(guān)行業(yè)里电谣,不論是否從事安全工作,了解這些東西都是很有必要的抹蚀。