天天看點

ssh登入原了解析

1.什麼是ssh?

簡單說,SSH是一種網絡協定,用于計算機之間的加密登入。如果一個使用者從本地計算機,使用SSH協定登入另一台遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。

一、ssh 密碼登入

  • 1.ssh 密碼登入原理圖:
    ssh登入原了解析

原了解析:

從上圖中,可以看到我們使用SSH進行登陸時,主要分為以下幾步:

  • 使用者使用ssh [email protected]指令對遠端主機發起登陸請求;
  • 遠端主機将自己的公鑰傳回給請求主機;
  • 請求主機使用公鑰對使用者輸入的密碼進行加密;
  • 請求主機将加密後的密碼發送給遠端主機;
  • 遠端主機使用私鑰對密碼進行解密;
  • 最後,遠端主機判斷解密後的密碼是否與使用者密碼一緻,一緻同意登陸,否則反之。

注意:

這一過程存在漏洞風險。由于SSH不像https協定那樣,SSH協定的公鑰是沒有證書中心(CA)公證的,也就是說,都是自己簽發的。這就導緻如果有人截獲了登陸請求,然後冒充遠端主機,将僞造的公鑰發給使用者,那麼使用者很難辨識真僞,使用者再通過僞造的公鑰加密密碼,再發送給冒充主機,此時冒充的主機就可以擷取使用者的登陸密碼了,那麼SSH的安全機制就蕩然無存了,這也就是我們常說的中間人攻擊。

known_hosts檔案的作用

既然存在這種問題,SSH就想了一個辦法來繞開這個問題,也就是.sknown_hosts檔案的作用。

  • 我們在使用SSH登陸遠端主機的時候,有時會看到這樣的提示:
    • ssh [email protected]

      ssh登入原了解析
    • ‘yes’ 提示輸入密碼
      ssh登入原了解析
The authenticity of host '49.234.102.232 (49.234.102.232)' can't be established.
ECDSA key fingerprint is SHA256:IJb73Cd9Gy/mr3p8uNWD5gJScTfsN8uQPMrwweTGTXY.
Are you sure you want to continue connecting (yes/no)?
           
  • 上面這段話的意思是,無法确認49.234.102.232主機的真實性,隻知道它的公鑰指紋,問你還想繼續連接配接嗎?這樣我們就可以看到,SSH是将這個問題抛給了SSH使用者,讓SSH使用者自己來确定是否相信遠端主機。但是這樣對于使用者來說,就存在一個難題,使用者怎麼知道遠端主機的公鑰指紋是多少;這的确是一個問題,此時就需要遠端主機必須公開自己的公鑰指紋,以便使用者自行核對。
  • 在經過使用者的風險衡量以後,使用者隻需要輸入yes來決定接受這個遠端主機的公鑰。緊接着,系統會出現以下這樣的一句提示,表示遠端主機已經得到認可:

    Warning: Permanently added '49.234.102.232' (ECDSA) to the list of known hosts.

  • 當遠端主機的公鑰被接受以後,它就會被儲存在檔案~/.ssh/known_hosts之中。下次再連接配接這台主機,系統就會認出它的公鑰已經儲存在本地了,進而跳過警告部分,直接提示輸入密碼。
  • 但是由于known_hosts這個機制的存在,也會引起一些問題,比如遠端主機的重新裝作業系統了,遠端主機就會重新生成公鑰,如果我們再登陸遠端主機時,由于我們本地的known_hosts檔案中記錄了原來的公鑰,此時就會提示指紋認證失敗的錯誤,這個時候我們隻需要删除本地的known_hosts檔案即可。又比如,我們經常會寫一些自動化的腳本,會自動的登陸到遠端主機上去,但是這個known_hosts機制卻必須要我們手動輸入yes才能完成遠端登陸,這樣整個自動化登陸就無法完成了,但是我們可以通過修改/etc/ssh/ssh_config配置檔案,跳過這個known_hosts的詢問機制,将# StrictHostKeyChecking ask修改為StrictHostKeyChecking no即可。

二、公鑰免密登入

在我們日常工作中,總是會挂很多的自動化腳本,比如自動的登陸到一台遠端主機上進行一些操作,又比如Ansible就可以配置自動登陸到遠端主機,但是上面說到的SSH,都需要密碼登陸,那如何讓SSH免密登陸,實作我們的自動登陸需求呢?這就是這裡要将的公鑰免密登陸。

  • 1.ssh綿密登入原理圖
    ssh登入原了解析

###原了解析:

上圖就是ssh免密登陸原理圖,從上圖可以看出,SSH免密登陸的前提是使用ssh-keygen -t RSA生成公私秘鑰對,然後通過ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]指令将公鑰分發至遠端主機。接下來的每次免密登陸步驟如下:

解析:

  • ssh-keygen -t RSA 生成密鑰對
  • ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] 将公鑰發送到遠端主機,會存在.ssh/authorized_keys 檔案中
  • 使用者使用ssh [email protected]指令對遠端主機發起登陸;
  • 遠端主機對使用者傳回一個随機串;
  • 使用者所在主機使用私鑰對這個随機串進行加密,并将加密的随機串傳回至遠端主機;
  • 遠端主機使用分發過來的公鑰對加密随機串進行解密;
  • 如果解密成功,就證明使用者的登陸資訊是正确的,則允許登陸;否則反之。
ssh登入原了解析
ssh登入原了解析