По умолчанию трафик в сессии 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
Чтобы настроить 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:\LocalMachine\My
$srvCert
Новый SSL сертификат появится в персональном хранилище сертификатов компьютера.
По умолчанию для Powershell Remoting в Windows созданы два листенера на разных портах: HTTP на порту 5985 и HTTPS на 5986. Список активных листенеров можно получить так:
Get-ChildItem wsman:\localhost\Listener
Удалите стандартные HTTP и HTTPS листенеры:
Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse
Создайте новый HTTPS листенер и привяжите к нему ваш сертификат:
New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force
Создайте правило для 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:\PS\PsRemoting-Cert.cer
dir WSMan:\localhost\Service | ? Name -eq AllowUnencrypted
dir WSMan:\localhost\Client | ? Name -eq AllowUnencrypted
Если нужно, запретите использовать нешифрованные подключения:
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}'
Скопируйте cer файл на ваш компьютер и импортируйте его командой (или распространите сертфикат на компьтеры через GPO):
Import-Certificate -FilePath c:\PS\PsRemoting-Cert.cer -CertStoreLocation Cert:\LocalMachine\root\
Теперь для подключения к удаленному серверу через 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
he SSL certificate contains a common name (CN) that does not match the hostname
.