學會從 Windows 使用金鑰免密碼登入 SSH/SFTP/SCP,迫不及待想將幾台實驗用 Linux 小 VM 設成金鑰登入。

要用金鑰登入 Linux 做法不難,在本機產生金鑰,用 ssh-add 儲存私鑰,再將 id_ed25519.pub 公鑰內容加到 Linux 主機使用者目錄 ~/.ssh/authorized_keys,設定就完成了。

雖然程序不複雜,一台台遠端主機操作仍有點麻煩,所以在 Linux 上有個內建工具 ssh-copy-id,輸入主機 IP 便能自動將公鑰部署上去。

不過呢,Windows OpenSSH Client 沒有 ssh-copy-id 可用,想省事得自己動腦筋。

爬文在 AskUbuntu 查到網友分享的巧妙做法:用 Pipeline 將公鑰內容串接到 ssh CLI,在遠端主機執行一小段程式將其加到 ~/.ssh/authorized_keys 檔案後方,一氣喝成。

其中有點小眉角,若遠端沒有 .ssh 目錄及 .ssh/authorized_keys 需先建立,並將 .ssh 目錄的權限設成 dwrx------ (只有使用者本人可讀寫及進入,chmod 700)、.ssh/authorized_keys 檔案權限設成 -wr------- (限本人讀寫,chmod 600),權限不符金鑰設定將不會生效。我想將所有動作整合在一起,故程式必須先檢查目錄是否存在再決定是否建目錄設權限,檔案不存在建檔設權限,多組動作需串成一行指令,而且得用 Linux Shell 語法寫,這對 Bash 文盲來說是個挑戰。但感謝 ChatGPT 把陌生領域的程式開發變簡單了,以下是成品:

type .ssh\id_ed25519.pub | ssh linux-host-name "([ -f ~/.ssh ] || (mkdir -p ~/.ssh && chmod 700 ~/.ssh)) && ([ -f ~/.ssh/authorized_keys ] || (touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys)) && cat >> ~/.ssh/authorized_keys"

接著我再花了功夫把它包成 PowerShell Script,接受主機名稱(或 IP)及金鑰檔名當參數,便能用 Az-AppendSshPubKey.ps1 <linux-host> 一行指令快速部署金鑰囉~

param(
    [Parameter(Mandatory = $true)]
    [string]$hostName,
    [string]$keyName = 'id_ed25519'
)
Get-Content -Path "$HOME\.ssh\$keyName.pub" | ssh $hostName "([ -f ~/.ssh ] || (mkdir -p ~/.ssh && chmod 700 ~/.ssh)) && ([ -f ~/.ssh/authorized_keys ] || (touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys)) && cat >> ~/.ssh/authorized_keys"

【同場加映】

昨天貼文有讀者提到 SSH 也支援實體金鑰。驚喜發現,我之前買的便宜 USB 實體金鑰居然也能用來登入 SSH,但缺點是在 Windows 平台上要特殊版本 Putty (Putty CAC) 才支援,無法通吃 ssh、scp、sftp 等 CLI,另外 Linux 版本也必須支援(我試了 CentOS 7 不行,Debian 11 OK),還不夠普及方便。

用實體金鑰的好處是私鑰永遠鎖在硬體裡,無法被複製偷走,登入時按觸控鈕或蓋指紋完成授權,方便又安全。

看網友分享,貴森森的 Yubico Security Key 在 Windows 也是靠 Putty CAC,期待未來 OpenSSH CLI 能內建支援。


Comments

# by Jim

Yubikey PIV 有支援windows 原生 ssh https://support.yubico.com/hc/en-us/articles/360021606180-Using-YubiKey-PIV-with-Windows-native-SSH-client

# by Jeffrey

to Jim, 感謝分享,Yubikey 支援度真的沒話說,如果價格能更親民一點就更好了。

# by Jim

後來發現可以裝新版本 windows openssh 就有支援, 連便宜的 uTrust FIDO2 Security Keys 也可以用, https://blog.dan.drown.org/u2f-fido2-based-ssh-keys-on-windows/

# by Jeffrey

to Jim, 感謝分享,找時間來試試。

Post a comment