Удаленное управление PowerShell Remoting через WinRM HTTPS

По умолчанию трафик в сессии PowerShell Remoting шифруется независимо от того, используется ли для передачи протокол HTTP (порт TCP/5985) или HTTPS (порт TCP/5986). Весть трафик в любом случае шифруется с помощью ключа AES-256. Однако, если вы подключаетесь к удаленному компьютеру не вашем лесу AD, или в рабочей группе, с которой Kerberos не может обеспечить доверительные отношения , вы рискуете стать жертвой man-in-the middle атак. Microsoft рекомендует всегда исопльзовать HTTPS транспорт для PowerShell Remoting, когда вы подключаетесь к сторонним компьютерам.

В этой статье мы рассмотрим, как настроить PowerShell Remoting через HTTPS с помощью SSL сертификата, который обеспечивает более высокий уровень защиты ваших сессий к компьютерам не в домене Active Directory.

Следующие шаги описывают настройку удаленного Windows устройства, к которому вы хотите подключаться через PowerShell Remoting по HTTPS.

Убедитесь, что тип вашей сети (сетевого подключения) определяется как Private или Domain:

Get-NetConnectionProfile

Включите WinRM и PSRemoting с помощью команды:

Enable-PSRemoting -Force

В домене можно настроить WinRM через GPO .

Чтобы настроить HTTPS для WinRM, сначала вам нужно создать SSL сертификат на компьютере, к которому вы хотите подключиться. Этот сертификат будет использоваться для шифрования WinRM трафика. Проще всего создать самоподписанный сертификат с помощью PowerShell (в доменной среде вы можете автоматизировать выпуск сертификатов для WinRM через Auto Enrollment).

В качестве DNS имени сертификата будет указаны имя компьютера и его IP адрес (удобно, если вашей сети не DNS сервера). Оба значения для Subject Alternative Name сертфиката можно получить через PowerShell:

$hostName = $env:COMPUTERNAME
$hostIP=( Get-NetAdapter | Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:LocalMachineMy
$srvCert

Новый SSL сертификат появится в персональном хранилище сертификатов компьютера.

создать самоподписанный SSL сертификат для шифрования winrm трафика

По умолчанию для Powershell Remoting в Windows созданы два листенера на разных портах: HTTP на порту 5985 и HTTPS на 5986. Список активных листенеров можно получить так:

Get-ChildItem wsman:localhostListener

Удалите стандартные HTTP и HTTPS листенеры:

Get-ChildItem wsman:localhostListener | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse

Создайте новый HTTPS листенер и привяжите к нему ваш сертификат:

New-Item -Path WSMan:localhostListener -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force

привязать SSL сертификат к HTTPS listener winrm

Создайте правило для Windows Firewall , которое разрешает WinRM HTTPS трафик, или проверьте что она активно:

New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP

Перезапустите службу WinRM:

Restart-Service WinRM

Вы можете проверить к какому отпечатку сертификата привязан HTTPS листенер WinRM с помощью команды:

WinRM e winrm/config/listener

Удаленный хост настроен. Теперь вам нужно экспортировать SSL сертификат в cer файл:

Export-Certificate -Cert $srvCert -FilePath c:PSPsRemoting-Cert.cer

Не забудьте, проверить что конфигурации WinRM сервера и клиента запрещают нешифрованное подключение (по-умолчанию это так):

dir WSMan:localhostService | ? Name -eq AllowUnencrypted
dir WSMan:localhostClient | ? Name -eq AllowUnencrypted

AllowUnencrypted

Если нужно, запретите использовать нешифрованные подключения:

winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}'

Скопируйте cer файл на ваш компьютер и импортируйте его командой (или распространите сертфикат на компьтеры через GPO ):

Import-Certificate -FilePath c:PSPsRemoting-Cert.cer -CertStoreLocation Cert:LocalMachineroot

Теперь для подключения к удаленному серверу через WinRM HTTPS нужно использовать аргумент -UseSSL в командах Enter-PSSession и Invoke-Command . В следующем примере мы подключимся к удаленному хосту из консоли PowerShell по IP адресу (обратите внимание, что мы не добавляли этот IP адрес в TrustedHosts):

$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential kbuldogov -SessionOption $SessionOption

Enter-PSSession UseSSL - HTTPS подключение через PowerShell Remoting

При подключении по IP адресу если не использовать опцию SkipCNCheck появляется ошибка T he SSL certificate contains a common name (CN) that does not match the hostname .
EnglishRussianUkrainian