SSH协议详解
轉(zhuǎn)發(fā)的http://blog.csdn.net/macrossdzh/article/details/5691924
很透徹啊,學(xué)習(xí)了
一、什么是SSH
SSH是英文Secure Shell的簡(jiǎn)寫形式。通過(guò)使用SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密,這樣"中間人"這種攻擊方式就不可能實(shí)現(xiàn)了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個(gè)額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過(guò)壓縮的,所以可以加快傳輸?shù)乃俣取SH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個(gè)安全的"通道"。
二、SSH 基本框架
SSH協(xié)議框架中最主要的部分是三個(gè)協(xié)議:
* 傳輸層協(xié)議(The Transport Layer Protocol)提供服務(wù)器認(rèn)證,數(shù)據(jù)機(jī)密性,信息完整性 等的支持;
* 用戶認(rèn)證協(xié)議(The User Authentication Protocol) 則為服務(wù)器提供客戶端的身份鑒別;
* 連接協(xié)議(The Connection Protocol) 將加密的信息隧道復(fù)用成若干個(gè)邏輯通道,提供給更高層的應(yīng)用協(xié)議使用; 各種高層應(yīng)用協(xié)議可以相對(duì)地獨(dú)立于SSH基本體系之外,并依靠這個(gè)基本框架,通過(guò)連接協(xié)議使用SSH的安全機(jī)制。
同時(shí)SSH協(xié)議框架中還為許多高層的網(wǎng)絡(luò)安全應(yīng)用協(xié)議提供擴(kuò)展的支持。它們之間的層次關(guān)系可以用如下圖來(lái)表示:
三、主機(jī)密鑰機(jī)制
對(duì)于SSH這樣以提供安全通訊為目標(biāo)的協(xié)議,其中必不可少的就是一套完備的密鑰機(jī)制。由于SSH協(xié)議是面向互聯(lián)網(wǎng)網(wǎng)絡(luò)中主機(jī)之間的互訪與信息交換,所以主機(jī)密鑰成為基本的密鑰機(jī)制。也就是說(shuō),SSH協(xié)議要求每一個(gè)使用本協(xié)議的主機(jī)都必須至少有一個(gè)自己的主機(jī)密鑰對(duì),服務(wù)方通過(guò)對(duì)客戶方主機(jī)密鑰的認(rèn)證之后,才能允許其連接請(qǐng)求。一個(gè)主機(jī)可以使用多個(gè)密鑰,針對(duì)不同的密鑰算法而擁有不同的密鑰,但是至少有一種是必備的,即通過(guò) DSS算法產(chǎn)生的密鑰。關(guān)于DSS算法,請(qǐng)參考[FIPS-186]。
SSH協(xié)議關(guān)于主機(jī)密鑰認(rèn)證的管理方案有兩種,如下圖所示:
每一個(gè)主機(jī)都必須有自己的主機(jī)密鑰,密鑰可以有多對(duì),每一對(duì)主機(jī)密鑰對(duì)包括公開密鑰和私有密鑰。在實(shí)際應(yīng)用過(guò)程中怎樣使用這些密鑰,并依賴它們來(lái)實(shí)現(xiàn)安全特性呢?如上圖所示,SSH協(xié)議框架中提出了兩種方案。
在第一種方案中,主機(jī)將自己的公用密鑰分發(fā)給相關(guān)的客戶機(jī),客戶機(jī)在訪問(wèn)主機(jī)時(shí)則使用該主機(jī)的公開密鑰來(lái)加密數(shù)據(jù),主機(jī)則使用自己的私有密鑰來(lái)解密數(shù)據(jù),從而實(shí)現(xiàn)主機(jī)密鑰認(rèn)證,確定客戶機(jī)的可靠身份。在圖2(a)中可以看到,用戶從主機(jī)A上發(fā)起操作,去訪問(wèn),主機(jī)B和主機(jī)C,此時(shí),A成為客戶機(jī),它必須事先配置主機(jī)B和主機(jī)C的公開密鑰,在訪問(wèn)的時(shí)候根據(jù)主機(jī)名來(lái)查找相應(yīng)的公開密鑰。對(duì)于被訪問(wèn)主機(jī)(也就是服務(wù)器端)來(lái)說(shuō)則只要保證安全地存儲(chǔ)自己的私有密鑰就可以了。
在 第二種方案中,存在一個(gè)密鑰認(rèn)證中心,所有系統(tǒng)中提供服務(wù)的主機(jī)都將自己的公開密鑰提交給認(rèn)證中心,而任何作為客戶機(jī)的主機(jī)則只要保存一份認(rèn)證中心的公開 密鑰就可以了。在這種模式下,客戶機(jī)在訪問(wèn)服務(wù)器主機(jī)之前,還必須向密鑰認(rèn)證中心請(qǐng)求認(rèn)證,認(rèn)證之后才能夠正確地連接到目的主機(jī)上。
很 顯然,第一種方式比較容易實(shí)現(xiàn),但是客戶機(jī)關(guān)于密鑰的維護(hù)卻是個(gè)麻煩事,因?yàn)槊看巫兏急仨氃诳蛻魴C(jī)上有所體現(xiàn);第二種方式比較完美地解決管理維護(hù)問(wèn)題, 然而這樣的模式對(duì)認(rèn)證中心的要求很高,在互聯(lián)網(wǎng)絡(luò)上要實(shí)現(xiàn)這樣的集中認(rèn)證,單單是權(quán)威機(jī)構(gòu)的確定就是個(gè)大麻煩,有誰(shuí)能夠什么都能說(shuō)了算呢?但是從長(zhǎng)遠(yuǎn)的發(fā) 展來(lái)看,在企業(yè)應(yīng)用和商業(yè)應(yīng)用領(lǐng)域,采用中心認(rèn)證的方案是必要的。
另外,SSH協(xié)議框架中還允許對(duì)主機(jī)密鑰的一個(gè)折中處理,那就是首次訪問(wèn)免認(rèn)證。首次訪問(wèn)免認(rèn)證是指,在某客戶機(jī)第一次訪問(wèn)主機(jī)時(shí),主機(jī)不檢查主機(jī)密鑰,而向該客戶都發(fā)放一個(gè)公開密鑰的拷貝,這樣在以后的訪問(wèn)中則必須使用該密鑰,否則會(huì)被認(rèn)為非法而拒絕其訪問(wèn)。
四、SSH 的工作過(guò)程
在整個(gè)通訊過(guò)程中,為實(shí)現(xiàn) SSH的安全連接,服務(wù)器端與客戶端要經(jīng)歷如下五個(gè)階段:
* 版本號(hào)協(xié)商階段,SSH目前包括 SSH1和SSH2兩個(gè)版本, 雙方通過(guò)版本協(xié)商確定使用的版本
* 密鑰和算法協(xié)商階段,SSH支持多種加密算法, 雙方根據(jù)本端和對(duì)端支持的算法,協(xié)商出最終使用的算法
* 認(rèn)證階段,SSH客戶端向服務(wù)器端發(fā)起認(rèn)證請(qǐng)求, 服務(wù)器端對(duì)客戶端進(jìn)行認(rèn)證
* 會(huì)話請(qǐng)求階段, 認(rèn)證通過(guò)后,客戶端向服務(wù)器端發(fā)送會(huì)話請(qǐng)求
* 交互會(huì)話階段 ,會(huì)話請(qǐng)求通過(guò)后,服務(wù)器端和客戶端進(jìn)行信息的交互
1 . 版本號(hào)協(xié)商階段
1. 服務(wù)器打開端口 22,等待客戶端連接。
2. 客戶端向服務(wù)器端發(fā)起 TCP初始連接請(qǐng)求,TCP連接建立后,服務(wù)器向客戶端發(fā)送第一個(gè)報(bào)文,包括版本標(biāo)志字符串,格式為“SSH-<主協(xié)議版本號(hào)>.<次協(xié)議版本號(hào)>-<軟件版本號(hào)>”,協(xié)議版本號(hào)由主版本號(hào)和次版本號(hào)組成,軟件版本號(hào)主要是為調(diào)試使用。
3. 客戶端收到報(bào)文后,解析該數(shù)據(jù)包,如果服務(wù)器端的協(xié)議版本號(hào)比自己的低,且客戶端能支持服務(wù)器端的低版本,就使用服務(wù)器端的低版本協(xié)議號(hào),否則使用自己的協(xié)議版本號(hào)。
4. 客戶端回應(yīng)服務(wù)器一個(gè)報(bào)文,包含了客戶端決定使用的協(xié)議版本號(hào)。服務(wù)器比較客戶端發(fā)來(lái)的版本號(hào),決定是否能同客戶端一起工作。
5. 如果協(xié)商成功,則進(jìn)入密鑰和算法協(xié)商階段,否則服務(wù)器端斷開 TCP連接。
Note: 版本號(hào)協(xié)商階段報(bào)文都是采用明文方式傳輸?shù)摹?/p>
2. 密鑰和算法協(xié)商階段
1. 服務(wù)器端和客戶端分別發(fā)送算法協(xié)商報(bào)文給對(duì)端,報(bào)文中包含自己支持的公鑰算法列表、加密算法列表、MAC(Message Authentication Code,消息驗(yàn)證碼)算法列表、壓縮算法列表等;
2. 服務(wù)器端和客戶端根據(jù)對(duì)端和本端支持的算法列表得出最終使用的算法。
3. 服務(wù)器端和客戶端利用 DH交換(Diffie-Hellman Exchange)算法、主機(jī)密鑰對(duì)等參數(shù),生成會(huì)話密鑰和會(huì)話 ID。
通過(guò)以上步驟,服務(wù)器端和客戶端就取得了相同的會(huì)話密鑰和會(huì)話ID。
* 對(duì)于后續(xù)傳輸?shù)臄?shù)據(jù),兩端都會(huì)使用會(huì)話密鑰進(jìn)行加密和解密,保證了數(shù)據(jù)傳送的安全
* 在認(rèn)證階段,兩端會(huì)使用會(huì)話 ID用于認(rèn)證過(guò)程。
Note:
在協(xié)商階段之前,服務(wù)器端已經(jīng)生成 RSA或 DSA密鑰對(duì),他們主要用于參與會(huì)話密鑰的生成。
3. 認(rèn)證階段
1. 客戶端向服務(wù)器端發(fā)送認(rèn)證請(qǐng)求,認(rèn)證請(qǐng)求中包含用戶名、認(rèn)證方法、與該認(rèn)證方法相關(guān)的內(nèi)容(如:password認(rèn)證時(shí),內(nèi)容為密碼)。
2. 服務(wù)器端對(duì)客戶端進(jìn)行認(rèn)證,如果認(rèn)證失敗,則向客戶端發(fā)送認(rèn)證失敗消息,其中包含可以再次認(rèn)證的方法列表。
3. 客戶端從認(rèn)證方法列表中選取一種認(rèn)證方法再次進(jìn)行認(rèn)證。
4. 該過(guò)程反復(fù)進(jìn)行, 直到認(rèn)證成功或者認(rèn)證次數(shù)達(dá)到上限, 服務(wù)器關(guān)閉連接為止。
SSH提供兩種認(rèn)證方式:
1. password認(rèn)證:客戶端向服務(wù)器發(fā)出 password認(rèn)證請(qǐng)求,將用戶名和密碼加密后發(fā)送給服務(wù)器;服務(wù)器將該信息解密后得到用戶名和密碼的明文,與設(shè)備上保存的用戶名和密碼進(jìn)行比較,并返回認(rèn)證成功或失敗的消息。
2. publickey 認(rèn)證:采用數(shù)字簽名的方法來(lái)認(rèn)證客戶端。目前,設(shè)備上可以利用RSA和 DSA兩種公共密鑰算法實(shí)現(xiàn)數(shù)字簽名。客戶端發(fā)送包含用戶名、公共密鑰和公共密鑰算法的 publickey 認(rèn)證請(qǐng)求給服務(wù)器端。服務(wù)器對(duì)公鑰進(jìn)行合法性檢查,如果不合法,則直接發(fā)送失敗消息;否則,服務(wù)器利用數(shù)字簽名對(duì)客戶端進(jìn)行認(rèn)證,并返回認(rèn)證成功或失敗的消息
SSH2.0還提供了 password-publickey 認(rèn)證和 any 認(rèn)證:
1. password-publickey 認(rèn)證:指定該用戶的認(rèn)證方式為 password 和 publickey認(rèn)證同時(shí)滿足。客戶端版本為 SSH1的用戶只要通過(guò)其中一種認(rèn)證即可登錄;客戶端版本為 SSH2的用戶必須兩種認(rèn)證都通過(guò)才能登錄。
2. any認(rèn)證:指定該用戶的認(rèn)證方式可以是 password,也可以是 publickey。
4.會(huì)話請(qǐng)求階段
1. 服務(wù)器等待客戶端的請(qǐng)求;
2. 認(rèn)證通過(guò)后,客戶端向服務(wù)器發(fā)送會(huì)話請(qǐng)求;
3. 服務(wù)器處理客戶端的請(qǐng)求。請(qǐng)求被成功處理后, 服務(wù)器會(huì)向客戶端回應(yīng) SSH_SMSG_SUCCESS包,SSH進(jìn)入交互會(huì)話階段;否則回應(yīng) SSH_SMSG_FAILURE包,表示服務(wù)器處理請(qǐng)求失敗或者不能識(shí)別請(qǐng)求。
5.交互會(huì)話階段
在這個(gè)模式下,數(shù)據(jù)被雙向傳送:
1. 客戶端將要執(zhí)行的命令加密后傳給服務(wù)器;
2. 服務(wù)器接收到報(bào)文,解密后執(zhí)行該命令,將執(zhí)行的結(jié)果加密發(fā)還給客戶端;
3. 客戶端將接收到的結(jié)果解密后顯示到終端上.
五、SSH的應(yīng)用
首先,SSH最常見的應(yīng)用就是,用它來(lái)取代傳統(tǒng)的Telnet、FTP等網(wǎng)絡(luò)應(yīng)用程序,通過(guò)SSH登錄到遠(yuǎn)方機(jī)器執(zhí)行你想進(jìn)行的工作與命令。在不安全的網(wǎng)路通訊環(huán)境中,它提供了很強(qiáng)的驗(yàn)證(authentication)機(jī)制與非常安全的通訊環(huán)境。實(shí)際上,SSH開發(fā)者的原意是設(shè)計(jì)它來(lái)取代原UNIX系統(tǒng)上的rcp、rlogin、rsh等指令程序的;但經(jīng)過(guò)適當(dāng)包裝后,發(fā)現(xiàn)它在功能上完全可以取代傳統(tǒng)的Telnet、FTP等應(yīng)用程序。
傳統(tǒng) BSD 風(fēng)格的 r 系列指令(如 rcp,rsh,rlogin)往往都被視為不安全的,很容易就被各種網(wǎng)絡(luò)攻擊手段所破解,幾乎所有找得到有關(guān)UNIX安全的書或文件,都會(huì)一而再、再而三地警告系統(tǒng)管理者,留心r系列指令的設(shè)定,甚至要求系統(tǒng)管理者將r系列指令通通關(guān)閉。
而用來(lái)替代r系列指令的SSH,則在安全方面做了極大的強(qiáng)化,不但對(duì)通訊內(nèi)容可以進(jìn)行極為安全的加密保護(hù),同時(shí)也強(qiáng)化了對(duì)身份驗(yàn)證的安全機(jī)制,它應(yīng)用了在密碼學(xué)(Cryptography)中已發(fā)展出來(lái)的數(shù)種安全加密機(jī)制,如 Symmetric Key Cryptography,Asymmetric Key Cryptography, One-way Hash Function,Random-number Generation等,來(lái)加強(qiáng)對(duì)于身份驗(yàn)證與通訊內(nèi)容的安全保護(hù)。通訊時(shí)資料的加密有IDEA,three-key triple DES,DES,RC4-128,TSS,Blowfish 等數(shù)種多種安全加密算法可供選擇,加密的key則是通過(guò) RSA 進(jìn)行交換的。資料的加密可以對(duì)抗IP spoofing,RSA這種非對(duì)稱性的加密機(jī)制則可用來(lái)對(duì)抗DNS spoofing與IP routing spoofing,同時(shí)RSA也可以進(jìn)行對(duì)主機(jī)身份的驗(yàn)證。
其次,通過(guò)使用用SSH可以在本地主機(jī)和遠(yuǎn)程服務(wù)器之間設(shè)置"加密通道",并且這樣設(shè)置的"加密通道"可以跟常見的Pop應(yīng)用程序、X應(yīng)用程序、Linuxconf應(yīng)用程序相結(jié)合,提供安全保障。
SSH的"加密通道"是通過(guò)"端口轉(zhuǎn)發(fā)"來(lái)實(shí)現(xiàn)的。你可以在本地端口(沒(méi)有用到的)和在遠(yuǎn)程服務(wù)器上運(yùn)行的某個(gè)服務(wù)的端口之間建立"加密通道"。然后只要連接到本地端口。所有對(duì)本地端口的請(qǐng)求都被SSH加密并且轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器的端口。當(dāng)然只有遠(yuǎn)程服務(wù)器上運(yùn)行SSH服務(wù)器軟件的時(shí)候"加密通道"才能工作。
六、SSH Q&A
Q1: SSH的版本和區(qū)別。
SSH2避免了RSA的專利問(wèn)題,并修補(bǔ)了CRC的缺陷。SSH2用數(shù)字簽名算法(DSA)和Diffie-Hellman(DH)算法代替RSA來(lái)完成對(duì)稱密鑰的交換,用HMAC來(lái)代替CRC。同時(shí)SSH2增加了AES和Twofish等對(duì)稱加密算法。
A1: SSH(Secure SHell)到目前為止有兩個(gè)不兼容的版本——SSH1和SSH2。SSH1又分為1.3和1.5兩個(gè)版本。SSH1采用DES、3DES、 Blowfish和RC4等對(duì)稱加密算法保護(hù)數(shù)據(jù)安全傳輸,而對(duì)稱加密算法的密鑰是通過(guò)非對(duì)稱加密算法(RSA)來(lái)完成交換的。SSH1使用循環(huán)冗余校驗(yàn)碼(CRC)來(lái)保證數(shù)據(jù)的完整性,但是后來(lái)發(fā)現(xiàn)這種方法有缺陷。
更多內(nèi)容請(qǐng)參考The SSHv1 Protocol & The SSHv2 Protocol
Q2: 什么是HMAC?
A2: HMAC(Hash Message Authentication Code) ,散列消息鑒別碼,基于密鑰的Hash算法的認(rèn)證協(xié)議。消息鑒別碼實(shí)現(xiàn)鑒別的原理是,用公開函數(shù)和密鑰產(chǎn)生一個(gè)固定長(zhǎng)度的值作為認(rèn)證標(biāo)識(shí),用這個(gè)標(biāo)識(shí)鑒別消息的完整性。使用一個(gè)密鑰生成一個(gè)固定大小的小數(shù)據(jù)塊,即MAC,并將其加入到消息中,然后傳輸。接收方利用與發(fā)送方共享的密鑰進(jìn)行鑒別認(rèn)證等。
Q3: 什么是X11 forwarding?
A3: sh的X11 forwarding特性可以使X client和X server安全地通訊。使用X11 forwarding后,從X client到X Server方向的數(shù)據(jù)先被送至ssh server,ssh server利用和ssh client的安全通道轉(zhuǎn)發(fā)給ssh client,再由ssh client轉(zhuǎn)發(fā)給X server,從X server到X client的數(shù)據(jù)流同理。這里ssh server和ssh client充當(dāng)了X client和X server間數(shù)據(jù)的轉(zhuǎn)發(fā)器,由于ssh server和X client、ssh client和X server一般在同一臺(tái)機(jī)器上,它們之間是一種安全的進(jìn)程間通訊,而ssh server和ssh client間的通訊也是安全的,所以X client和X server間的通訊就是安全的。
Q4: 什么是TTY?
A4: 終端是一種字符型設(shè)備,它有多種類型,通常使用tty來(lái)簡(jiǎn)稱各種類型的終端設(shè)備。tty是 Teletype的縮寫。Teletype是最早出現(xiàn)的一種終端設(shè)備,很象電傳打字機(jī),是由Teletype公司生產(chǎn)的。設(shè)備名放在特殊文件目錄/dev/下。
Q5: 簡(jiǎn)單描述下SSH運(yùn)行的過(guò)程?
A5:簡(jiǎn)要過(guò)程如下:
* Client端向Server端發(fā)起SSH連接請(qǐng)求。
* Server端向Client端發(fā)起版本協(xié)商。
* 協(xié)商結(jié)束后Server端發(fā)送Host Key公鑰 Server Key公鑰,隨機(jī)數(shù)等信息。到這里所有通信是不加密的。
* Client端返回確認(rèn)信息,同時(shí)附帶用公鑰加密過(guò)的一個(gè)隨機(jī)數(shù),用于雙方計(jì)算Session Key。
* 進(jìn)入認(rèn)證階段。從此以后所有通信均加密。
* 認(rèn)證成功后,進(jìn)入交互階段。
總結(jié)
- 上一篇: 智能机器人建房子后房价走势_明后年日照房
- 下一篇: MSF制作免杀木马