ssh 之所以能夠保證安全,原因在於它採用了公鑰加密。
整個過程是這樣的:
遠端主機收到使用者的登入請求,把自己的公鑰發給使用者。
使用者使用這個公鑰,將登入密碼加密後,傳送回來。
遠端主機用自己的私鑰,解密登入密碼,如果密碼正確,就同意使用者登入。
這個過程本身是安全的,但是實施的時候存在乙個風險:如果有人截獲了登入請求,然後冒充遠端主機,將偽造的公鑰發給使用者,那麼使用者很難辨別真偽。因為不像 https 協議,ssh 協議的公鑰是沒有證書中心(ca)公證的,也就是說,都是自己簽發的。
可以設想,如果攻擊者插在使用者與遠端主機之間(比如在公共的 wifi 區域),用偽造的公鑰,獲取使用者的登入密碼。再用這個密碼登入遠端主機,那麼 ssh 的安全機制就蕩然無存了。這種風險就是著名的中間人攻擊。
ssh 協議是如何應對的呢?
ssh 登入方式主要分為兩種:
說明:當客戶端發起 ssh 請求,伺服器會把自己的公鑰傳送給使用者(此時應是明碼傳送,反正公鑰本來就是給大家使用的);
使用者會根據伺服器發來的公鑰對密碼進行加密;
加密後的資訊回傳給伺服器,伺服器用自己的私鑰解密,如果密碼正確,則使用者登入成功。
$ ssh user@host
the authenticity of host 'host (12.18.429.21)' can't be established.
rsa key fingerprint is 98
:2e:d7
:e0:de
:9f:ac:67
:28:c2:42:
2d:37:16
:58:4d.
are you sure you want to continue connecting (yes/no)
?
這段話的意思是,無法確認 host 主機的真實性,只知道它的公鑰指紋,問你還想繼續連線嗎?
所謂"公鑰指紋",是指公鑰長度較長(這裡採用 rsa 演算法,長達 1024位),很難比對,所以對其進行 md5 計算,將它變成乙個 128 位的指紋。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d
,再進行比較,就容易多了。
很自然的乙個問題就是,使用者怎麼知道遠端主機的公鑰指紋應該是多少?回答是沒有好辦法,遠端主機必須在自己的**上貼出公鑰指紋,以便使用者自行核對。
假定經過風險衡量以後,使用者決定接受這個遠端主機的公鑰。
are you sure you want to
continue
connecting
(yes/no)
? yes
系統會出現一句提示,表示host主機已經得到認可。
warning: permanently added 'host,12.18.429.21'
(rsa
) to the list of known hosts.
然後,會要求輸入密碼。
password: (enter password)
如果密碼正確,就可以登入了。
當遠端主機的公鑰被接受以後,它就會被儲存在檔案$home/.ssh/known_hosts
之中。下次再連線這台主機,系統就會認出它的公鑰已經儲存在本地了,從而跳過警告部分,直接提示輸入密碼。
每個 ssh 使用者都有自己的known_hosts
檔案,此外系統也有乙個這樣的檔案,通常是/etc/ssh/ssh_known_hosts
,儲存一些對所有使用者都可信賴的遠端主機的公鑰。
說明:首先在客戶端生成一對金鑰(ssh-keygen
);
並將客戶端的公鑰ssh-copy-id
拷貝到服務端;
當客戶端再次傳送乙個連線請求,包括 ip、使用者名稱;
服務端得到客戶端的請求後,會到authorized_keys
中查詢,如果有響應的 ip 和使用者,就會隨機生成乙個字串,例如:qwer;
服務端將使用客戶端拷貝過來的公鑰進行加密,然後傳送給客戶端;
得到服務端發來的訊息後,客戶端會使用私鑰進行解密,然後將解密後的字串傳送給服務端;
服務端接受到客戶端發來的字串後,跟之前的字串進行對比,如果一致,就允許免密碼登入。
所謂"公鑰登入",原理很簡單,就是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向使用者傳送一段隨機字串,使用者用自己的私鑰加密後,再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入 shell,不再要求密碼。
這種方法要求使用者必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen
生成乙個:
$ ssh-keygen
執行上面的命令以後,系統會出現一系列提示,可以一路回車。其中有乙個問題是,要不要對私鑰設定口令(passphrase),如果擔心私鑰的安全,這裡可以設定乙個。
執行結束以後,在$home/.ssh/
目錄下,會新生成兩個檔案:id_rsa.pub
和id_rsa
。前者是你的公鑰,後者是你的私鑰。
這時再輸入下面的命令,將公鑰傳送到遠端主機 host 上面:
$ ssh-copy-id user@host
好了,從此你再登入,就不需要輸入密碼了。
客戶端生成證書:私鑰和公鑰,然後私鑰放在客戶端,妥當儲存,一般為了安全,防止有黑客拷貝客戶端的私鑰,客戶端在生成私鑰時,會設定乙個密碼,以後每次登入 ssh 伺服器時,客戶端都要輸入密碼解開私鑰(如果工作中,你使用了乙個沒有密碼的私鑰,有一天伺服器被黑了,你是跳到黃河都洗不清)。
伺服器新增信用公鑰:把客戶端生成的公鑰,上傳到 ssh 伺服器,新增到指定的檔案中,這樣,就完成 ssh 證書登入的配置了。
假設客戶端想通過私鑰要登入其他 ssh 伺服器,同理,可以把公鑰上傳到其他 ssh 伺服器。
員工生成好私鑰和公鑰(千萬要記得設定私鑰密碼),然後把公鑰發給運維人員,運維人員會登記你的公鑰,為你開通一台或者多台伺服器的許可權,然後員工就可以通過乙個私鑰,登入他有許可權的伺服器做系統維護等工作,所以,員工是有責任保護他的私鑰的。
SSH金鑰認證原理
所謂的金鑰認證,實際上是使用一對加密字串,乙個稱為公鑰 public key 任何人都可以看到其內容,用於加密 另乙個稱為金鑰 private key 只有擁有者才能看到,用於解密。通過公鑰加密過的密文使用金鑰可以輕鬆解密,但根據公鑰來猜測金鑰卻十分困難。ssh 的金鑰認證就是使用了這一特性。伺服器...
ssh 公鑰私鑰認證原理
通常,通過ssh登入遠端伺服器時,使用密碼認證,分別輸入使用者名稱和密碼,兩者滿足一定規則就可以登入。但是密碼認證有以下的缺點 而使用公鑰認證則可以解決上述問題。所謂的公鑰認證,實際上是使用一對加密字串,乙個稱為公鑰 public key 任何人都可以看到其內容,用於加密 另乙個稱為金鑰 priva...
ssh 公鑰私鑰認證原理
通常,通過ssh登入遠端伺服器時,使用密碼認證,分別輸入使用者名稱和密碼,兩者滿足一定規則就可以登入。但是密碼認證有以下的缺點 而使用公鑰認證則可以解決上述問題。所謂的公鑰認證,實際上是使用一對加密字串,乙個稱為公鑰 public key 任何人都可以看到其內容,用於加密 另乙個稱為金鑰 priva...