Подробный гайд по настройке HTTPS для WinRM (с генерацией GPO Autoenrollment)

Пошаговый гайд по настройке WinRM HTTPS: создание шаблона AD CS, автовыдача сертификатов через GPO и привязка PowerShell-скриптом.

2026.09.30                  


Подробный гайд по настройке HTTPS для WinRM (с генерацией GPO Autoenrollment)Подробный гайд по настройке HTTPS для WinRM (с генерацией GPO Autoenrollment) Настройка WinRM поверх HTTPS (порт 5986) с использованием автоматической выдачи сертификатов (Autoenrollment) — это золотой стандарт безопасности для удаленного управления Windows-инфраструктурой. Это позволяет шифровать трафик и использовать Kerberos/NTLM аутентификацию без риска перехвата учётных данных.


Предварительные требования

  1. Развернутая роль AD CS (Active Directory Certificate Services) — Enterprise CA.
  2. Целевые серверы находятся в домене Active Directory.
  3. Права Domain Admin или Enterprise Admin для настройки шаблонов и GPO.



Шаг 1. Создание шаблона сертификата для WinRM

WinRM требует сертификат с назначением Server Authentication (Проверка подлинности сервера) и корректным SAN (Subject Alternative Name).

  1. Откройте консоль управления шаблонами: certtmpl.msc.
  2. Найдите шаблон Web Server (Веб-сервер), нажмите правой кнопкой мыши ➔ Дублировать шаблон (Duplicate Template).
  3. Вкладка "Общее" (General):
    • Имя шаблона: WinRM HTTPS Auth
    • Срок действия: 2–5 лет (по стандартам вашей компании).
  4. Вкладка "Имя субъекта" (Subject Name):
    • Выберите Построить из сведений Active Directory (Build from Active Directory information).
    • Формат имени субъекта: Полное различающееся имя (Full distinguished name) или Общее имя (Common name).
    • Включите: Имя участника-службы (UPN) и Имя DNS (DNS Name). Имя DNS критически важно для WinRM!
  5. Вкладка "Расширения" (Extensions):
    • Убедитесь, что в "Политики приложения" (Application Policies) есть Проверка подлинности сервера (Server Authentication).
  6. Вкладка "Безопасность" (Security):
    • Выберите группу Domain Computers (или создайте отдельную группу целевых серверов).
    • Установите галочки: Чтение (Read) и Автозачисление (Autoenroll).
  7. Нажмите ОК.
  8. Откройте консоль ЦС (certsrv.msc) ➔ Шаблоны сертификатов ➔ ПКМ ➔ Создать ➔ Выдаваемый шаблон ➔ выберите WinRM HTTPS Auth.

Шаг 2. Настройка GPO для Autoenrollment (Автовыдача)

Теперь настроим групповую политику, чтобы серверы автоматически запрашивали и обновляли этот сертификат.

  1. Откройте gpmc.msc и создайте новую GPO (например, PKI - WinRM Cert Autoenrollment), привяжите её к OU с целевыми серверами.
  2. Перейдите в режим редактирования GPO: Computer Configuration ➔ Policies ➔ Windows Settings ➔ Security Settings ➔ Public Key Policies.
  3. Откройте Certificate Services Client - Auto-Enrollment (Клиент служб сертификации - Автозачисление):
    • Состояние: Включено (Enabled).
    • Обновлять просроченные сертификаты, обрабатывать ожидающие и удалять отозванные.
    • Обновлять сертификаты, использующие шаблоны сертификатов.
  4. Откройте 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"}
  1. Перезагрузите сервер (или выполните скрипт вручную от имени 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

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта