[SSH服務]——SSH詳解、常用的遠端連線工具

Jelly_lyj發表於2017-03-18

在總結ssh原理前,我先做了一個ssh過程的實驗

首先我搭建了這樣一個實驗環境:

(1) SSH Server:10.0.10.198

(2) SSH Client:10.0.10.158

在Server端 10.0.10.198,我執行了如下操作:

(1)清空了伺服器端提供的公鑰與自己的金鑰:

[root@localhost ssh]# rm /etc/ssh/ssh_host*
rm:是否刪除普通檔案 "/etc/ssh/ssh_host_dsa_key"?y
rm:是否刪除普通檔案 "/etc/ssh/ssh_host_dsa_key.pub"?y
rm:是否刪除普通檔案 "/etc/ssh/ssh_host_key"?y
rm:是否刪除普通檔案 "/etc/ssh/ssh_host_key.pub"?y
rm:是否刪除普通檔案 "/etc/ssh/ssh_host_rsa_key"?y
rm:是否刪除普通檔案 "/etc/ssh/ssh_host_rsa_key.pub"?y

 (2)重啟了SSH服務之後,它會重新生成這些的公鑰和金鑰:

[root@localhost ssh]# service sshd restart
停止 sshd:                                                [確定]
生成 SSH1 RSA 主機鍵:                                      [確定]
生成 SSH2 RSA 主機鍵:                                      [確定]
正在生成 SSH2 DSA 主機鍵:                                  [確定]
正在啟動 sshd:                                            [確定]
[root@localhost ssh]# date; ll /etc/ssh/ssh_host*
2016年 06月 23日 星期四 11:58:38 CST
-rw------- 1 root root  668 6月  23 11:58 /etc/ssh/ssh_host_dsa_key
-rw-r--r-- 1 root root  590 6月  23 11:58 /etc/ssh/ssh_host_dsa_key.pub
-rw------- 1 root root  963 6月  23 11:58 /etc/ssh/ssh_host_key
-rw-r--r-- 1 root root  627 6月  23 11:58 /etc/ssh/ssh_host_key.pub
-rw------- 1 root root 1671 6月  23 11:58 /etc/ssh/ssh_host_rsa_key
-rw-r--r-- 1 root root  382 6月  23 11:58 /etc/ssh/ssh_host_rsa_key.pub

 (3)並且,我清空了伺服器root使用者下的/root/.ssh/known_hosts:

[root@localhost .ssh]# pwd
/root/.ssh
[root@localhost .ssh]# cat known_hosts   ##已經清空了這個檔案

 

在Client端 10.0.10.158,我執行了如下操作:

(1)同樣清空了客戶端機子上root使用者下的/root/.ssh/known_hosts:

[root@lyj1 .ssh]# pwd
/root/.ssh
[root@lyj1 .ssh]# cat known_hosts 

 (2)然後嘗試著遠端登入(以root)登入到Server 10.0.10.198。

     此時Server接收到了Client的這個請求後,會把自己的公鑰傳送給客戶端。

     客戶端記錄這個伺服器公鑰的檔案就是 ~/.ssh/known_hosts。

     因為這是這臺Client第一次連線這個Server,所以會詢問你,是否要接收這個伺服器發給你的這個伺服器公鑰呢?

[root@lyj1 .ssh]# ssh  root@10.0.10.198
The authenticity of host '10.0.10.198 (10.0.10.198)' can't be established.
RSA key fingerprint is b3:bb:53:c0:3c:6a:f6:08:8b:a1:e3:b1:70:2b:7b:2a.
Are you sure you want to continue connecting (yes/no)?

 (3)選擇yes,則提示你輸入密碼(我們想要以root使用者登入進Server,所以應輸入正確的Server的root使用者密碼)

Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.10.198' (RSA) to the list of known hosts.
root@10.0.10.198's password:                            #輸入正確密碼後
Last login: Thu Jun 23 12:00:49 2016 from 10.0.10.198   #登入成功

  (4)然後我們回到Client端,看一下~/.ssh/known_hosts下的內容

[root@localhost ~]# exit
logout
Connection to 10.0.10.198 closed.
[root@lyj1 .ssh]# cat known_hosts  #是的這就是伺服器傳給客戶端的那個公鑰
10.0.10.198 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA8RC2xIKGNKJwcHbEyTD7nRr0FE7yTfTxc3fgDMBE8ZHEv9ojSxKDuXP1w5tPF5UxCGKx0B5TmozKpRU+nqGLtL1p7n3PC1RxjXxov5/yElIrdPzRMhynrYsQJTp3M9WdojzWmZgoLJ+rvcfR1makDujhhkR/zz0MQltDT3NFCG73pgM+vTk7Z9vlohZIwmRNmth/OQvWA7MHya4WjkghcbLSYazFXmbatEBdF+1hUvQxUdWW4MqAv7cOZ96Zb7KQecmotbCbB/Nnas9tAmd55NpZ25TmtGaCR/ThUmfysjoDfBf40st9YZGJXDhgawSx0xn5as8mXpELr18h7ydPEQ==

 (5)當Client再次請求遠端登入到Server,因為~/.ssh/known_hosts已經記錄過該Server的公鑰了,一比對發現發現也沒有差異,就可以直接輸密碼了。

[root@lyj1 .ssh]# ssh 10.0.10.198
root@10.0.10.198's password: 
Last login: Thu Jun 23 11:49:12 2016 from 10.0.10.158

 (6)當然,如果Server端重新生成了新的公鑰和私鑰,一比對發現和我們原來記錄的有差異,會出現如下提示:

[root@lyj1 .ssh]# ssh root@10.0.10.198
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
c3:13:f9:67:33:e3:4d:75:77:11:db:4d:44:c3:3e:5d.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1    ##這是告訴你:這一行的記錄(原來那個公鑰)跟這一次接收到的公鑰不一樣
RSA host key for 10.0.10.198 has changed and you have requested strict checking.
Host key verification failed.

 (7)解決這個問題很簡單,只要把~/.ssh/known_hosts的那一行刪掉,重新ssh即可

[root@lyj1 .ssh]# sed -i '1d' known_hosts 
[root@lyj1 .ssh]# ssh root@10.0.10.198
The authenticity of host '10.0.10.198 (10.0.10.198)' can't be established.
RSA key fingerprint is c3:13:f9:67:33:e3:4d:75:77:11:db:4d:44:c3:3e:5d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.10.198' (RSA) to the list of known hosts.
root@10.0.10.198's password: 
Last login: Thu Jun 23 15:25:07 2016 from 10.0.10.158

 

回到Server 10.0.10.198端看看:

 (1)看看這個它的~/.ssh/known_hosts檔案:

[root@localhost .ssh]# cat known_hosts #沒有東西
[root@localhost .ssh]# 

 (按原理來說,Client也會把自己的公鑰傳送給Server,不過我不知道Server究竟將它記錄在了哪個檔案裡)

 


 總結一下SSH的工作原理

一. SSH服務簡介
       ssh為Secure Shell的縮寫,由IETF的網路工作開發的,SSH建立在應用層和傳輸層的安全協議上.
       ssh為系統安全和使用者提供了有力的安全保障

二. SSH認證原理
    (1)ssh連結的驗證、加密方式:
        ssh連結CS模型(客戶端-服務端),客戶端發起連結,服務端對客戶端進行驗證,再考慮是否要連結
    (2) 加密體系:
         一種公鑰加密:對稱的密碼加密體系
         一種私鑰加密: 非對稱密碼加密體系 

三. SSH工作過程
1) 伺服器建立自己的公鑰檔案、計算自己的私鑰檔案

  • 每啟動一次SSH服務,服務會去找 /etc/ssh/ssh_host*
  • 這些檔案記錄的就是伺服器自己的公鑰和私鑰
  • 如果刪除掉這些檔案,重啟SSH服務時,它會重新計算公鑰金鑰(即重新生成這些檔案)
# ll /etc/ssh/ssh_host*
-rw------- 1 root root  672 6月  23 15:25 /etc/ssh/ssh_host_dsa_key
-rw-r--r-- 1 root root  590 6月  23 15:25 /etc/ssh/ssh_host_dsa_key.pub
-rw------- 1 root root  963 6月  23 15:25 /etc/ssh/ssh_host_key
-rw-r--r-- 1 root root  627 6月  23 15:25 /etc/ssh/ssh_host_key.pub
-rw------- 1 root root 1675 6月  23 15:25 /etc/ssh/ssh_host_rsa_key
-rw-r--r-- 1 root root  382 6月  23 15:25 /etc/ssh/ssh_host_rsa_key.pub
# service sshd restart
停止 sshd:                                                [確定]
生成 SSH1 RSA 主機鍵:                                      [確定]
生成 SSH2 RSA 主機鍵:                                      [確定]
正在生成 SSH2 DSA 主機鍵:                                   [確定]
正在啟動 sshd:                                             [確定]

 

2) 客戶端主動請求建立連線,伺服器會將自己的公鑰傳送給客戶端:

  • 公鑰的傳送是明碼傳送(本來公鑰就是要給大家用的)
  • 客戶端的~/.ssh/known_hosts檔案記錄著這些伺服器公鑰,每次連線時會將伺服器傳送過來的公鑰和這個檔案的內容比對一下
  • 如果檔案中沒有相關記錄,則提示問你要不要接收伺服器傳送給你的這個公鑰,接收後記錄在檔案中
  • 如果檔案中有過相關記錄,則比對一下這次傳送的公鑰是否和檔案中記錄的那條公鑰相同。

 

3) 客戶端接收好伺服器公鑰後,開始隨機計算客戶端自己的公鑰和私鑰:

 

4) 客戶端將自己的公鑰傳送給伺服器:

    (我想知道伺服器存放這個客戶端公鑰的檔案是哪個,知道的盆友可以交流一下)

 

5) 伺服器接收到了客戶端傳給它的公鑰後,表示伺服器"信任"了這個客戶端:

 

6) 既然信任了,那麼伺服器就允許客戶端遠端連線自己了(當然啦還要把使用者登入密碼輸對):

 

7) 我們要知道,在這些過程之後,Server端和Client端都有了些什麼?

                     

 

四. SSH無密碼登入原理

      從SSH的工作過程其實我們可以理解出SSH無密碼登入的原理。

      當A要SSH到B,A要把A的公鑰給B,B才會信任A,進而讓A來遠端自己。

      所以要實現A無密碼登入到B,A得把產生的公鑰給B,得到B的信任,才可實現無密碼登入。

      可檢視我的SSH無密碼登入實驗(http://www.cnblogs.com/snsdzjlz320/p/5612389.html)

 

 

 


常用的遠端連線工具:Xshell、SecureCRT、Putty、vncviewer

 

 

 

 

 

 

 

相關文章