通过SSL轻松设置PSRemoting以使用WinRM[分步指南]

如果您已經使用PowerShell Remoting (PSRemoting)執行遠程命令,您就知道這個功能有多方便。您可以連接到一個或多個遠程計算機,並像它們是本地的一樣對其進行管理。PSRemoting依賴於Windows Remote Management (WinRm)來實現,如果您沒有使用WinRM over SSL,可能會面臨一些安全問題。

在這個實踐教程中,您將學習如何在客戶端和服務器上設置Windows以使用WinRM over HTTPS(SSL),以及在使用WinRM over HTTPS時如何使用憑證進行身份驗證。

先決條件

如果您想跟隨這個教程,請確保您擁有以下內容:

  • A Windows 7+ or Server 2008 R2 machine to serve as the client machine. This tutorial will use Windows 10.
  • A Windows 7+ or Server 2008 R2+ machine to serve as the server machine. This tutorial will use Windows Server 2019.
  • 在客戶端和服務器機器上擁有本地管理帳戶或具有本地管理權限的帳戶。
  • Active Directory Certificate Services (ADCS) Public Key Infrastructure (PKI)的設置。對於生產環境,您可能需要實施ADCS,但對於本教程和測試而言,這是可選的。教程將假定PKI被設置為企業或獨立CA。

為什麼使用WinRM over SSL?

PSRemoting在開箱即用的情況下,使用WinRM允許您遠程管理客戶端機器。一旦PSRemoting通過WinRM建立會話,它會將所有從客戶端到服務器的通信進行加密。此外,實施PSRemoting而不使用HTTPS的設置過程相當簡單。

如果PSRemoting已經加密了會話通信,為什麼要麻煩地設置類似ADCS並管理證書,當它已經加密了呢?

因為在身份驗證過程中,憑據可能以不安全的格式發送,取決於使用的身份驗證類型

使PSRemoting更安全的最簡單方法之一是使用HTTPS而不是HTTP進行WinRM。HTTPS將整個連接流包裹在WinRM已經使用的加密層中,包括身份驗證。HTTPS還同時提供了一種驗證您正在連接的服務器是否符合您的期望的方法。

使用自簽名證書配置WinRM

現在讓我們進入示範。首先,您將學習如何使用通過自簽名證書通過SSL設置加密的PSRemoting通信。

使用自簽名憑證是在設置測試環境時不必擔心像 ADCS 這樣的 PKI 的一種絕佳方式。當您使用自簽名憑證時,您生成一個由服務器自行簽署的憑證,基本上是對自身的擔保。

憑證通常存在來執行兩項任務; 驗證連接並對其進行加密。使用自簽名憑證僅實現後者。為了驗證服務器的身份,您必須始終使用由 PKI 提供的憑證。PKI 提供的憑證提供了單一的信任來源,而不是手動信任每個自簽名憑證。

使用自簽名憑證配置帶 SSL 的 WinRM 需要四個高級步驟:

  1. 在目標機器上創建自簽名憑證。
  2. 配置服務器的 WinRM web 服務器(監聽器) 以使用自簽名憑證進行身份驗證。
  3. 在目標機器的 Windows 防火牆上打開相應的端口。
  4. 在客戶端上使用 PowerShell cmdlet(如 Enter-PSSession)執行命令以啟動遠程連接。

現在讓我們逐步進行每一步。

創建自簽名憑證

首先,需要在服務器上生成一個自簽名憑證。在連接時,PSRemoting 將使用此憑證對所有通信進行加密。

當在ServerB上,以管理員身份打開Windows PowerShell控制台時,如下運行New-SelfSignedCertificate cmdlet。運行下面的命令為ServerB.domain.com本機的個人證書存儲

New-SelfSignedCertificate -Subject 'CN=ServerB.domain.com' -TextExtension '2.5.29.37={text}1.3.6.1.5.5.7.3.1'
Creating self-signed certificate.

生成一個證書。Subject參數應該是伺服器的完全合格域名。WinRm使用主題來驗證伺服器的身份。

即使伺服器在工作組中,總是提供一個域名,例如domain.com或lab.local。當連接到目標機器時,您連接到的DNS名稱必須與此主題名稱完全匹配,否則連接將失敗。

TextExtension允許您定義證書的密鑰使用(2.5.29.37),這定義了證書被允許用於什麼。為服務器認證({text}1.3.6.1.5.5.7.3.1)定義密鑰使用,以確保證書只能用於驗證服務器的身份。

New-SelfSignedCertificates運行之後,它將返回它生成的證書的指紋。保存這個,因為你將需要它來進行下一個命令。

配置WinRM監聽器

一旦在服务器上创建了自签名证书,然后配置WinRm监听器以开始使用该证书进行身份验证。为此,请使用如下所示的winrm create命令。

命令中的Address=*指示监听器在服务器上侦听配置的任何IP地址。如果服务器配置了多个IP地址,您可以在此处定义特定的IP地址。

确保将<cert thumbprint here>占位符替换为上一步返回的指纹。

winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ServerB.domain.com"; CertificateThumbprint="<cert thumbprint here>"}'
Creating WinRM listener with self-signed certificate.

打开WinRM SSL防火墙端口

接下来,如果使用Windows防火墙,您将不得不允许通过默认的HTTPS端口5986进入服务器的HTTPS流量。

通过运行以下命令,使用PowerShell为WinRM通过HTTPS打开防火墙端口。

$FirewallParam = @{
    DisplayName = 'Windows Remote Management (HTTPS-In)'
    Direction = 'Inbound'
    LocalPort = 5986
    Protocol = 'TCP'
    Action = 'Allow'
    Program = 'System'
}
New-NetFirewallRule @FirewallParam

通过SSL连接到服务器

您现在已配置远程Windows服务器以接受通过SSL的WinRM连接。此时,请返回到客户端并发起任何您想测试的PSRemoting命令。例如,您可以尝试Enter-PSSessionInvoke-Command cmdlet。只是现在,您连接方式与默认的HTTP连接有些不同。

通常,連線透過 HTTPS 需要一個參數 UseSSL。此參數告訴命令尋找 HTTPS WinRM 監聽器,而不是像預設情況下尋找 HTTP 監聽器。 UseSSL 參數在更多的 PSRemoting 命令中可用。

為了測試,執行 Enter-PSSession 命令,提供伺服器的 FQDN(由自簽名憑證主題定義)、一個 PSCredential 物件以定義用戶名和密碼,最後,使用 UseSSL 開關參數。

Enter-PSSession -ComputerName ServerB.domain.com -Credential (Get-Credential) -UseSSL

如果您執行上述命令,您將收到一個錯誤訊息,因為您已經配置了伺服器上的 WinRM 監聽器以使用自簽名憑證。每當 PSRemoting 客戶端嘗試驗證到伺服器時,它將嘗試驗證憑證,但無法驗證。自簽名憑證沒有一個 信任鏈,命令無法跟隨並失敗。

Failing certificate authority trust check with self-signed certificate.

要連接到具有自簽名憑證的伺服器,您必須覆蓋憑證信任檢查。您可以通過使用 New-PSSessionOption 命令Let 創建名為 SkipCACheck 的 PSSessionOption,並將其傳遞給下面顯示的命令來實現此目的。

$PSSessionOption = New-PSSessionOption -SkipCACheck
Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -SessionOption $PSSessionOption -UseSSL

您可以定義許多不同的 PSSessionOption 對象,以添加在 Enter-PSSession 命令中未直接包含的遠程連接選項。

嘗試再次進行連接,PowerShell 現在應該提示您輸入憑證。提供憑證後,您應該能夠通過 SSL 連接到伺服器!

使用 CA 簽名憑證配置 WinRM

如果您打算在生產環境中使用使用 WinRM 的 PSRemoting,並希望保持盡可能安全,您需要專注於使用憑證授權機構(CA)簽名的憑證進行 SSL 上的 WinRM。

CA 簽名的憑證維護了信任鏈,比簡單的自簽名憑證更安全,因為它們驗證憑證發行者的身份。

如果您在 Active Directory 環境中,設置 CA 的其中一種最常見方法是使用 ADCS。使用 ADCS,您可以將憑證部署到設備並配置 WinRM 使用這些憑證。

本教程假定您已在您的环境中设置并运行了ADCS。

要进行快速设置,您可以按照Microsoft的文档进行操作,但对于生产部署,您应该深入研究配置,因为证书颁发机构是组织加密工作的核心。

创建证书请求

使用CA颁发的证书的第一步是创建证书。要创建证书,您首先必须使用证书签名请求(CSR)发出证书请求。一旦生成了此CSR,就可以将其发送给CA以发出证书。

本节的步骤适用于ADCS部署,无论是企业CA还是独立CA。如果使用AD集成的企业CA,则可以通过证书自动注册或证书模板加速注册证书,而无需执行本节中的步骤。

在伺服器(本教程中的 ServerB)上,建立 CSR:

  1. 運行 certlm.msc 以打開 Windows 憑證管理器。

2. 在 個人 存儲上右鍵單擊,然後選擇 所有任務 —> 高級操作 —> 創建自定義請求

3. 對於本教程,將所有字段保留為默認值,直到到達下面所示的 憑證信息 頁面。到達此處時,單擊 詳細信息 下拉菜單,然後選擇 屬性

Creating a custom certificate request.

4. 點擊 主題 標籤,並將 類型 更改為 通用名稱

5. 現在,如果伺服器已加入網域,請輸入其完全限定域名,否則只需輸入主機名,然後點擊 添加

Specifying subject for certificate request.

請注意,要與 WinRM SSL 監聽器一起使用,您必須使用通用名稱。列表中的其他選項可以包括,但對於此部署並非必需。

6. 點擊 擴展 標籤。

7. 如果您不使用後續將介紹的基於憑證的身份驗證,請擴展擴展金鑰使用標頭並添加伺服器驗證。此金鑰使用類型告訴 Windows 憑證應用於驗證伺服器。其他選項包括客戶端驗證、代碼簽署和文件加密。

8. 如果您想設置基於憑證的身份驗證,請確保選擇如下所示的客戶端驗證

Requesting a client authentication certificate.

9. 接下來,點擊私鑰選項卡,注意金鑰選項。將默認金鑰大小從 1024 更改為至少 2048 以加強金鑰對的安全性。

在 Windows 中還有更強大的加密提供者可用,但您可能會遇到與舊軟件的不兼容性。

10. 關閉憑證屬性窗口,並通過點擊確定保存您的設置,然後點擊下一步繼續進行提示。

11. 現在提供一個輸出憑證請求的路徑,您可以稍後檢索它,然後點擊完成

完成後,您應該有一個憑證請求文件。

請求憑證

一旦創建了請求,您現在需要將該請求提交給您的 CA,該 CA 將生成憑證。為此,請執行以下操作:

  1. 導航至您的 ADCS 伺服器,網址為http://<server name FQDN>/certsrv/certrqxt.asp。
Certificate request submission web page.

2. 使用記事本打開之前創建的證書請求文件,將證書請求文件中的文本複製到請求框中。對於此證書,不需要任何額外屬性

3. 點擊提交。這將把您的請求提交給 CA。然後它應該顯示請求 ID,稍後將需要它。記住這一點!您以後會需要它。

4. 現在通過在本地計算機上運行certsrv.msc來連接到您 ADCS 環境中的 CA 服務器,或者通過 RDP 連接。

5. 點擊待處理的請求。

Winrm over SSL : Issuing certificate from pending request.

6. 右鍵點擊待處理的請求,點擊所有任務,然後點擊發放。這將根據之前步驟中的請求 ID 批准您剛提交的請求。

註冊證書

現在您已在 CA 上發放了證書,是時候在配置 WinRM 的服務器上註冊證書了。要做到這一點:

  1. 從您正在配置 WinRM 以進行 SSL 的服務器上,瀏覽至http://<server name FQDN>/certckpn.asp。您應該會看到一個待處理的證書請求。
Viewing status of pending certificate request.

如果需要,您可以從不同的機器檢索公共證書,但從您為 WinRM over HTTPS 配置的服務器開始,可以簡化流程。

2. 從列表中選擇您提交的請求並下載證書鏈。如果您配置WinRM over HTTPS的服務器將您的CA設置為根服務器,則應下載整個證書鏈。

Downloading certificate chain.

3. 打開證書鏈文件。您應該能夠看到服務器的證書以及鏈中較高的任何證書授權機構的證書。在win2.lab.int之下是所請求的證書,而WIN2-CA是為win2.lab.int發行證書的CA的證書。

Showing certificates inside of the certificate chain.

4. 雙擊其中一個證書,在打開的對話框中,點擊安裝證書按鈕。由於此證書將由服務器而不是特定用戶使用,請將選項更改為本地計算機

Importing certificate into the local machine certificate store.

5. 繼續按照提示進行操作,保持所有默認值不變。默認值應該將證書放在可信任的根證書存儲中。

6. 現在,對於列表中的每個其他證書,重複執行步驟3-5。如果您有多個證書,請確保將所有其他證書放在中間證書授權機構存儲中。

創建並設置WinRM HTTPS監聽器

現在,所有證書都已安裝完畢,是時候在服務器上配置WinRM以使用該證書作為監聽器。

在WinRm服務器上打開PowerShell:

  1. 執行以下命令以自動設置 WinRm 監聽器。 winrm 命令通過搜索本地機器證書存儲庫來查找符合 WinRM 要求的證書來完成此操作。
winrm quickconfig -transport:https

2. Windows 防火牆默認封鎖 WinRM HTTPS 端口 5986。 為確保防火牆允許入站端口 5986,請運行以下 PowerShell 命令:

$FirewallParam = @{
     DisplayName = 'Windows Remote Management (HTTPS-In)'
     Direction = 'Inbound'
     LocalPort = 5986
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

測試 WinRM SSL 連接

在這一點上,您已經準備好連接。 使用您喜歡的 PSRemoting 命令,如 Invoke-CommandEnter-PSSession,連接到服務器並使用 UseSSL 參數。

Enter-PSSession -ComputerName ServerB.domain.com -UseSSL -Credential (Get-Credential)

請始終確保 ComputerName 參數的值與證書創建期間提供的公用名稱完全匹配。 如果您嘗試連接到不同的主機名稱或者主機的 IP 地址,您將收到證書不匹配錯誤,導致連接失敗。

設置基於 證書的身份驗證

到目前為止,您應該已經設置了一個使用 HTTPS 的 WinRM 監聽器。 如果是這樣,您也可以使用用戶驗證證書來作為遠程服務器上的本地用戶進行身份驗證。 使用用戶證書是最安全的方法之一,但設置時間較長。 您會發現,這也是一項重複的工作,因為每個證書都是獨一無二的,對應於個別的客戶機。

基於證書的身份驗證僅適用於本地用戶帳戶,而不適用於域用戶。

假設您在創建憑證請求部分請求了用於客戶端驗證的證書,請繼續閱讀:

啟用證書驗證並在服務器上映射用戶

  1. 在服務器上運行Set-Item命令以允許基於證書的身份驗證。
Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true

2. 接下來,運行Get-ChildItem以查看受信任的根證書授權機構存儲,以查找發行客戶端驗證證書的CA的指紋。為此,按包含您CA名稱的主題篩選證書。

Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -like 'CA-Name'}

3. 在下面的命令中運行,其中SubjectName是創建證書時提供的用戶證書的主題。

CAThumbprint是使用上一個命令收集的CA指紋,然後提示輸入憑證驗證所使用的本地用戶的用戶名和密碼。

New-Item WSMan:\localhost\ClientCertificate -Subject SubjectName -URI * -Issuer CAThumbprint -Credential (Get-Credential)

測試基於證書的身份驗證

現在已設置證書到用戶的映射,使用客戶端機器上的證書進行身份驗證而無需提供憑據。

在PowerShell中的客戶端,通過查看個人證書存儲獲取客戶端證書的指紋。

Get-ChildItem Cert:\CurrentUser\My

現在在PSRemoting命令中指定指紋到CertificateThumbprint參數,如下所示。

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

請注意,由於基於憑證的身份驗證僅能與HTTPS監聽器一起使用,-UseSSL 被隱含,不像其他身份驗證方法需要指定使用SSL。

下一步驟

現在您已經學會如何設置使用SSL的WinRM,更多關於我們的PowerShell Remoting: The Ultimate Guide文章!

想要更深入了解PowerShell,包括有關PSRemoting的許多內容嗎?查看PowerShell for Sysadmins,這本書

Source:
https://adamtheautomator.com/winrm-ssl/