SSH - WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
最近在登入一些雲端運算資源時,使用 SSH 登入卻出現以下警告
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 ED25519 key sent by the remote host is
SHA256:<FingerPrint>.
Please contact your system administrator.
Add correct host key in /Users/yhmtsai/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/yhmtsai/.ssh/known_hosts:21
Host key for <server> has changed and you have requested strict checking.
Host key verification failed.
會跳出這個警告是因為,從伺服器拿到的公鑰指紋對不上,目前系統所記錄的,所以 SSH 懷疑是不是有中間人攻擊 (詳見 wiki),並禁止此次登入。注意:不一定每次出現這個訊息就是有問題,還要配合伺服器的訊息才能判斷,例如更新或重新設定 SSH 伺服器設定,可能就會讓該指紋改變,又或者晚點介紹這次遇到的狀況。但幸好該密碼有配合 TOTP (基於時間的一次性密碼演算法),遇到這狀況都沒使用該 TOTP 來登入,所以帳號應該也還是安全的,所以才可以慢慢的去查錯,並通知伺服器管理員。
問題
重複試著登入,有時候可以登入,但有時候會跳出不同的公鑰指紋,另外將 wifi 換成手機網路,但情況還是一樣,加上伺服器公布的指紋只有 RSA/ECDSA 但我所遇到的問題卻是 ED25519,到這邊開始懷疑並不是安全性的問題。到這裡就寫信跟伺服器管理員詢問,並把一些資料我所能找到的分享出來
不同的公鑰指紋?
遇到這個問題時,有想到為了負載的關係,登入伺服器有五台,所以我就直接登入特定的伺服器,而非讓他去自動分配,並記錄下來他所回報的公鑰指紋。而此時有發現其中一台我是可以直接登入成功的,代表其中一台跟我之前登入的是有吻合的。但這裡還不能完全確定,因為我之前在第一次登入時並沒有去確認指紋是否吻合(錯誤示範),但所記錄的 RSA/ECDSA 是有符合的
確認所記錄的公鑰指紋
# 列出所有的指紋 list all finger print
ssh-keygen -l -f ~/.ssh/known_hosts
# 列出特定的伺服器 list finger print of the specific server
ssh-keygen -l -f ~/.ssh/known_hosts -F <伺服器>
利用這個去確認之前紀錄是否吻合伺服器所公開的資料,那 RSA/ECDSA 部分是吻合的,但多紀錄了 ED25519 。這邊有去確認另一台電腦的紀錄,但另一台只有紀錄 RSA 的部分。
只刪掉紀錄中的 ED25519
這其實是伺服器管理員讓我試試看的,那刪掉後其實第一次都可以登入,也沒有跳出任何需要檢查公鑰指紋的提示,或第一次登入需要確認的訊息也沒有,代表 RSA/ECDSA 檢查有通過就可以登入了。但在登入之後會發現 known_hosts 會再次被加入 ED25519(登入後才會被加入),所以只要下次登入到不同台,警告又會跳出來了。
利用 ssh -vvv <server>
去檢查發生了什麼事。
...
debug3: record_hostkey: found key type RSA in file /Users/yhmtsai/.ssh/known_hosts:19
debug3: record_hostkey: found key type ECDSA in file /Users/yhmtsai/.ssh/known_hosts:20
debug3: order_hostkeyalgs: prefer hostkeyalgs: [email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,rsa-sha2-512,rsa-sha2-256,ssh-rsa
...
debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256,ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
...
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
... after login 登入後 ...
debug3: client_input_hostkeys: received ED25519 key ...
Adding new key for <server> to /Users/yhmtsai/.ssh/known_hosts: ssh-ed25519 ...
下次登入會因為有 ED25519 在紀錄中了,所以登入時就跟著檢查
debug3: record_hostkey: found key type RSA in file /Users/yhmtsai/.ssh/known_hosts:19
debug3: record_hostkey: found key type ECDSA in file /Users/yhmtsai/.ssh/known_hosts:20
debug3: record_hostkey: found key type ED25519 in file /Users/yhmtsai/.ssh/known_hosts:21
debug3: order_hostkeyalgs: have matching best-preference key type [email protected], using HostkeyAlgorithms verbatim
...
debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256,ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
...
Throw Warning
order_hostkeyalgs,發現 ED25519 ,該項符合首選,所以就用它來檢查了
暫時解法
可以看到是 ED25519 這一個會被先確認,所以如果把 ED25519 取消,或者改一下順序會怎麼樣呢?
- 取消 ED25519:
ssh -o HostKeyAlgorithms="-*ed25519*" <server>
,取消掉就可以像之前一樣的登入了 - 換一下順序:
ssh -o HostKeyAlgorithms="ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519" <server>
這樣出乎我的意料,這樣也過了,但用-vvv
去看發現,他前面檢查完 RSA 就通過了,登入後如果是不同台就會將所紀錄的 ED25519 換掉/Users/yhmtsai/.ssh/known_hosts:21: Removed ED25519 key for host <server>
Adding new key for <server> to /Users/yhmtsai/.ssh/known_hosts: ssh-ed25519
SSH 版本?
目前應該是覺得 ssh 的版本導致他預設的順序不一樣,會出現警告的那台是 OpenSSH_8.6p1, LibreSSL 2.8.3
,而另一台則是 OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n
,有試過 ssh -Q key
但看起來一樣,而 ssh -Q sig
只有在 8.6 有,如果有人知道怎麼查詢預設的順序或相關的東西的話,再麻煩留言告知了,謝謝
結語
有將前面所發現的東西,也就是不同的登入伺服器雖然有共通的 RSA/ECDSA 但 ED25519 卻是獨立的,通知伺服器管理員,並提供 ssh -o HostKeyAlgorithms="ed25519" <server>
,就可以強迫登入使用 ED25519 ,他們目前有確認我前面提供的 ED25519 指紋的確是每台所擁有的,所以登入是正常的,另外他們會去看能不能也把 ED25519 也一樣共用,至少會把 ED25519 之後也補上伺服器的資料上。
一開始遇到想說,明明才剛重灌兩三天,怎麼就有安全性上的問題,花了一段時間去確認可能是哪個環節出了問題,幸好最後不是有資安問題。另外有知道任何除了上述所講的解法,或者一些相關資料,歡迎留言分享。