Linux 中關於 known_hosts 檔案,你所應該知道的

roc_guo發表於2022-11-04
Linux 中關於 known_hosts 檔案,你所應該知道的Linux 中關於 known_hosts 檔案,你所應該知道的

AJNAPY Data Background digital illustration

如果你經常使用   系統 ssh 到一個遠端伺服器,在主目錄中一般會有一個 .ssh 資料夾,在這個資料夾中會有若干個檔案,其中包括一個 known_hosts 檔案:

$ ls -l .ssh
total 16
-rwxr-xr-x 1 abhishek abhishek  618 Aug 30 16:52 config
-rw------- 1 abhishek abhishek 1766 Nov 12  2017 id_rsa
-rw-r--r-- 1 abhishek abhishek  398 Nov 12  2017 id_rsa.pub
-rw------- 1 abhishek abhishek    1 Sep 26 15:00 known_hosts

這裡,id_rsa 是你 ssh 的私鑰,id_rsa.pub 為ssh公鑰,config 檔案用於建立概要資訊,以便進行 ssh 連線。

本文重點要介紹的,是上述列表中的最後一個檔案,known_hosts,它是客戶端 ssh 配置檔案的重要組成部分。

SSH中的 known_hosts 檔案是什麼
known_hosts 檔案儲存使用者訪問的主機的公鑰。這是一個非常重要的檔案,它透過將使用者的身份儲存到本地系統來確保使用者連線到合法的伺服器。這也有助於避免中間人攻擊。

當你透過SSH連線到一個新的遠端伺服器時,系統會提示你是否要將遠端主機新增到 known_hosts 檔案:

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

選擇 yes,伺服器的連線資訊會儲存在你的系統中。

避免中間人攻擊

Linux 中關於 known_hosts 檔案,你所應該知道的Linux 中關於 known_hosts 檔案,你所應該知道的
我們假設你經常連線某個伺服器,且將該伺服器的連線資訊儲存在了 know_hosts 檔案中。

如果遠端伺服器的公鑰發生了更改,你的系統會根據 known_hosts 檔案中儲存的資訊記錄此次更改,你也會收到此更改的通知:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for xyz remote host has changed,and the key for the corresponding IP address xxx.yy.xxx.yy is unknown. This could either mean that DNS SPOOFING is happening or the IP address for the host and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
69:4e:bb:70:6a:64:e3:78:07:6f:b4:00:41:07:d8:9c.
Please contact your system administrator.
Add correct host key in /home/.ssh/known_hosts to get rid of this message.
Offending key in /home/.ssh/known_hosts:1
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.

在這種情況下,你可以在接受這個新金鑰之前聯絡遠端伺服器的管理員,以便確保遠端伺服器沒有受到入侵。

有時候,管理員可能會由於重新安裝伺服器而故意更改伺服器(主機)的金鑰。

無論更改的原因是什麼,你都需要首先從 known_hosts 檔案中刪除舊金鑰,以便重新連線到遠端伺服器。下次連線到此伺服器時,客戶端主機將為此伺服器建立新的主機金鑰。

管理多個經過身份驗證的使用者
如前所述,一旦客戶機主機成功連線到遠端伺服器,其 known_hosts 檔案將附加伺服器的公鑰。

有時,你可能會希望對伺服器進行身份驗證,而不需要提示進行伺服器金鑰驗證。例如,你正在執行 Ansible 之類的配置管理工具,並且不希望客戶端主機請求伺服器金鑰驗證。

因此,如果你有多個使用者,可以使用三種方式繞過SSH互動提示:

1)手動將伺服器的公鑰附加到每個使用者的known_hosts檔案中;

2)透過 ssh 訪問伺服器時,對每個客戶端都使用 行設定引數 -o StrictHostKeyChecking=no(不推薦);

3)在主 ssh_known_hosts 檔案中註冊所有主機,然後將此檔案編排到所有客戶端主機,然後使用 ssh-keyscan  :

ssh-keyscan -H -t rsa ‘your-server-ip’ >> /etc/ssh/ssh_known_hosts

下圖顯示瞭如何使用 StrictHostKeyChecking=no 選項:
Linux 中關於 known_hosts 檔案,你所應該知道的Linux 中關於 known_hosts 檔案,你所應該知道的
上述方法中,第一種方法相比於另外兩種方法,操作起來更加繁瑣。

從 known_hosts 檔案獲取遠端系統詳細資訊

獲取遠端系統的詳細資訊,不是一個簡單的工作。

基於安全考慮,幾乎所有 Linux 系統都會將 ssh 配置檔案中的 HashKnownHosts 引數設定為 yes。

這也就意味著在 known_hosts 檔案中的資訊是以 hash 方式儲存的,你可能會看到一些隨機數,但這並不能提供任何有用的資訊。

$ cat .ssh/known_hosts
|1|yWIW17YIg0wBRXJ8Ktt4mcfBqsk=|cFHOrZ8VEx0vdOjau2XQr/K7B/c= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFR293PJnDCj59XxfqYGctrMo60ZU5IOjACZZNRp9D6f
|1|Ta7hoH/az4O3l2dwfaKh8O2jitI=|WGU5TKhMA+2og1qMKE6kmynFNYo= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCmrxLW436AyBGyGCggl/j2qBCr782AVIvbiTEsWNBWLcWMKYAQpTdAXnaV4bBRqnk2NJg/60XDHKC2DF1tzx6ABWN/R6vcUAbulI9H1RUWpJ1AiDmFL84MvW2UukbpN5a6Lr+DvjclVqPxJRjQKr6Vy2K9oJgGKnHVcWSIHeAlW49kCCg5fIxF8stBTqJg0cRk6uxmcYVud1vh9a7SaZGK+jFZTB75RiHAVFuitHWpljecMxJRNYy/EhmmXrrvyU8pObVXlWlDd61uwExi4uEwNSY+Do7vR1y8svnt9mjTzzyM6MhT4sOcxWmNgdmw7bU/wPpie3dSjZMQeu2mQCSM7SG28dwjSyFPpanRsZKzkh0okAaCSItoNwl6zOf6dE3zt0s5EI6BPolhFAbT3NqmXRblxb7eV8rGEPf14iguHUkg6ZQr2OUdfeN1FYNMJ8Gb9RD159Mwjl4/jPIBdnXvt7zYct3XhPKm7Wxv4K/RWZE837C7mGQh2KEahWajdq8=
|1|NonAy25kVXL24U2mx6ZNxAY5m98=|ypf0IMpf3qq3vhrvUMprssOhODs= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE3br/9jaZfdB+qBxiVEZBJMb4XQONwzV4tH1xeFZX/zkyws2eBHrVO9O5l9b6M6+gO6nBtCwAzzaeLOn6mo8GQ=

如果你知道系統的主機名或IP地址,則可以從 known_hosts 獲取相關資訊:

ssh-keygen -l -F

但是,如果你想要一個能夠以明文形式列出的所有伺服器及其詳細資訊的命令,那是不可能的。

當然,現實中會有一些專門的工具可以破譯 known_hosts,但這不是普通使用者可以做到的。

從known_hosts中刪除資訊
如果想要從 known_hosts 檔案中刪除某個特定的主機資訊,可以根據遠端系統的主機名或 IP 執行這個操作:

ssh-keygen -R

當然也可以先識別相關伺服器的資訊,然後使用 rm 命令手動刪除,但是這個操作要麻煩的多,遠不如使用上述命令方便。

ssh-keygen -R 用 rm 命令手動刪除,但是這個操作要麻煩的多,遠不如使用上述命令方便。

透過了解 ssh 相關的配置檔案,有助於更好的理解系統安全相關知識。known_hosts 正是系統安全相關的重要組成部分。

以上就是本次分享全部內容。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2921827/,如需轉載,請註明出處,否則將追究法律責任。

相關文章