1. 程式人生 > >Windows 支援 OpenSSH 了!

Windows 支援 OpenSSH 了!

從 Win10 1809 和 Windows Server 2019 開始 Windows 開始支援 OpenSSH Server。本文介紹一下其基本的概念和配置方法,本文演示用的環境為 Win10 1809(ssh 客戶端)和 Windows Server 2019(ssh 伺服器)。

安裝 OpenSSH Server

OpenSSH 客戶端程式預設已經被系統安裝好了,開啟 Settings->Apps->Manage optional features 面板就可以看到:

而 OpenSSH Server 預設沒有安裝,需要使用者手動安裝。點選上圖中的 "Add a feature" 按鈕,然後選擇 OpenSSH Server,並點選 "Install" 按鈕:

開啟服務
安裝完成後開啟服務管理器,把 OpenSSH Authentication Agent 服務和 OpenSSH SSH Server 服務都設定為自啟動,並啟動這兩個服務:

監聽埠
啟動服務後可以通過 netstat 命令檢視 SSH Server 服務是不是已經開始監聽預設的 22 號埠了:

防火牆規則
在安裝 OpenSSH Server 的時候會在防火牆的入站規則中新增一條記錄讓防火牆放行對 22 號埠的訪問:

伺服器端的配置檔案目錄
伺服器端的配置檔案在 C:\ProgramData\ssh 目錄中,注意 C:\ProgramData 是一個隱藏目錄:

安裝目錄

Windows 系統中 OpenSSH 的安裝目錄為 C:\Windows\System32\OpenSSH,不管是客戶端程式還是伺服器端程式都這這個目錄中:

OpenSSH 伺服器端程式的預設配置檔案 sshd_config_default 也在這個目錄中。這個目錄會被新增到 PATH 環境變數中:

這樣就可以在 PowerShell 中直接執行相關的命令而無需寫出完整的路徑。

Win10 自帶的 OpenSSH 客戶端

因為 SSH 客戶端所在的目錄被新增到了 PATH 環境變數中,在 PowerShell 中可以直接執行 OpenSSH 客戶端的命令,比如 ssh:

連線遠端 Linux 主機
使用 ssh 命令連線一下 Linux 主機,筆者的 Linux 主機為 Ubuntu16.04,可以連線,但是歡迎資訊顯示了兩次:

檢視 ssh 命令的版本為 7.7.2.1:

在另外一臺機器上用個老一點的版本(7.6.0.0)試了試:

沒有發現重複輸出歡迎資訊的問題,判斷可能是新版本引入的 bug。

連線遠端 Windows 主機
當 Windows 系統中安裝好 OpenSSH Server 並開始監聽埠後就可以通過遠端的客戶端來連線了。連線遠端 Windows 主機與連線遠端 Linux 主機相同,下面是通過密碼登入的方式(nick 是 Windows 系統中的一個本地使用者):

連線成功後預設的 shell 是 Windows Command shell (cmd.exe) 程式:

在 Windows 系統中,PowerShell 已逐漸成為主流,我們可以把預設的 shell 設定為 PowerShell。其實就是在執行 OpenSSH Server 的 Windows 系統的登錄檔中新增一個配置項,登錄檔路徑為 HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH,項的名稱為 DefaultShell,項的值為 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。我們可以以管理員身份啟動 PowerShell,然後執行下面的命令完成登錄檔項的新增:

> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

現在重新連線遠端伺服器,預設的 shell 已經變成了 PowerShell:

通過祕鑰認證方式登入

前面我們介紹的 ssh 命令都是通過密碼認證連線伺服器的,下面介紹通過祕鑰認證的方式登入伺服器。

ssh-keygen 命令
ssh-keygen 命令用來生成公鑰認證使用的祕鑰對,建立的祕鑰一般都和 ssh 客戶端的配置一起儲存在使用者家目錄下的 .ssh 目錄中(與 Linux 系統中類似):

執行 ssh-keygen 命令:

> ssh-keygen

預設情況下一路回車就可以了,使用預設的檔名稱和存放目錄:

遺憾的是 Windows 下目前還沒有提供 ssh-copy-id 命令,需要手動把使用者的公鑰新增到遠端主機系統中的使用者的  authorized_keys 檔案中。具體在執行 OpenSSH Server 的主機上的操作步驟如下:
在使用者家目錄下建立 .ssh 目錄
開啟 PowerShell,進入使用者的家目錄,用 mkdir 命令建立 .ssh 目錄:

> cd ~
> mkdir .ssh

建立 authorized_keys 檔案並加入公鑰
在 PowerShell 中執行 notepad .ssh\authorized_keys 命令建立文字檔案,把客戶端的公鑰複製到這個檔案中並儲存。
把文字檔案的名稱修改為 authorized_keys:

修改 ssh 服務的配置檔案
以管理員許可權開啟 PowerShell,執行命令 notepad C:\ProgramData\ssh\sshd_config。
註釋掉配置檔案中的最後兩行然後儲存:

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

最後在服務管理器器中重啟 OpenSSH SSH Server 服務,然後客戶端就可以通過公鑰認證的方式登入到遠端伺服器了。

注意:
一定不要用 Repair-AuthorizedKeyPermission 命令修復 .ssh\authorized_keys 檔案的許可權。
也不要以下面的方式建立 .ssh\authorized_keys 檔案:

echo "publickey" > .ssh\authorized_keys
echo $null > .ssh\authorized_keys

總結

OpenSSH 的支援讓系統管理員有了一個方便的工具來管理 Windows 系統,相信 OpenSSH + PowerShell 的組合將成為管理 Windows 系統的黃金搭檔。本文只是介紹了一些入門的概念,但給人的感覺是 Windows 上的 OpenSSH 工具尚需打磨(問題挺多的,按照文件配置個公鑰認證就把人搞吐了)。

參考:
PowerShell/Win32-OpenSSH
OpenSSH in Windows
解決公鑰認證問題