SSH的英文全稱為Secure Shell,是IETF(Internet Engineering Task Force)的Network Working Group所制定的一族協議,其目的是要在非安全網路上提供安全的遠程登入和其他安全網路服務。 我們可以簡單理解為:Rlogin和Telnet等的替代方案。SSH的使用情境如所示,具體請參考下文SSH的架構。
SSH 基本架構
SSH協議架構中最主要的部分是三個協議:
- 使用者認證協議
- 連線協定
同時SSH協議架構中還為許多高層的網路安全應用協議提供擴充的支援。它們之間的層次關係可以用如來表示:
- 傳輸層協議(The Transport Layer Protocol)提供伺服器認證,資料機密性,資訊完整性 等的支援;
- 使用者認證協議(The User Authentication Protocol) 則為伺服器提供用戶端的身份鑒別;
- 連線協定(The Connection Protocol) 將加密的資訊隧道複用成若干個邏輯通道,提供給更高層的應用協議使用; 各種高層應用協議可以相對地獨立於SSH基本體系之外,並依靠這個基本架構,通過連線協定使用SSH的安全機制。
SSH安全驗證層級
- 第一種層級(基於口令的安全驗證),只要你知道自己帳號和口令,就可以登入到遠程主機。所有傳輸的資料都會被加密,但是不能保證你正在已連線的服務器就是你想已連線的服務器。可能會有別的伺服器在冒充真正的伺服器,也就是受到“中間人”這種方式的攻擊。
- 第二種層級(基於密匙的安全驗證)需要依靠密匙
- 先為自己建立一對密匙,並把公匙放在需要訪問的伺服器上;
- 用戶端軟體會向伺服器發出請求,請求用你的密匙進行安全驗證;
- 伺服器收到請求之後,在該伺服器目錄下尋找公匙,然後把它和你發送過來的公匙進行比較。若兩密匙一致,伺服器就用公匙加密“質詢”(challenge)並把它發送給用戶端軟體;
- 用戶端軟體收到“質詢”之後就可以用 私密 解密再把它發送給伺服器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種層級相比,第二種層級不需要在網路上傳送口令,它不僅加密所有傳送的資料,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登入的過程可能需要10秒。
SSH 的工作過程
在整個通訊過程中,為實現 SSH的安全連線,伺服器端與用戶端要經曆如下五個階段:
- 版本號碼協商階段,SSH目前包括 SSH1和SSH2兩個版本, 雙方通過版本協商確定使用的版本
- 密鑰和演算法協商階段,SSH支援多種密碼編譯演算法, 雙方根據本端和對端支援的演算法,協商出最終使用的演算法
- 認證階段,SSH用戶端向伺服器端發起認證請求, 伺服器端對用戶端進行認證
- 會話請求階段, 認證通過後,用戶端向伺服器端發送會話請求
- 互動會話階段 ,會話請求通過後,伺服器端和用戶端進行資訊的互動
1 . 版本號碼協商階段
- 伺服器開啟連接埠 22,等待用戶端串連。
- 用戶端向伺服器端發起 TCP初始串連請求,TCP串連建立後,伺服器向用戶端發送第一個報文,包括版本標誌字串,格式為“SSH-<主協議版本號碼>.<次協議版本號碼>-<軟體版本號碼>”,協議版本號碼由主要版本號和次版本號碼組成,軟體版本號碼主要是為調試使用。
- 用戶端收到報文後,解析該資料包,如果伺服器端的協議版本號碼比自己的低,且用戶端能支援伺服器端的低版本,就使用伺服器端的低版本協議號,否則使用自己的協議版本號碼。
- 用戶端回應伺服器一個報文,包含了用戶端決定使用的協議版本號碼。伺服器比較用戶端發來的版本號碼,決定是否能同用戶端一起工作。
- 如果協商成功,則進入密鑰和演算法協商階段,否則伺服器端斷開 TCP串連。
Note:
版本號碼協商階段報文都是採用明文方式傳輸的。
2. 密鑰和演算法協商階段
- 伺服器端和用戶端分別發送演算法協商報文給對端,報文中包含自己支援的公開金鑰演算法列表、密碼編譯演算法列表、MAC(Message Authentication Code,訊息驗證碼)演算法列表、壓縮演算法列表等;
- 伺服器端和用戶端根據對端和本端支援的演算法列表得出最終使用的演算法。
- 伺服器端和用戶端利用 DH交換(Diffie-Hellman Exchange)演算法、主機金鑰組等參數,產生工作階段金鑰和會話 ID。
通過以上步驟,伺服器端和用戶端就取得了相同的會話密鑰和會話ID。
- 對於後續傳輸的資料,兩端都會使用會話密鑰進行加密和解密,保證了資料傳送的安全
- 在認證階段,兩端會使用會話 ID用於認證過程。
Note: 在協商階段之前,伺服器端已經產生 RSA或 DSA金鑰組,他們主要用於參與工作階段金鑰的產生。
3. 認證階段
- 用戶端向伺服器端發送認證請求,認證請求中包含使用者名稱、認證方法、與該認證方法相關的內容(如:password認證時,內容為密碼)。
- 伺服器端對用戶端進行認證,如果認證失敗,則向用戶端發送認證失敗訊息,其中包含可以再次認證的方法列表。
- 用戶端從認證方法列表中選取一種認證方法再次進行認證。
- 該過程反覆進行, 直到認證成功或者認證次數達到上限, 伺服器關閉串連為止。
SSH提供兩種認證方式:
- password認證:用戶端向伺服器發出 password認證請求,將使用者名稱和密碼加密後發送給伺服器;伺服器將該資訊解密後得到使用者名稱和密碼的明文,與裝置上儲存的使用者名稱和密碼進行比較,並返回認證成功或失敗的訊息。
- publickey 認證:採用數位簽章的方法來認證用戶端。目前,裝置上可以利用RSA和 DSA兩種公用密鑰演算法實現數位簽章。用戶端發送包含使用者名稱、公用密鑰和公用密鑰演算法的 publickey 認證請求給伺服器端。伺服器對公開金鑰進行合法性檢查,如果不合法,則直接發送失敗訊息;否則,伺服器利用數位簽章對用戶端進行認證,並返回認證成功或失敗的訊息
SSH2.0還提供了 password-publickey 認證和 any 認證:
- password-publickey 認證:指定該使用者的認證方式為 password 和 publickey認證同時滿足。用戶端版本為 SSH1的使用者只要通過其中一種認證即可登入;用戶端版本為 SSH2的使用者必須兩種認證都通過才能登入。
- any認證:指定該使用者的認證方式可以是 password,也可以是 publickey。
4.會話要求階段
- 伺服器等待用戶端的請求;
- 認證通過後,用戶端向伺服器發送會話請求;
- 伺服器處理用戶端的請求。請求被成功處理後, 伺服器會向用戶端回應 SSH_SMSG_SUCCESS包,SSH進入互動會話階段;否則回應 SSH_SMSG_FAILURE包,表示伺服器處理請求失敗或者不能識別請求。
5.互動會話階段
在這個模式下,資料被雙向傳送:
- 用戶端將要執行的命令加密後傳給伺服器;
- 伺服器接收到報文,解密後執行該命令,將執行的結果加密發還給用戶端;
- 用戶端將接收到的結果解密後顯示到終端上.
6.SSH Q & A
Q1: SSH的版本和區別。
SSH2避免了RSA的專利問題,並修補了CRC的缺陷。SSH2用數位簽章演算法(DSA)和Diffie-Hellman(DH)演算法代替RSA來完成對稱金鑰的交換,用HMAC來代替CRC。同時SSH2增加了AES和Twofish等對稱式加密演算法。
A1: SSH(Secure SHell)到目前為止有兩個不相容的版本——SSH1和SSH2。SSH1又分為1.3和1.5兩個版本。SSH1採用DES、3DES、Blowfish和RC4等對稱式加密演算法保護資料安全傳輸,而對稱式加密演算法的密鑰是通過非對稱式加密演算法(RSA)來完成交換的。SSH1使用迴圈冗餘校正碼(CRC)來保證資料的完整性,但是後來發現這種方法有缺陷。
更多內容請參考The SSHv1 Protocol & The SSHv2 Protocol
Q2: 什麼是HMAC?
A2: HMAC(Hash Message Authentication Code) ,散列訊息鑒別碼,基於密鑰的Hash演算法的認證協議。訊息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別訊息的完整性。使用一個密鑰產生一個固定大小的小資料區塊,即MAC,並將其加入到訊息中,然後傳輸。接收方利用與發送方共用的密鑰進行鑒別認證等。
Q3: 什麼是X11 forwarding?
A3: sh的X11 forwarding特性可以使X client和X server安全地通訊。使用X11 forwarding後,從X client到X Server方向的資料先被送至ssh server,ssh server利用和ssh client的安全通道轉寄給ssh client,再由ssh client轉寄給X server,從X server到X client的資料流同理。這裡ssh server和ssh client充當了X client和X server間資料的轉寄站,由於ssh server和X client、ssh client和X server一般在同一台機器上,它們之間是一種安全的進程間通訊,而ssh server和ssh client間的通訊也是安全的,所以X client和X server間的通訊就是安全的。
Q4: 什麼是TTY?
A4: 終端是一種字元型裝置,它有多種類型,通常使用tty來簡稱各種類型的終端裝置。tty是 Teletype的縮寫。Teletype是最早出現的一種終端裝置,很象電傳打字機,是由Teletype公司生產的。裝置名稱放在特殊檔案目錄/dev/下。
Q5: 簡單描述下SSH啟動並執行過程?
A5:簡要過程如下:
- Client端向Server端發起SSH串連請求。
- Server端向Client端發起版本協商。
- 協商結束後Server端發送Host Key公開金鑰 Server Key公開金鑰,隨機數等資訊。到這裡所有通訊是不加密的。
- Client端返回確認資訊,同時附帶用公開金鑰加密過的一個隨機數,用於雙方計算Session Key。
- 進入認證階段。從此以後所有通訊均加密。
- 認證成功後,進入互動階段。