Подробный гайд по настройке HTTPS для WinRM (с генерацией GPO Autoenrollment)
Настройка WinRM поверх HTTPS (порт 5986) с использованием автоматической выдачи сертификатов (Autoenrollment) — это золотой стандарт безопасности для удаленного управления Windows-инфраструктурой. Это позволяет шифровать трафик и использовать Kerberos/NTLM аутентификацию без риска перехвата учётных данных.
Предварительные требования
- Развернутая роль AD CS (Active Directory Certificate Services) — Enterprise CA.
- Целевые серверы находятся в домене Active Directory.
- Права Domain Admin или Enterprise Admin для настройки шаблонов и GPO.
Шаг 1. Создание шаблона сертификата для WinRM
WinRM требует сертификат с назначением Server Authentication (Проверка подлинности сервера) и корректным SAN (Subject Alternative Name).
- Откройте консоль управления шаблонами:
certtmpl.msc. - Найдите шаблон Web Server (Веб-сервер), нажмите правой кнопкой мыши ➔ Дублировать шаблон (Duplicate Template).
- Вкладка "Общее" (General):
- Имя шаблона:
WinRM HTTPS Auth - Срок действия: 2–5 лет (по стандартам вашей компании).
- Имя шаблона:
- Вкладка "Имя субъекта" (Subject Name):
- Выберите Построить из сведений Active Directory (Build from Active Directory information).
- Формат имени субъекта: Полное различающееся имя (Full distinguished name) или Общее имя (Common name).
- Включите: Имя участника-службы (UPN) и Имя DNS (DNS Name). Имя DNS критически важно для WinRM!
- Вкладка "Расширения" (Extensions):
- Убедитесь, что в "Политики приложения" (Application Policies) есть Проверка подлинности сервера (Server Authentication).
- Вкладка "Безопасность" (Security):
- Выберите группу Domain Computers (или создайте отдельную группу целевых серверов).
- Установите галочки: Чтение (Read) и Автозачисление (Autoenroll).
- Нажмите ОК.
- Откройте консоль ЦС (
certsrv.msc) ➔ Шаблоны сертификатов ➔ ПКМ ➔ Создать ➔ Выдаваемый шаблон ➔ выберитеWinRM HTTPS Auth.
Шаг 2. Настройка GPO для Autoenrollment (Автовыдача)
Теперь настроим групповую политику, чтобы серверы автоматически запрашивали и обновляли этот сертификат.
- Откройте
gpmc.mscи создайте новую GPO (например,PKI - WinRM Cert Autoenrollment), привяжите её к OU с целевыми серверами. - Перейдите в режим редактирования GPO:
Computer Configuration➔Policies➔Windows Settings➔Security Settings➔Public Key Policies. - Откройте Certificate Services Client - Auto-Enrollment (Клиент служб сертификации - Автозачисление):
- Состояние: Включено (Enabled).
- Обновлять просроченные сертификаты, обрабатывать ожидающие и удалять отозванные.
- Обновлять сертификаты, использующие шаблоны сертификатов.
- Откройте Certificate Services Client - Certificate Enrollment Policy (Клиент служб сертификации - Политика регистрации):
- Убедитесь, что выбрано Автообнаружение (Auto-discovery).
Примечание:
Чтобы сертификат появился на серверах мгновенно, выполните на них gpupdate /force и certutil -pulse.
Шаг 3. Настройка службы WinRM и Firewall через GPO
Создайте вторую GPO (например, Sec - WinRM HTTPS Configuration) и привяжите к тому же OU.
3.1. Включение службы WinRM
Computer Configuration ➔ Policies ➔ Administrative Templates ➔ Windows Components ➔ Windows Remote Management (WinRM) ➔ WinRM Service:
- Allow remote server management through WinRM: Enabled (IPv4/IPv6 фильтры:
*). - Specify channel binding token hardening level: Strict (Рекомендуется для защиты от MitM атак).
3.2. Настройка Windows Defender Firewall
Computer Configuration ➔ Policies ➔ Windows Settings ➔ Security Settings ➔ Windows Defender Firewall with Advanced Security:
1. Inbound Rules ➔ Создать правило:
- Разрешить TCP порт 5986 (WinRM HTTPS). Профиль: Domain.
2. Inbound Rules ➔ Создать правило (Делайте только после успешного теста HTTPS!):
- Блокировать TCP порт 5985 (WinRM HTTP). Это отключит небезопасный канал.
Шаг 4. Привязка сертификата к WinRM (Скрипт Startup)
GPO выдает сертификат в хранилище LocalMachine\My, но WinRM не всегда автоматически создает HTTPS-листенер, если в системе несколько сертификатов. Мы используем PowerShell Startup Script, который будет выполняться при загрузке сервера и гарантированно настраивать HTTPS.
1. В той же GPO (Sec - WinRM HTTPS Configuration) перейдите:
Computer Configuration ➔ Policies ➔ Windows Settings ➔ Scripts (Startup/Shutdown) ➔ Startup.
2. Перейдите на вкладку PowerShell Scripts и добавьте следующий скрипт (сохраните его как Set-WinRMHTTPS.ps1 в сетевой папке GPO):
# Ищем последний выданный сертификат с политикой Server Authentication
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {
$_.EnhancedKeyUsageList.ObjectId -contains "1.3.6.1.5.5.7.3.1" -and
$_.Subject -match $env:COMPUTERNAME -and
$_.NotAfter -gt (Get-Date)
} | Sort-Object NotBefore -Descending | Select-Object -First 1
if ($cert) {
$thumbprint = $cert.Thumbprint
# 1. Удаляем небезопасные HTTP листенеры (порт 5985)
$httpListeners = Get-ChildItem WSMan:\localhost\Listener | Where-Object { $_.Keys -contains "Transport=HTTP" }
foreach ($listener in $httpListeners) {
Remove-Item -Path $listener.PSPath -Force -ErrorAction SilentlyContinue
}
# 2. Проверяем, существует ли уже HTTPS листенер
$httpsListener = Get-ChildItem WSMan:\localhost\Listener | Where-Object { $_.Keys -contains "Transport=HTTPS" }
if (-not $httpsListener) {
# 3. Создаем HTTPS листенер (порт 5986)
$fqdn = [System.Net.Dns]::GetHostByName($env:COMPUTERNAME).Hostname
New-Item -Path WSMan:\localhost\Listener -Address * -Transport HTTPS -Hostname $fqdn -CertificateThumbprint $thumbprint -Force | Out-Null
Write-EventLog -LogName Application -Source "WinRM-Setup" -EventId 1001 -Message "WinRM HTTPS Listener created with cert: $thumbprint"
} else {
# Обновляем отпечаток, если сертификат обновился (Autoenrollment Renewal)
$currentThumb = (Get-Item WSMan:\localhost\Listener\*HTTPS*).CertificateThumbprint
if ($currentThumb -ne $thumbprint) {
Set-Item -Path WSMan:\localhost\Listener\*HTTPS*\CertificateThumbprint -Value $thumbprint -Force
}
}
# 4. Отключаем Compatibility HTTP Listener
Set-Item -Path WSMan:\localhost\Service\EnableCompatibilityHttpListener -Value $false -Force
}
Шаг 5. Применение и Тестирование
1. На целевом сервере обновите политики и форсируйте выдачу сертификата:
gpupdate /force
certutil -pulse
2. Проверьте, что сертификат появился в хранилище:
Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.EnhancedKeyUsageList.FriendlyName -eq "Server Authentication"}
- Перезагрузите сервер (или выполните скрипт вручную от имени SYSTEM/Администратора), чтобы отработал Startup Script.
4. Проверьте конфигурацию WinRM:
winrm enumerate winrm/config/listener
В выводе должен быть только Transport = HTTPS на порту 5986.
Тестирование подключения с рабочей станции администратора:
# Проверка доступности службы
Test-WSMan -ComputerName server01.domain.local -UseSSL
# Подключение к сессии
Enter-PSSession -ComputerName server01.domain.local -UseSSL
(Параметр -UseSSL обязателен, так как по умолчанию PowerShell Remoting пытается идти на порт 5985).
Важные нюансы и Troubleshooting
1. Проблема с CRL (Certificate Revocation List):
Если WinRM не может проверить статус отзыва сертификата (например, сервер не имеет доступа к HTTP-точкам публикации CRL вашего CA), подключение будет сбрасываться.
Решение:
Убедитесь, что все серверы имеют сетевой доступ к URL-адресам CRL, указанным в шаблоне ЦС, или добавьте в реестр сервера игнорирование проверки CRL для WinRM (не рекомендуется, но как временная мера):
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service /v allow_remote_requests /t REG_DWORD /d 1 /f
2. Ошибки "Cannot find a certificate...":
Убедитесь, что в шаблоне сертификата (Шаг 1) в поле Subject Name указано DNS Name. WinRM ищет сертификат, у которого в SAN (Subject Alternative Name) указано FQDN-имя сервера.
3. Блокировка порта 5985:
Никогда не блокируйте порт 5985 в Firewall (Шаг 3.2), пока не убедитесь на 100%, что HTTPS (5986) работает и скрипт привязки отработал. Иначе вы рискуете потерять удаленный доступ к серверам (придется заходить через консоль vSphere/Hyper-V).
4. Ansible / Terraform:
Если вы используете Ansible для управления этими серверами, не забудьте изменить параметры подключения в inventory или group_vars:
ansible_port: 5986
ansible_winrm_transport: kerberos # или ntlm
ansible_winrm_server_cert_validation: validate # или ignore, если есть проблемы с CRL
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.