供登入人員於建立連線時進行驗證,避免遭受中間人攻擊(MitM attack)
https://hackmd.io/@ops-notes-tw/query-ssh-public-key-fingerprints
於伺服器之文字終端中執行下列任一命令有輸出內容:
ps aux | grep --color=always 'sshd: ' | grep --invert-match grep 2>/dev/null
ps
命令實作ps w | grep 'sshd: ' | grep -v grep 2>/dev/null
ps
命令實作。透過安全的方式(如臨機操作)取得伺服器的命令列操作界面。
切換使用者為 root
附註: 此操作的目的為讓使用者可以存取 SSH 服務的私鑰,其僅對 root
使用者開放存取(您亦可以使用一般使用者身份存取 SSH 公鑰來得出其指紋,但是伺服器未必會建立 SSH 服務的公鑰檔案故其實行可能性非 100% 故未被本文章使用)。
執行下列命令查詢 SSH 服務的公鑰指紋:
您應可以得到類似下列這樣的命令輸出:
每一行輸出的格式為:
於伺服器之文字終端中執行下列命令有輸出內容:
透過安全的方式(如臨機操作)取得伺服器的命令列操作界面。
切換使用者至 root
執行下列命令查詢 SSH 服務的公鑰指紋:
您應可以得到類似下列這樣的命令輸出:
輸出的格式如下:
附註:
如果您使用 OpenSSH 的客戶端軟體應會發現其提示之 SSH 服務端公鑰指紋與此步驟所列舉之指紋不同,這是因為 Dropbear(公鑰雜湊結果的以冒號分隔之十六進位表示法)與 OpenSSH(公鑰雜湊結果的 base64 編碼)軟體採用不同的公鑰指紋表示法之緣故。
於前述之範例中 OpenSSH 所產生之 SHA-1 金鑰指紋(可使用 ssh-keyscan _SSH 服務主機地址_ 2>/dev/null | ssh-keygen -lf - -E sha1
命令產生)為:
因其為 27 個字元非 4 的倍數故須根據 Base64 編碼要求後綴一個等號將其手動補完為 28 個字元:
然後即可使用下列流水線命令將其轉換為 Dropbear 的輸出格式:
命令組成元件說明:
base64
命令的 --decode
(-d
) 命令選項:進行解碼而非編碼操作。xxd
命令的 -plain
(-p
) 命令選項:使用 plain hex dump 風格輸出輸入資料的十六進位表示法。sed
命令的 s/../&:/g; s/:$//
表達式:
s/../&:/g
搜尋取代(s
) sed
命令:從輸入的開頭將任意二字元(..
)替換為其自身(&
)並後綴一冒號(:
);對所有比對到搜尋表達式(..
)的字串都進行此操作(g
)。s/:$//
搜尋取代(s
) sed
命令:將前命令輸出末端之冗餘冒號去掉(替換為空字串)。即會產生與 Dropbear 軟體一致之結果:
ssh-keygen
命令下列命令選項之用途:
-l
-E "${fingerprint_algorithm}"
-f "${sshd_host_key}"
dropbearkey
命令各命令選項的用途。xxd
命令 -p
命令選項的用途。本作品為《維運猿的共同筆記》的一部分
頁面連結:https://hackmd.io/@ops-notes-tw/query-ssh-public-key-fingerprints
授權條款:https://hackmd.io/@ops-notes-tw/licensing
參與協作視同將您的貢獻內容以相同的授權條款釋出