在SSL上进行WinRM点按以设置PSRemoting【逐步操作】

如果您已经在运行远程命令时使用了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更安全的最简单方法之一是使用WinRM的HTTPS而不是HTTP。HTTPS将整个连接流,包括在WinRM已经使用的加密层内的身份验证,都封装在一起。HTTPS还同时提供了一种验证您正在连接的服务器是否是您认为的服务器的方法。

使用自签名证书配置WinRM

现在让我们进入演示。首先,您将学会如何使用自签名证书通过SSL加密PSRemoting通信的设置。

使用自签名证书是在设置测试环境时无需担心像ADCS这样的PKI的一种好方法。当你使用自签名证书时,你生成一个由服务器本身签名的证书,基本上是为自己背书。

证书通常用于执行两个任务; 验证连接和加密连接。使用自签名证书仅实现后者。要验证服务器的身份,您必须始终使用由PKI提供的证书。PKI提供的证书提供了单一的信任源,而不是必须手动信任每个自签名证书。

使用自签名证书配置带有WinRM的SSL需要四个高级步骤:

  1. 在目标机器上创建自签名证书。
  2. 配置服务器的WinRM Web服务器(监听器)以使用自签名证书进行身份验证。
  3. 在目标机器的Windows防火墙上打开适当的端口。
  4. 使用PowerShell cmdlet(例如Enter-PSSession)在客户端上执行命令以启动远程连接。

现在让我们逐步进行每个步骤。

创建自签名证书

第一步是在服务器上生成自签名证书。在连接时,PSRemoting将使用此证书加密所有通信。

在管理员权限的 Windows PowerShell 控制台上,使用以下命令在 ServerB 上运行 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 后,它将返回所生成证书的 thumbprint。保存此 thumbprint,因为您将在下一个命令中需要它。

配置 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-PSSession Invoke-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.

要使用自签名证书连接到服务器,您必须覆盖证书信任检查。您可以通过创建一个名为SkipCACheck的PSSessionOption,使用New-PSSessionOption cmdlet来执行此操作,并将其传递给如下所示的命令。

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

您可以定义许多不同的PSSessionOption对象,以添加一些未直接包含在Enter-PSSession cmdlet 中的选项,用于远程连接。

尝试重新连接,PowerShell 现在应该提示您输入凭据。提供凭据后,您现在应该能够通过 SSL 连接到服务器了!

使用 CA 签名证书配置 WinRM

如果您打算在生产环境中使用 WinRM 进行 PSRemoting 并希望保持尽可能安全,您需要专注于使用证书颁发机构(CA)签名的证书的 WinRM over SSL。

CA 签名证书维护信任链,并且比简单的自签名证书更安全,因为它们验证证书颁发者的身份。

如果您处于 Active Directory 环境中,设置 CA 的最常见方法之一是使用ADCS。通过 ADCS,您可以向设备部署证书并配置 WinRM 使用这些证书。

本教程将假定您已经在您的环境中设置并启用了 ADCS。

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

创建证书请求

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

当企业使用的是企业 CA 或独立 CA 时,本节的步骤将适用于 ADCS 部署。如果您使用的是 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,以生成证书。操作如下:

  1. 导航至您的 ADCS 服务器,网址为 http://<服务器名称 FQDN>/certsrv/certrqxt.asp。
Certificate request submission web page.

2. 打开先前创建的证书请求文件,使用记事本将文件中的文本复制到请求框中。对于此证书,附加属性不需要任何内容。

3. 点击提交。这将向CA提交您的请求。然后,应显示请求ID,稍后会用到。保存好这个!您以后会需要它。

4. 现在通过运行certsrv.msc在本地计算机上使用Windows证书管理器或通过RDP连接到您的ADCS环境中的CA服务器。

5. 点击待处理请求

Winrm over SSL : Issuing certificate from pending request.

6. 右键单击待处理请求,选择所有任务,然后点击签发。这将批准您刚刚基于先前步骤中的请求ID提交的请求。

颁发证书

现在您已在CA上颁发了证书,是时候在配置WinRM的服务器上注册证书了。执行以下步骤:

  1. 从您正在设置WinRM over SSL的服务器上导航到 http://<服务器名称FQDN>/certckpn.asp。您应该会看到一个待处理的证书请求。
Viewing status of pending certificate request.

如果需要,您可以从其他计算机检索公共证书,但从为WinRM over HTTPS设置的服务器开始可以简化流程。

2. 从列表中选择您提交的请求并下载证书链。如果您正在配置WinRM通过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防火墙默认会阻止5986端口的WinRM HTTPS。为确保防火墙允许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 cmdlet,如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。

下一步

现在您已经学会如何设置WinRM over SSL,请在我们的PowerShell Remoting: The Ultimate Guide帖子中了解更多!

想要更多了解PowerShell,包括有关PSRemoting的详细信息吗?查看PowerShell for Sysadmins,这本书

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