
По умолчанию трафик в сеансе PowerShell Remoting шифруется независимо от того, используется ли транспортный протокол HTTP (TCP/5985) или HTTPS (TCP/5986). В любом случае, весь трафик шифруется с помощью ключа AES-256. Однако если вы подключаетесь к удаленному компьютеру за пределами леса AD или в рабочей группе (с которой Kerberos не может установить доверительные отношения), вы подвергаетесь риску атак типа «человек посередине». Microsoft рекомендует всегда использовать транспорт HTTPS для PSRemoting при подключении к сторонним компьютерам.
В этой статье мы покажем, как настраивать PowerShell Remoting через HTTPS , используя сертификат SSL. Сеансы PSRemoting по HTTPS обеспечивают более высокий уровень безопасности сеанса при подключении к компьютерам за пределами домена/леса AD.
В следующих шагах описывается, как настроить удаленное устройство под управлением Windows, к которому вы хотите подключиться с помощью PowerShell Remoting по HTTPS.
Убедитесь, что для сетевого расположения в Windows установлено значение Private или Domain:
Get-NetConnectionProfile
Включите WinRM и PSRemoting с помощью команды:
Enable-PSRemoting -Force
Чтобы настроить HTTPS для WinRM, вам сначала нужно создать SSL-сертификат на компьютере, к которому вы хотите подключиться. Сертификат будет использоваться для шифрования трафика WinRM. Проще создать самоподписанный сертификат с помощью PowerShell. В доменной среде вы можете выпустить сертификаты WinRM автоматически, используя Auto-Enrollment.
Укажите имя компьютера и его IP-адрес в качестве DNS-имени сертификата (это удобно, если в вашей сети нет 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
Вы можете получить список активных слушателей WSMan, как показано ниже:
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, разрешающее HTTPS-трафик WinRM, или убедитесь, что оно активно:
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\SSL_PS_Remoting.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\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\
Затем, чтобы подключиться к удаленному узлу Windows с помощью WinRM HTTPS, вы должны использовать команду -UseSSL аргумент в командах Enter-PSSession и Invoke-Command. В следующем примере мы подключимся к удаленному хосту из консоли PowerShell по его IP-адресу (обратите внимание, что мы не добавили этот IP-адрес в TrustedHosts):
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption
The SSL certificate contains a common name (CN) that does not match the hostname
.