事情由来:
登录自己的vps时提示REMOTE HOST IDENTIFICATION HAS CHANGED!
。
显示如下
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:sYNNR1L6T5cSEG4BndqtCDhJEI0eB9LamBTkuIue3+0.
Please contact your system administrator.
Add correct host key in /Users/xx/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/xx/.ssh/known_hosts:40
ECDSA host key for [xx.com] has changed and you have requested strict checking.
Host key verification failed.
提示有被中间人攻击的风险,那么除了被中间人攻击的情况下,还有那些变动会造成这样的变动?(ssh连接的加密方式变化了,比如我发现 known_hosts 文件中有的主机信息是 ssh-rsa 有的是 ecdsa-sha2-nistp256,那么软件升级会改变连接加密方式吗?我自己没有动过)
还有其中提到了指纹信息
The fingerprint for the ECDSA key sent by the remote host is
SHA256:sYNNR1L6T5cSEG4BndqtCDhJEI0eB9LamBTkuIue3+0.
这种指纹信息在第一次ssh登录服务器的时候也会提示
The authenticity of host [xx.com] can't be established.
ECDSA key fingerprint is SHA256:sYNNR1L6T5cSEG4BndqtCDhJEI0eB9LamBTkuIue3+0.
Are you sure you want to continue connecting (yes/no)?
那么这个指纹信息是要验证的,怎么验证?
(我猜有很大比例的人应该都会像安装软件下一步一样,并不清楚怎么对比,就直接信任了)
append:查找了一些资料,How to get ssh server fingerprint information,都提到了类似的内容,但是和上面显示的 fingerprint 不一样呀。
> ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 0d:df:2b:e4:ee:79:f2:98:ab:38:93:f3:44:1d:c5:4d root@doceanm-xxx.localdomain (ECDSA)
那么他们之间的关系是什么?
还有生成私匙公钥的过程中也会提到一个指纹
> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xavier/.ssh/id_rsa): testxxx
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in testxxx.
Your public key has been saved in testxxx.pub.
The key fingerprint is:
SHA256:Bw1NuIXaa7h6tzCWDDOq0/esnqQiNJruFeNThfYffHY xavier@local
The key's randomart image is:
+---[RSA 2048]----+
| .=. |
| . ooo |
| o +.o. |
| . + +. |
| o+. oS+.o E |
| o..+=..+.+ . |
|ooo+. *o . |
|*.ooo+oo. |
|==.o==o... |
+----[SHA256]-----+
伺服器管理員將其告知使用者
是的,無法保證。
ssh協定如果要安全,需要你自己保證你第一次得到的指紋是真實的。
需要使用另外的保證安全的方式取得。例如你買了一個vps,那麼商家應該在他的https網頁上除了給SSH連線方式,還要給出伺服器的SSH指紋。這樣就可以防止網路污染了。
這是密碼學基礎。你無法在協商秘鑰之前保證通訊不被篡改。
如何透過其他方式進入伺服器,驗證指紋,或提前就獲取指紋信息,進行比對?
我就當你問的是兩個問題。
如何提前取得指紋資訊進行比對?
答:SSH客戶端已經幫你做了,就是你貼出來的那些,比對不成功,默認拒絕讓你繼續登陸下去,防止你的密碼(如果用的是密碼)被偽造的服務端竊取。
如何取得服務端真實的指紋?
答:服務端的指紋預設儲存在/etc/ssh/。
從你給的資訊來看,你的SSH客戶端採用的是ECDSA金鑰,就是
/etc/ssh/ssh_host_ecdsa_key.pub
的內容。但是你比對這個並沒有什麼用。
原因很簡單,中間人可以搞得到服務端的公鑰,
那麼他也能把這個指紋存放在預設的位置,至於私鑰,一般情況下你不會去驗證一下他的私鑰和公鑰能不能配對,所以他隨便偽造一個就行了。
但是中間人沒辦法拿到私鑰,他就沒辦法解密你和服務端之間傳送的資料。
這裡牽涉到公約加密私鑰解密公鑰解密私鑰加密這種非對稱加密措施,具體不講。
換句話說,他搞到服務端的公鑰,(即使能透過公鑰)偽造了一個服務端,(雖然沒有私鑰也不能啟動一個服務端,特殊情況另說),
但是你發給服務端的資料需要服務端的私鑰解密,也就是說,他沒辦法解密,沒用。
也就是說:
只要第一次登陸成功,並且確認你登入的機器是自己的機器,那麼後續遵循ssh客戶端預設的安全策略,是絕對沒有任何安全問題的。
只要第一次登陸成功,並且確認你登入的機器是自己的機器,那麼後續遵循ssh客戶端預設的安全策略,是絕對沒有任何安全問題的。
只要第一次登陸成功,並且確認你登入的機器是自己的機器,那麼後續遵循ssh客戶端預設的安全策略,是絕對沒有任何安全問題的。
確認是自己的機器很簡單,看看自己的文件是不是在就行了。
評論區有人質疑整台機器被做了proxy,那我還能提供一個方案:
理論上第一次是絕對不安全的,但是沒有絕對。
看到私鑰公鑰總是提密碼學、然後提到金鑰加密就不好了。
金鑰加密本身就不安全,但是金鑰本身也是一種妥協,金鑰本身就是使用足夠長的金鑰進行加密,使得你破解成為一件很耗時間的事情(消耗數以年記的時間)。
那麼妥協一下就很簡單了,
很簡單,即使他能劫持你cat ssh公鑰的內容,能劫持vim打開,但是很難劫持你編輯這個文件,例如在文件開頭加一個回車,例如在公鑰中間加一個回車。
也根本不能劫持你自己寫腳本
其中cat_key.sh的內容是
cat ssh_key.pub
,或是cat_key.sh根本就是個二進位。評論區又提出公鑰私鑰直接被proxy取代。
也很簡單就能破解,安裝機器必然透過安裝腳本,安裝腳本如何操作是個問題。
bash不會即時記錄操作,但是可以透過logger即時記錄每一次操作。
定制系統日誌,登陸後進行審計。
能駭進路由器的駭客不是很多,有直接替換的能力的,是黑產/白帽產業的頂尖,國家機器、專業駭客團隊和NSA,還能偷偷抹平操作記錄的,就只剩NSA了。
說這麼多,還是比較麻煩,非得神經兮兮的懷疑的話,
那就只能機器提供方提供公鑰或指紋了。
一般情況下,
服務端弱口令、密碼爆破才是王道。
那些駭客最喜歡用各種工具掃描弱密碼了。
安裝一個denyhosts並啟動,
會預設屏蔽掉大部分的惡意ssh請求。