Linux登陸方式之SSH

  • 2019 年 11 月 6 日
  • 筆記

SSH簡析

1什麼是SSH?

公司的伺服器登陸操作都是使用堡壘機+SSH的方式進行登陸的,今天準備配置一台機器的SSH訪問,所以看了看SSH相關的東西,這裡簡單總結下。

SSH是一種用於電腦之間加密登陸的網路協議,我們可以認為它是安全的,因為即使它的資訊在中途被截獲,密碼也不會泄露出去。現今使用最廣泛的是OpenSSH,它是SSH的一種商業實現。

2工作原理

基本用法:ssh user@host

其中,user代表用戶名,遠程主機是host,如果本地用戶名與遠程主機一致的話,可以直接省略user,而直接使用"ssh host"的方法來登陸遠程主機。

SSH的默認埠是22,如果想要更改埠,可以使用-p命令,比如我們採用的是20022埠,所以一般就可以寫為:

ssh -p 20022 user@host

SSH如何實現數據安全???

這是SSH最核心的部分,這裡我們詳細展開,SSH採用了對數據加密的方法來保證數據安全,通常的加密方式有兩種。一種是對稱加密,一種是非對稱加密,這裡簡單說明下:

對稱加密類似上圖中的描述,客戶端發起一個請求,然後通過密鑰加密,伺服器端接收到相關的密文,然後通過密鑰解密,最終得到用戶輸入的登陸資訊。這中加密方法的加密強度很高,只要用戶沒有泄露client端的密鑰,它就很難被破解。但是上面的加密方法也很明顯,一旦用戶泄露了client端的密鑰,因為加密的方法是對稱的,那麼整個系統的安全性就受到了威脅。為了解決這個問題,非對稱密鑰應運而生。

非對稱密鑰的方法可以簡單的表示如下圖所示:

登陸流程如下:

  1. 遠程Server收到Client端用戶yeyz的登錄請求,Server把自己的公鑰發給用戶。
  2. Client使用這個公鑰,將密碼進行加密。
  3. Client將加密的密碼發送給Server端。
  4. 遠程Server用自己的私鑰,解密登錄密碼,然後驗證其合法性
  5. 若驗證結果,給Client相應的響應。

上面加密方法的最大好處就是:私鑰是Server端獨有的,公鑰加密後的密文,只能通過其對應的私鑰進行解密。通過公鑰推理出私鑰的可能性微乎其微。這就保證了Client的登錄資訊即使在網路傳輸過程中被竊據,也沒有私鑰進行解密,保證了數據的安全性,這充分利用了非對稱加密的特性。

然而黑客們的方法總是很多,針對這種加密方式,黑客們研究了另外一套攻擊方法,這裡簡單演示一下:

通過攔截客戶端發來的登陸請求,然後反推送一個公鑰,然後讓客戶端誤以為連接到了伺服器,然後對數據進行加密,最後再通過黑客自己的私鑰解密,這樣就得到了用戶的登錄資訊,從而發送攻擊指令。這種攻擊方法,也稱之為"中間人攻擊"。

發生這種問題的根源在於,客戶端不知道伺服器的公鑰是什麼!

要解決這個問題,要解決這個問題,有兩個方法,分別介紹一下:

01

口令登錄

第一個很自然的方法就是告訴客戶端遠程伺服器的公鑰,現有的解決方案是:遠程主機必須在自己的網站上貼出公鑰指紋,以便用戶自行核對,或者自己甄別host地址是否正確。

因此,ssh在第一次連接的時候,通常會出現下面的提示資訊:

$ ssh user@host  The authenticity of host 'host (12.18.429.21)' can't be established.  RSA key fingerprint is :e:d7:e0:de:f:ac:::c2::d::::d.  Are you sure you want to continue connecting (yes/no)?  

上面的資訊說的是:無法確認主機host(12.18.429.21)的真實性,不過知道它的公鑰指紋,詢問你是否繼續連接?這裡提到了「公鑰指紋」的概念,所謂"公鑰指紋",是指公鑰長度較長(這裡採用RSA演算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再進行比較,就容易多了。 之所以用fingerprint代替key,主要是key過於長(RSA演算法生成的公鑰有1024位),很難直接比較。所以,對公鑰進行hash生成一個128位的指紋,這樣就方便比較了。

而一旦這個連接建立,意味著遠程主機的公鑰被接收,當遠程主機的公鑰被接受以後,它就會被保存在文件$HOME/.ssh/known_hosts之中。下次再連接這台主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。每個SSH用戶都有自己的known_hosts文件,此外系統也有一個這樣的文件,通常是/etc/ssh/ssh_known_hosts,保存一些對所有用戶都可信賴的遠程主機的公鑰。文件如下,這幾個文件稍後會進行相關解釋:

[dba_mysql ~/.ssh]$ll  total 128  -rw------- 1 dba_mysql dba_mysql    411 Aug 16  2017 authorized_keys  -rw------- 1 dba_mysql dba_mysql     11 Jun 28 11:18 config  -rw------- 1 dba_mysql dba_mysql   1671 Aug  9  2017 id_rsa  -rw-r----- 1 dba_mysql dba_mysql    411 Aug  9  2017 id_rsa.pub  -rw-r--r-- 1 dba_mysql dba_mysql 106790 Dec  3 15:49 known_hosts  

02

公鑰登陸

使用密碼登錄,每次都必須輸入密碼,非常麻煩。好在SSH提供了另外一種可以免去輸入密碼過程的登錄方式:公鑰登錄。

所謂"公鑰登錄",原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字元串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。為了更好的理解,這裡我們還是通過一張圖來表示:

如下:

公鑰認證流程: 1. Client端用戶yeyz將自己的公鑰存放在Server上,追加在文件authorized_keys中。 2. Server收到登錄請求後,隨機生成一個字元串str1,並發送給Client 3. Client用自己的私鑰對字元串str1進行加密。 4. 將加密後字元串發送給Server。 5. Server用之前存儲的公鑰進行解密,比較解密後的str2和str1。 6. 根據比較結果,返回客戶端登陸結果。

這裡再次給出上文提到的幾個文件:

[dba_mysql ~/.ssh]$ll  total 128  -rw------- 1 dba_mysql dba_mysql    411 Aug 16  2017 authorized_keys  -rw------- 1 dba_mysql dba_mysql     11 Jun 28 11:18 config  -rw------- 1 dba_mysql dba_mysql   1671 Aug  9  2017 id_rsa  -rw-r----- 1 dba_mysql dba_mysql    411 Aug  9  2017 id_rsa.pub  -rw-r--r-- 1 dba_mysql dba_mysql 106790 Dec  3 15:49 known_hosts  

最後來解釋解釋這幾個文件的意思:

authorized_keys

遠程主機將用戶的公鑰,保存在登錄後的用戶主目錄的$HOME/.ssh/authorized_keys文件中。

id_rsa.pub 公鑰

id_rsa私鑰

konw_host:

存儲 已經確保正常、可以安全連接的所有伺服器(hosts)的公鑰

config:

埠配置文件