什么是ssh
ssh是一個(gè)標(biāo)準(zhǔn)協(xié)議,用于保證網(wǎng)絡(luò)通信安全服務(wù),也就是加密,常見的應(yīng)用場(chǎng)景就是安全登錄,這個(gè)大家常用git的話應(yīng)該比較熟悉,配置ssh后就可以不需要密碼直接登錄了,非常方便,那么ssh是怎樣保證安全的呢。
ssh加密
加密是我們保證通信鏈路安全的最重要的方式,包括軍用情報(bào)的傳輸,全部是由復(fù)雜的加密算法加持的,就是為了保證只有對(duì)的人才能讀出正確的信息,林俊杰的歌詞完美的說明了這個(gè)問題
確認(rèn)過眼神,我遇上對(duì)的人。
對(duì)稱加密
客戶端對(duì)稱加密過程
服務(wù)端對(duì)稱加密過程
對(duì)稱加密就是通信雙方使用同樣的密鑰來加密數(shù)據(jù),但是這樣一來風(fēng)險(xiǎn)就比較大,客戶端的數(shù)量都非常大,一旦任一客戶端的密鑰被泄露都會(huì)導(dǎo)致整個(gè)系統(tǒng)的數(shù)據(jù)傳輸被暴露,事情就大條了。那么解決這個(gè)問題的方式就是非對(duì)稱加密。
非對(duì)稱加密
非對(duì)稱加密使用一個(gè)公鑰和一個(gè)私鑰來加密和解密數(shù)據(jù),使用公鑰加密的數(shù)據(jù)只能用對(duì)應(yīng)的私鑰解密,而且只有公鑰是無法計(jì)算或者猜測(cè)出私鑰的。
以一次登錄為例,非對(duì)稱加密的基本流程如下,
0、客戶端發(fā)起明文登錄請(qǐng)求
1、服務(wù)端將公鑰發(fā)送給客戶端
2、客戶端使用公鑰加密登錄的賬號(hào)密碼等敏感數(shù)據(jù)
3、加密后的數(shù)據(jù)發(fā)送給服務(wù)端
4、服務(wù)端獲取數(shù)據(jù)后,使用對(duì)應(yīng)的私鑰解密
5、校驗(yàn)數(shù)據(jù)合法性
6、返回登錄結(jié)果
看起來很完美,萬無一失?NO!NO!NO!
中間人攻擊
設(shè)想一下如下場(chǎng)景,有黑客大神搭建了一個(gè)假冒的服務(wù)器,攔截了你的明文請(qǐng)求,然后把自己的公鑰發(fā)送給你,你傻乎乎的使用了這個(gè)公鑰,然后把加密后的數(shù)據(jù)發(fā)送給了假冒的服務(wù)器,假冒的服務(wù)器下一步的動(dòng)作當(dāng)然是毫不客氣的使用私鑰解密你的數(shù)據(jù),然后獲取到了你的明文密碼,換句話說,你的賬號(hào)被盜了!
中間人攻擊示意
如何防范中間人攻擊呢?這就需要基于口令的認(rèn)證,SSH的公鑰和私鑰都是自己生成的,沒法公證。只能通過客戶端自己對(duì)公鑰進(jìn)行確認(rèn)。通常在第一次登錄的時(shí)候,系統(tǒng)會(huì)出現(xiàn)下面提示信息
The authenticity of host 'ssh-server.example.com (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)?
需要我們自行確認(rèn)服務(wù)端的RSA指紋,輸入yes后提示
Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
接下來就是按照我們上述的流程走了。