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)
https://github.com/PowerShell/Win32-OpenSSH
PowerShell下載地址(文章所用的版本是v7.1.0)
https://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服務