熱門分類
載入中…
目錄0%

🔑 設備更換但 IP 不變?SSH Host Key Verification Failed 的正確處理方式

    🔑 設備更換但 IP 不變?SSH Host Key Verification Failed 的正確處理方式

    機房裡把一台設備換掉、但管理 IP 沿用舊的,是很常見的操作。這時候用同一台管理電腦 SSH 上去,十之八九會撞上 Host key verification failed。這篇整理這個錯誤的成因、跟「第一次連線」那種提示的差異,以及正確的處理方式。


    1️⃣ 兩種長得很像、但意義不同的提示

    SSH 對「host key 的狀態」其實分兩種情境判斷,錯誤訊息完全不同,混在一起看容易誤判。

    情境 A:第一次連線,SSH 資料庫裡完全沒有這個 IP 的紀錄

    The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
    ED25519 key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    This key is not known by any other names.
    Are you sure you want to continue connecting (yes/no/[fingerprint])?

    這是正常流程,SSH 會停下來問你「要不要信任這把新看到的 key」,輸入完整的 yes(不是按 Enter、也不是打 y)就會繼續連線,並把這把 key 寫進 ~/.ssh/known_hosts。

    情境 B:以前連過,這次收到的 key 跟記錄的不一樣

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    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:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    Please contact your system administrator.
    Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /home/user/.ssh/known_hosts:32
    Host key for 192.168.1.10 has changed and you have requested strict checking.
    Host key verification failed.

    這種情況 SSH 不會給 yes/no 選項,直接擋下連線。這是刻意設計的行為:「同一個 IP 之前連過、現在 key 卻不一樣」是 SSH 最重視的風險訊號之一,因為理論上這正是中間人攻擊(MITM)的典型特徵——攻擊者在你跟真正目的地之間插入自己的機器,用自己的 key 冒充對方。SSH 沒辦法自動分辨「這是真的攻擊」還是「設備真的換了」,所以一律先擋下來,把判斷權交還給人。


    2️⃣ 為什麼設備沒換,key 卻可能不一樣;為什麼設備換了,key 一定不一樣

    SSH host key 是設備第一次啟動 SSH 服務時自動產生的一組金鑰對,跟設備的「身分」綁在一起,不是跟 IP 綁在一起。幾種常見情境:

    • 換了一台實體設備,IP 沿用舊的:新設備的 host key 一定跟舊設備不同,這是預期中的正常變化。
    • 同一台設備做了原廠重置(factory reset)或組態清空重建:許多系統在這種情況下會重新產生一組新的 host key,即使實體設備沒換,key 也會變。
    • 金鑰演算法被管理者手動更換(例如從 ECDSA 換成 ED25519):即使設備沒換、也沒重置,只是換了金鑰型別,key 內容也會不同。

    反過來說,如果你確定設備完全沒動過、也沒人去改過 SSH 設定,卻收到「host key changed」的警告,這時候更該提高警覺,先透過其他管道(電話確認、直接到現場看設備狀態)排除真的被中間人攻擊的可能性,不要急著清掉警告就繼續連線。


    3️⃣ 正確處理方式:ssh-keygen -R

    確認是「設備確實更換過」之後,正確做法是移除 known_hosts 裡舊的那筆紀錄,而不是手動去檔案裡找那一行刪除(手動編輯容易刪錯行或漏掉重複紀錄)。

    ssh-keygen -R 192.168.1.10

    這行指令會找出 known_hosts 裡所有跟這個 IP(或主機名稱)對應的紀錄並移除,同時保留一份備份:

    # Host 192.168.1.10 found: line 31
    # Host 192.168.1.10 found: line 32
    /home/user/.ssh/known_hosts updated.
    Original contents retained as /home/user/.ssh/known_hosts.old

    💡 這裡如果看到「found」不只一行(像上面範例的 line 31 和 32),代表這個 IP 過去曾經被記錄過不只一次、且是不同的 key。這通常代表這個 IP 過去至少經歷過一次類似的變動(設備換過、或金鑰型別換過),值得回頭確認一下歷史紀錄,而不是單純當作這次的偶發狀況。

    清除舊紀錄之後,再次連線就會回到情境 A(第一次連線)的正常流程:

    ssh root@192.168.1.10
    The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
    ED25519 key fingerprint is: SHA256:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '192.168.1.10' (ED25519) to the list of known hosts.
    (root@192.168.1.10) Password:

    輸入完整的 yes,新的 key 就會被寫入 known_hosts,之後同一台管理電腦連這個 IP 就不會再跳警告,除非 key 又再次改變。


    4️⃣ 一個容易被忽略的線索:「This host key is known by the following other names」

    重新連線時,有時候會多看到這一行:

    This host key is known by the following other names/addresses:
        ~/.ssh/known_hosts:17: 192.168.0.99

    這代表這次收到的這把 key,你的管理電腦「之前也在另一個 IP 上見過」。如果那個舊 IP 對應的正是你認識的某台設備,這其實是一個很有用的佐證:代表現在這個新 IP 上的設備,跟那台舊設備是同一台(或至少共用同一把 host key,例如同一份出廠映像檔或同一次組態還原)。這種交叉比對,在排查「這台設備到底是不是我認識的那台」時很實用,不要因為只是一行附加訊息就忽略掉。


    5️⃣ 常見誤區

    誤區問題正確做法
    看到 warning 就直接刪 known_hosts 整個檔案 連同其他所有設備的信任紀錄一起清掉,之後每台都要重新確認一次,而且失去了「異常變動」的偵測能力 只針對特定 IP 用 ssh-keygen -R
    用 StrictHostKeyChecking=no 一勞永逸關掉檢查 等於放棄 SSH 對 MITM 攻擊的偵測能力,長期使用風險很高 只在明確知道是暫時測試環境時短期使用,正式環境不建議關閉
    看到「host key changed」直接當作設備正常更換,沒有進一步確認 如果實際上是中間人攻擊,這麼做等於主動忽略警告 先透過其他管道確認設備狀態,確定是預期中的變動才清除紀錄
    連線提示要求輸入 yes 時只按 Enter 或打 y SSH 需要完整輸入 yes,其他輸入會被視為拒絕,導致 Host key verification failed 務必輸入完整的 yes

    📚 延伸閱讀(站內相關文章)


    ✅ 結論與行動建議

    Host key verification failed 不是故障,是 SSH 刻意設計的保護機制,用來偵測「同一個位址、身分卻變了」這種可能的攻擊情境。設備確實更換或重置後,用 ssh-keygen -R <IP> 移除舊紀錄是正確且安全的做法;但看到這個警告的第一反應不該是「趕快清掉繼續連」,而是先確認變動的原因是不是預期中的——尤其是自己也不確定設備最近有沒有被動過的情況下,多花一分鐘確認,比事後排查資安事件划算得多。

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級