ssh登陸過程分析和openssh的編譯、使用方法

ssh是安全的shell程序
 
【認證原理】
有2種認證方式
(一)
基於賬號和口令的驗證方式
(二)
基於公鑰和私鑰的驗證方式

ssh的登錄過程分爲5個階段
1、版本號協商階段
2、密鑰和算法協商階段
3、認證階段
4、會話請求階段
5、會話交互階段
《1》版本號協商階段
服務端打開端口22,等待客戶連接。
客戶端向服務端發起TCP連接,連接建立後,服務端向客戶端發送第一個報文,包括版本標誌字符串,格式爲“協議版本號 次協議版本號 軟件版本號”。
客戶端收到報文後,解析協議版本號,如果服務端的協議版本號比自己的低,且客戶端能支持服務端的低版本,就使用服務端的協議號,否則使用自己的協議版本號。
客戶端回覆服務端一個報文,包含了客戶端決定使用的協議版本號。
服務端比較客戶端發過來的版本號,決定是否能同客戶端交互。
如果協商成功,就進入密鑰和算法協商階段。否則服務端斷開TCP連接。

《2》密鑰和算法協商階段
服務端和客戶端分別發送算法協商報文給對方,報文中包含自己支持的公鑰算法列表、加密算法列表、消息驗證碼算法列表、壓縮算法列表等。
服務端和客戶端根據對方和自己支持的算法得出最終使用的算法。
服務端和客戶端利用DH交換算法、主機密鑰對等參數,生成會話密鑰和會話ID。
c公 客戶端公鑰
c密 客戶端密鑰
s公 服務端公鑰
s密 服務端密鑰
在版本號協商階段完成後:
服務端將 s公 發送給客戶端。
服務端生成會話ID ,設爲 id ,發送給客戶端。
客戶端生成會話密鑰,設爲 key ,並計算 res = id 異或 key。
客戶端將 res 用 s公 進行加密,將結果發送給服務端。
服務端用 s密 進行解密,得到 res。
服務器計算 res 異或 id,得到 key。
至此服務端和客戶端都知道了會話密鑰和會話ID,以後的數據傳輸都使用會話密鑰進行加密和解密。

《3》認證階段
基於賬號和口令的驗證方式:
客戶端使用密鑰和算法協商階段生成的會話密鑰加密賬號、認證方法、口令,將結果發送給服務器。
服務端使用獲得的會話密鑰解密報文,得到賬號和口令。
服務端對這個賬號和口令進行判斷,如果失敗,向客戶端發送認證失敗報文,其中包含了可以再次認證的方法列表。
客戶端從認證方法列表中選擇一種方法進行再次認證。
這個過程反覆進行,直到認證成功或者認證次數達到上限,服務端關閉本次TCP連接。
基於公鑰和私鑰的驗證方式:
使用ssh-keygen程序生成公鑰 id_dsa.pub 和私鑰 id_dsa,一般是在客戶端上生成,然後把 id_dsa.pub 通過某種方式發送給服務端。
服務端放在將要遠程登錄過來的那個賬號的目錄的.ssh目錄下面。
客戶端使用密鑰和算法協商階段生成的會話密鑰加密賬號、認證方法、id_dsa.pub,將結果發送給服務端。
服務端使用會話密鑰解密報文,得到賬號、id_dsa.pub。
服務端在這個賬號的目錄的.ssh目錄下找對應的公鑰,如果沒有找到,發送失敗消息給客戶端,如果找到,比較客戶發送過來的這個公鑰和找到的公鑰,如果內容相同,服務端生成一個隨機的字符串,簡稱“質詢”,然後使用找到的公鑰加密這個質詢,然後使用會話密鑰再次加密。
服務端把這個雙重加密的數據發送給客戶端。
客戶端使用會話密鑰解密報文,然後使用id_dsa再次解密數據,得到質詢。
客戶端使用會話密鑰加密質詢,發送給服務端。
服務端使用會話密鑰解密報文,得到質詢,判斷是不是自己生成的那個質詢,如果不相同,發送失敗消息給客戶端,如果相同,認證通過。
 
【編譯步驟】

openssh是一個開源的SSH程序,包括服務端和客戶端
下載地址:http://www.openssh.com/
openssh依賴openssl
下載地址:http://www.openssl.org/
首先編譯、安裝openssl
tar -zxvf openssl-1.0.0d.tar.gz
mkdir /usr/local/openssl-1.0.0d
cd openssl-1.0.0d
./configure --prefix=/usr/local/openssl-1.0.0d
make
make install
然後編譯、安裝openssh
tar -zxvf openssh-2.1.1p4.tar.gz
mkdir /usr/local/openssh-2.1.1p4
./configure --prefix=/usr/local/openssh-2.1.1p4 --with-ssl-dir=/usr/local/openssl-1.0.0d --with-ldflags=-lcrypt
make的時候會報錯:
“sshconnect1.c MD5_CTX 類型沒有定義,MD5Init MD5Update MD5Final 找不到定義”
這個時候需要下載md5.h md5.c 源文件,要求源代碼中有上面的MD5_CTX類型的定義和上面3個函數的實現,然後放在 sshconnect1.c相同目錄下
修改sshconnect1.c ,增加 #include "md5.h",修改Makefile
在 SSHOBJS= ssh.o sshconnect.o sshconnect1.o 這行後面增加 md5.o
make
make install
最後,在/usr/local/openssh-2.1.1p4目錄下就是生成的可執行文件
bin/ etc/ man/ sbin/
服務端是 sshd,客戶端是 ssh ,密鑰生成程序是 ssh-keygen
 
 
【使用方法】
基於賬號和口令的驗證方式:
sshd服務端開啓後,執行客戶端 ./ssh 賬號@服務端IP地址
會提示輸入密碼,直接輸入就可以登錄成功
基於公鑰和私鑰的驗證方式:
《RSA SSH1》
使用ssh-keygen生成RSA密鑰對, 命令行爲 ./ssh-keygen
然後會在本賬號的目錄下創建 .ssh 目錄,然後生成 identity 和 identity.pub,將identity.pub放到服務端的將要登錄的那個賬號的 .ssh目錄下,如果沒有.ssh目錄,手動創建它,再創建一個名稱爲authorized_keys文件,將identity.pub的內容追加到 authorized_keys文件後面。
cat >> authorized_keys < identity.pub
實際上sshd程序是從authorized_keys文件中遍歷所有的公鑰,直到找到一個匹配的公鑰爲止。
注意修改賬號的目錄的權限爲 755,否則會導致客戶端認證不成功。
客戶端命令行爲 ./ssh -i /root/.ssh/identity 賬號@服務端IP地址
《DSA SSH2》
用法同RSA SSH1相同,不同之處在:
1、ssh-keygen 加上 -d 參數 生成 id_dsa 和 id_dsa.pub 密鑰對
2、服務端在.ssh目錄下創建一個authorized_keys2文件,將id_dsa.pub內容追加進去
3、客戶端執行命令行爲: ./ssh -2 -i /root/.ssh/id_dsa 賬號@服務端IP地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章