Windows 10系統運維之OpenSSH

隨著PowerShell和OpenSSH的日漸成熟,在客戶終端Windows居多的運維之中,使用Win32-OpenSSH和Powershell來管理一些客戶機變成了相當實用的一種解決方案。

OpenSSH 是安全 Shell (SSH) 工具的開放源程式碼版本,Linux 及其他非 Windows 系統的管理員使用此類工具跨平台管理遠程系統。 

SSH 基於客戶端-伺服器體系結構,用戶在其中工作的系統是客戶端,所管理的遠程系統是伺服器。 OpenSSH 包含一系列組件和工具,用於提供一種安全且簡單的遠程系統管理方法,其中包括:

  • sshd.exe,它是遠程所管理的系統上必須運行的 SSH 伺服器組件
  • ssh.exe,它是在用戶的本地系統上運行的 SSH 客戶端組件
  • ssh-keygen.exe,為 SSH 生成、管理和轉換身份驗證密鑰
  • ssh-agent.exe,存儲用於公鑰身份驗證的私鑰
  • ssh-add.exe,將私鑰添加到伺服器允許的列表中
  • ssh-keyscan.exe,幫助從許多主機收集公用 SSH 主機密鑰
  • sftp.exe,這是提供安全文件傳輸協議的服務,通過 SSH 運行
  • scp.exe 是在 SSH 上運行的文件複製實用工具

本篇重點主要介紹如何在 Windows 上使用 OpenSSH,包括安裝以及使用過程當中會出現的問題和解決辦法

在 Windows Server 2019 和 Windows 10 1809 中,OpenSSH 客戶端和 OpenSSH 伺服器是可單獨安裝的組件。 具有這些 Windows 版本的用戶可以直接安裝和配置 OpenSSH

但是,很多人使用的Windows版本都是有被精簡過的,不一定能直接通過「應用」>「應用和功能」>「管理可選功能」這種辦法來直接安裝配置。

碰上這種情況最直接的辦法就是直接在Github上面下載。

Win32-OpenSSH下載地址(文章所用的版本是v8.1.0.0p1-Beta)

//github.com/PowerShell/Win32-OpenSSH

PowerShell下載地址(文章所用的版本是v7.1.0)

//github.com/PowerShell/PowerShell

下載下來的是這樣的:

若要配置 OpenSSH 伺服器以在 Windows 上首次使用,請以管理員身份啟動 PowerShell,然後運行以下命令來啟動 SSHD 服務:(有防火牆的需要這樣設置,我自己默認都是關閉Windows防火牆)

Start-Service sshd
# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'
# Confirm the Firewall rule is configured. It should be created automatically by setup.
Get-NetFirewallRule -Name *ssh*
# There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled
# If the firewall does not exist, create one
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

首次使用 SSH(使用密碼驗證方式)

重點,在直接使用SSH的過程當中,Windows的用戶(遠程客戶端)需要設置密碼,Windows通過SSH的驗證方式有兩種,一種是使用密碼,一種密鑰對。

在Windows用戶(遠程客戶端)已經有設置密碼的情況下可以通過下面的方式進行連接。

在 Windows 上安裝 OpenSSH 伺服器後,可以從安裝了 SSH 客戶端的任何 Windows 設備上使用 PowerShell 來快速測試它。 在 PowerShell 中,鍵入以下命令:

Ssh administrator@D1

 

到任何伺服器的第一個連接都將生成類似以下內容的消息:

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

回答必須是「yes」或「no」。 回答 Yes 會將該伺服器添加到本地系統的已知 ssh 主機列表中。

系統此時會提示你輸入密碼。 作為安全預防措施,密碼在鍵入的過程中不會顯示。

在連接後,你將看到類似於以下內容的命令 shell 提示符: 

Administrator@D1 C:\Users\Administrator>

Windows OpenSSH 伺服器使用的默認 shell 是 Windows 命令行解釋器,這個默認Shell可以通過註冊表進行修改,比方改成PowerShell.

為 Windows 中的 OpenSSH 配置默認 shell

默認命令 shell 提供用戶使用 SSH 連接到伺服器時看到的體驗。 初始默認 Windows 是 Windows Command shell (cmd.exe)。 Windows 還包括了 PowerShell 和 Bash,第三方命令 shell 也可用於 Windows,並可配置為伺服器的默認 shell。

在HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH註冊表下添加字元串值DefaultShell,把shell 可執行文件的完整路徑添加上去就可以

再次使用 SSH(使用密鑰對驗證方式)

使用密碼方式驗證這種方式,簡單粗暴,但是假如遠程客戶端的密碼設置有的設置123456,有的設置abcefg等這種亂七八糟的時候,不太可能針對每台機子去記住對應的密碼,自然而然的這種通過密鑰對的方式就更受維護人員的喜歡。

密鑰對驗證方式可是理解成,每一台機子都分別安裝了一把鎖,這把鎖只有對應的鑰匙才能開啟,一把鑰匙對應一把鎖這個大家都很容易理解,像日常生活當中,鎖是當處可見的,可是鑰匙卻不是那麼經常見到,OpenSSH也是可以採取

這樣的方式來實現的。下面是官方的說法

關於密鑰對

密鑰對指的是由特定的身份驗證協議使用的公鑰和私鑰文件。

SSH 公鑰身份驗證使用不對稱加密演算法來生成兩個密鑰文件 – 一個為「私鑰」文件,一個為「公鑰」文件。 私鑰文件等效於密碼,在所有情況下都應當保護它們。 如果有人獲取了你的私鑰,則他們可以像你一樣登錄到你有權登錄的任何 SSH 伺服器。 公鑰放置在 SSH 伺服器上,並且可以共享,不會危害私鑰的安全。

將密鑰身份驗證用於 SSH 伺服器時,SSH 伺服器和客戶端會依據私鑰來比較所提供的用戶名的公鑰。 如果無法依據客戶端私鑰驗證伺服器端公鑰,則身份驗證失敗。

可以通過在生成密鑰對時要求提供密碼來通過密鑰對實現多重身份驗證(參見下文的密鑰生成)。 在身份驗證期間,會提示用戶輸入密碼,將使用該密碼以及 SSH 客戶端上的私鑰來對用戶進行身份驗證。

主機密鑰生成

公鑰具有特定的 ACL 要求,在 Windows 上,這些要求等同於僅允許管理員和 System 進行訪問。(這個是重點) 為使此更加簡單,

  • 已創建了 OpenSSHUtils PowerShell 模組來正確設置密鑰 ACL,並且應當將該模組安裝在伺服器上
  • 首次使用 sshd 時,將自動生成主機的密鑰對。 如果 ssh-agent 正在運行,則密鑰將自動添加到本地存儲中。

用戶密鑰生成

若要使用基於密鑰的身份驗證,首先需要為客戶端生成一些公鑰/私鑰對。 通過 PowerShell 或 cmd,使用 ssh-keygen 生成一些密鑰文件。

ssh-keygen

應當會顯示如下某些內容

添入相要放密鑰對的位置,添寫的是包括位置和文件名

接下會要求你輸入密鑰的密碼(建議輸入,雙重認證更加安全),並要求你再次確認

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

操作完成之後,在剛剛保存密鑰對的地方可以找到對應的公鑰和私鑰

id_rsa這個是私鑰(這個就是鑰匙,需要遠程哪台機子的時候就使用這個),id_rsa.pub這個是公鑰(這個就是鎖,要先放在遠程終端上面)。

部署公鑰

若要使用上面創建的用戶密鑰,需要將公鑰放置在伺服器上的一個文本文件中,該文件名為 authorized_keys,默認位於 users\username\.ssh\ 下。

如果用戶是歸屬administrators用戶組時,匹配的文件位置在C:\programdata\ssh\administrators_authorized_keys

這個可以在OpenSSH配置文件進行修改

 

至此可以通過OpenSSH進行登錄了

在使用的過程當中最經常出現的情況是

像這種許可權拒絕是最經常出現的,主要因為是由於默認情況情況,公鑰的許可權沒設置正確,默認情況下公鑰的安全屬性裡面可以看到

在這個安全許可權裡面多了Authenticated Users用戶組,去除掉,安全屬性裡面僅允許管理員和 System 進行訪問。

 

最後,

對於需要頻繁進行遠程管理的運維來說,有些僅僅只需要一行命令就可以解決問題,決不會想要進行多一步的操作,

在已經有安裝了PowerShell和OpenSSH的機子情況下,比方想要重啟遠程的電腦只需要一行程式碼,決不會想先SSH登錄再輸入命令,可以直接採用下面的程式碼直接進行重啟

Invoke-Command -HostName D1 -ScriptBlock { Restart-Computer -Force } -KeyFilePath "D:/id_rsa"

要想實現這種效果,需要在SSHD配置文件添加如下配置:

Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo

PowerShell 可執行文件的默認位置是 c:/progra~1/powershell/7/pwsh.exe。 該位置可能因 PowerShell 安裝方式而有所不同。

對於包含空格的任何文件路徑,必須使用 8.3 短名稱。 OpenSSH for Windows 中存在一個 bug,使空格在子系統可執行路徑中無效。

然後重啟Open SSH Server服務

 

Tags: