解決 SSH 無法登入 GCP VM 出現 Permission denied

前情提要

有一台遠古的 Google Cloud Engine VM 有點問題, OS 是 Debian 7 ,我要進去查看問題在哪邊,用 gcloud compute ssh 指令 SSH 進去,不過卻跳出 Permission denied (publickey) 的錯誤,Log 如下

username@host:~/.ssh % gcloud compute ssh --zone zone instance_name --project project
username@192.168.0.1: Permission denied (publickey).

Recommendation: To check for possible causes of SSH connectivity issues and get
recommendations, rerun the ssh command with the --troubleshoot option.

gcloud compute ssh instance_name --project=project --zone=zone --troubleshoot

Or, to investigate an IAP tunneling issue:

gcloud compute ssh instance_name --project=project --zone=zone --troubleshoot --tunnel-through-iap

ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].

這問題以前都沒遇過就只能 Google 看看,從外太空搜尋到內子宮,搜尋結果大概是兩個方向

硬碟空間滿了

啊!SSH 連不進 GCP 的 VM! 這篇有提到用 gcloud compute instances get-serial-port-output 看 system log 會有 No space left on device 的 Log

但是我看我的 VM 沒有這條 log ,不過因為沒辦法登入所以也沒辦法確認硬碟空間是不是用完。

可能有什麼阻擋了 SSH 連線

GCP 虛擬主機連線失敗救援教學―第三方軟體阻斷 SSH 連線 這篇一樣是 SSH 無法連線的問題,有提到可以用 Serial Console 登入來救援

是要用 startup script 在啟動時增加一個 user ,不過照做之後,Serial Console 卻沒辦法跳出登入的 prompt

檢查 disk 容量

此時進度又回到原點,不過發現 startup script 這個好東西

startup script 可以在啟動時執行一個 script 而且是 root 身份,所以就先用 startup script 在啟動時跑 df 看看容量(跑出的結果會出現在 Serial Console)

df 結果使用量只用了 50% 左右,所以可以排除硬碟空間用完的問題

想辦法開啟 SSH 密碼登入

之前已經有用 startup script 加了 user ,所以就想說何不把 SSH 密碼登入的功能打開

所以又用 startup script 去編輯 /etc/ssh/sshd_config

這時用 sed -i “51d” /etc/ssh/sshd_config ,刪掉 51 行的 PasswordAuthentication no

再用 echo PasswordAuthentication yes >> /etc/ssh/sshd_config 這條指打開 SSH 密碼登入功能

然後 reset VM 就成功開啟 SSH 密碼登入,就可以用剛剛設定的 user 登入看一下問題

發現真正的問題

可以登入後就心安多了,根據原本的 Permission denied 的錯誤,就想說應該是 ssh key 的問題

所以就到自己的帳號下把所有的 SSH key 刪掉,重新把本機的 key 上傳上去,but 還是沒辦法用 SSH key 登入

這時就矇了,只能再繼續查,此時查到說 SSH 可以用 -vvv 來啟用 debug mode 看更多錯誤訊息

debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /Users/username/.ssh/google_compute_engine RSA SHA256: explicit
debug1: send_pubkey_test: no mutual signature algorithm
debug2: we did not send a packet, disable method

看起來 debug1: send_pubkey_test: no mutual signature algorithm 這段最有問題,就拿去 Google 一下

SSH-RSA key rejected with message "no mutual signature algorithm"

查到這篇,原來 server 上的 SSH 版本為 OpenSSH_6.0p1 , Mac 上的版本是 OpenSSH_9.4p1 新版的 SSH Client 預設是不會使用 SSH-RSA 演算法,因為這個演算法有安全疑慮,所以要在 ~/.ssh/config 加上

PubkeyAcceptedAlgorithms +ssh-rsa

這樣來開啟 SSH-RSA 演算法

開啟後,就可以正常使用 SSH Key 登入主機

結語

從外太空查到內子宮,花了一整天的時間在搞這個,結果只要一行 code 就能解決

不過這就是經驗,走過這一輪,Google Cloud 上什麼怪招都用上也算是小有收穫 😂

Follow 院長與芊比媽 on Google News