Windows 上的 SSH?使用 PowerShell Remoting 遠程管理 Windows 服務器


作者:陳計節
個人博客:https://blog.jijiechen.com/post/powershell-remoting/

在 Linux/Unix 世界里 SSH 是個好東西,SSH 是 Secure Shell 的縮寫,用它可以很容易連接到指定的服務器,並執行特定命令行。除了支持遠程終端,作為一種安全的通信協議,還為很多其他工具的提供安全通信功能(比如 Git)。

在本文里,SSH 主要指代的是基於 SSH 通信協議構建的安全終端連接。SSH 遠程連接用起來非常簡單,下面就是一個 ssh 的示例:

此處輸入圖片的描述
指定服務器地址,即可開啟連接——簡單到難以置信!然后,接下來的指令就是在目標機器上運行了。工作完成了,要斷開連接?照常一個 exit 命令即可終止會話,就像關閉一個終端一樣容易!
此處輸入圖片的描述
由於 SSH 本身是基於命令行環境的,所以如果要在一批遠程服務器上執行任務也很容易,寫一個 for 語句,很輕松就能完成:
此處輸入圖片的描述
於是,很多人發現,批量管理 Linux 服務器很輕松,即使沒有那些功能大而全的工具,只要有管理(使用)單台服務器的經驗,再加上 ssh 就可以輕松管理一個集群了。如果希望服務器能夠通過遠程管理,就需要在服務器上安裝配置 openssh-server 了。這在 Linux 上基本也只是幾個命令也就輕松搞定了。一切都是如此美好!

Windows 世界的遠程管理

當類似的工作回到 Windows 上,人們首先想到的遠程管理的方式是遠程桌面連接,就是這個窗口:
此處輸入圖片的描述
遠程桌面連接(RDP)也是一個神器,只要知道網絡地址(機器名稱),以及用戶名和密碼,就可以連接到任何一台 Windows 電腦上。連接建立之后,幾乎就像在操作本地電腦一樣地使用遠程電腦。 在實踐中我們發現,RDP 的表現相當不錯。即使在網絡不好的情況下,也能有良好的性能;遠程操作的不光是桌面,還有剪貼板和音視頻等豐富的資源。另外,RDP 的客戶端也是很豐富,不但可以跨平台(包括 macOS、Linux 和手機平板電腦等),還有很多能同時連接多個電腦的工具。下面是在 Mac 上連接 Windows 服務器的效果:
此處輸入圖片的描述

基於 WinRM 的 PowerShell Remoting

既然 Windows 上的圖形界面無法提供批量的遠程管理能力,那么命令行界面呢? 等一等,Windows 的命令行界面?Windows 有命令行界面嗎? 大概不少人會有這樣的疑問。答案不言自明,Windows 不光內置有命令行系統,而且很強大。只是大部分人不怎么用它而已。在早期,Windows 有命令提示符(cmd),后來 Windows 又添加了基於 .NET 的 PowerShell,大大強化了腳本化編程能力。

幸運的是,包括 PowerShell 的 Windows 的命令行體系提供了完善的遠程連接和批量執行的能力。與 SSH 類似,PowerShell Remoting 也只需要知道服務器地址,就可以輕松連接;而要結束會話,也是一樣的 exit 命令:
此處輸入圖片的描述
另外,PowerShell 中不少命令還專門為遠程執行提供了優化,比如 Invoke-Command 等。下面的代碼查詢兩台遠程計算機的界面語言(代碼引自文檔):

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock { Get-UICulture }

輸出結果為:

LCID    Name     DisplayName               PSComputerName
----    ----     -----------               --------------
1033    en-US    English (United States)   server01.corp.fabrikam.com
1033    en-US    English (United States)   server02.corp.fabrikam.com

PowerShell Remoting 是基於 Windows 內置的遠程管理技術 WinRM 提供的。如果希望 Windows 服務器能夠通過遠程管理,需要在服務器啟用 WinRM,並配置防火牆規則:

Enable-PSRemoting -SkipNetworkProfileCheck -Force
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

完成上述配置之后,客戶端使用 PowerShell 就可以使用 Enter-PSSession 等命令連接到服務器上了。

配置無密碼 的 PowerShell Remoting 體驗

密碼是一種簡單直觀,卻不夠安全的身份鑒別方法。說它不夠安全,主要原因是對於集群中的大量服務器而言,如果要分別使用不同的密碼,那么維護密碼表就成為一項麻煩事了。但如果都用相同的密碼,一旦密碼泄漏,整個集群都陷入風險。所以不少人只好選一個折衷,為集群中的計算機使用統一密碼的同時,又定時(比如每兩個月)集中改一次密碼。從而在便利和安全之間取得平衡。但始終,密碼登錄的方式是不夠安全的。 在登錄服務器時,SSH 支持使用密碼,還支持使用證書公鑰(public key)。證書公鑰登錄的原理是,管理員生成一對密鑰,將公鑰復制到服務器上,自己持有私鑰並保護好私鑰的內容。在需要連接服務器時,將在客戶端用私鑰與服務器進行一系列的登錄驗證后,開啟安全的通信。由於公鑰的公開並不會導致私鑰(private key)的安全風險,所以這種登錄方式並不會有泄漏風險。
此處輸入圖片的描述
PowerShell Remoting 的服務端 WinRM 支持兩種無密碼登錄的方式。一種是使用客戶端證書登錄,身份驗證過程與 SSH 很類似。另外它還支持借助 Active Directory 環境進行集中式登錄。 要為 WinRM 開啟客戶端證書登錄(Client Certificate),主要步驟有: 在服務端為 WinRM 啟用 Client Certificate 登錄功能 在服務端為 WinRM 啟用 HTTPS 支持,設置防火牆規則 在客戶端生成證書,並將證書的公鑰(public key)導入到服務器上,並映射到指定的服務器上的用戶 在客戶端將證書導入本地計算機 使用證書連接到服務器 這些步驟並不復雜,卻也沒有像配置 SSH 服務端那么簡單。所以我把這些腳本都寫好了,請轉到 GitHub 查看和下載。這里有一篇文章詳細介紹了各步驟中要使用的命令。
此處輸入圖片的描述
除了基於 WinRM 的客戶端證書登錄,新版本的跨平台 PowerShell 6 還支持基於 OpenSSH 直接提供與 Linux 服務器上的 SSH 完全一致的體驗。請轉到官方文檔了解具體配置方法,更多關於 PowerShell Remoting 的資料,還可以參考這本電子書

在服務器上啟用了 WinRM 之后,不光可以支持 PowerShell Remoting 功能,還能為 Windows 服務器提供其他眾多遠程管理功能。比如,著名的自動化配置軟件 Ansible 就可以使用 PowerShell Remoting 一樣的方式來為 Windows 服務器提供自動化配置能力,同時也很好地支持了上面介紹的客戶端證書登錄。 事實證明,經過上述簡單的配置,也可以很輕松地對 Windows 服務器進行批量的自動化管理了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM