Настройка подключения к Windows по протоколу WinRM

ИНСРУКЦИЯ ПОДКЛЮЧЕНИЯ К УЗЛУ ИССЛЕДУЕМОЙ СЕТИ ПО ПРОТОКОЛУ WINRM
Для проведения задач «Инвентаризация» и «Аудит» необходимо активное подключение к узлам исследуемой сети с заведенными учетными записями для этих узлов.
Для корректного подключения к узлу исследуемой сети по протоколу WinRM необходимо произвести предварительную настройку узла исследуемой сети.

Б.1 Настройка подключения по протоколу WinRM с помощью поставляемого скрипта
Для настройки необходимо выполнить следующие действия:
− убедиться, что на узле, к которому планируется подключение, установлены powershell 5.1 и .Net framework 4;
− запустить Windows PowerShell от имени администратора;
− выполнить скрипт изначальной настройки WinRM:

Powershell.exe -ExecutionPolice Bypass -File winrm.ps1;
− после успешного выполнения данного скрипта становится возможным подключение к узлу исследуемой сети по протоколу WinRM через basic аутентификацию;

Для работы с парами ключей (WinRM KeyPair) необходимо дополнительно выполнить следующие действия:
− скопировать на АРМ оператора, с которого производится управление Сканер-ВС, публичный ключ в формате CER или PEM в файл;
− выполнить скрипт:

Powershell.exe -ExecutionPolicy Bypass -File clientCert.ps1 <путь к файлу с ключом> <имя пользователя> <пароль>
где <путь к файлу с ключом> – путь к сохраненному файлу, содержащему публичный ключ в формате CER или PEM;
<имя пользователя> и <пароль> –аутентификационные данные, которые будут использоваться для подключения к узлу исследуемой сети по протоколу WinRM;
− после успешного выполнения данного скрипта становится возможным подключение к узлу исследуемой сети по протоколу WinRM с использованием пары ключей WinRM KeyPair.

Примечания:

  1. Необходимые для настройки подключения по протоколу WinRM, а также отмены внесенных изменений файлы при установке Сканер-ВС по умолчанию сохраняются в папке /opt/echelon/scanner/scripts. Так же необходимые файлы можно скачать, перейдя по ссылке https://localhost/winrm/.
  2. Для установки подключения по протоколу WinRM с использованием пары ключей типа «EC P521» в командной строке Windows PowerShell необходимо выполнить следующую команду:
    Enable-TlsEccCurve nistp521

Б.2 Ручная настройка подключения по протоколу WinRM
Поставляемый со Сканер-ВС скрипт настройки удаленного подключения по протоколу WinRM работает только в том случае, если на узле, к которому необходимо подключиться для проведения задач «Инвентаризация» или «Аудит», установлены powershell 5.1 и .Net framework 4 или более поздние их версии.
В том случае, если на узле исследуемой сети нет возможности обновить данные утилиты до указанных версий, необходимо произвести настройку удаленного подключения по протоколу WinRM вручную.
Для ручной настройки удаленного подключения по протоколу WinRM необходимо выполнить следующие действия:

  1. Запустить приложение «Windows PowerShell» от имени администратора;

  2. Включить удаленное взаимодействие PowerShell на активе сети, для чего в командной строке Windows PowerShell выполнить следующую команду:

enable-psremoting -force
3. Запустить службы WinRM на активе сети, с помощью следующей команды:

winrm qc
При выполнении данной команды происходит создание следующих параметров по умолчанию для службы WinRM Listener:
− Adress – указание адреса, для которого запускается служба WinRM Listener;
− Transport – указывает вид протокола прикладного уровня для отправки и получения запросов и ответов (HTTP или HTTPS). По умолчанию принимается значение HTTP;
− Port – указание TCP-порта, для которого запускается служба WinRM Listener;
− Hostname – имя узла, на котором выполняется служба WinRM;
− Enabled – статус службы WinRM Listener (true или false), по умолчанию принимает значение true;
− CertificateThumbprint – указание отпечатка сертификата службы;
− ListeningOn – указание адресов, которые использует служба WinRM Listener.
4. Сгенерировать сертификат, для чего скопировать следующий скрипт в файл формата «txt»:

$hostnonFQDN = $env:computerName 
$hostFQDN = [System.Net.Dns]::GetHostByName(($env:computerName)).Hostname 
$SignatureAlgorithm = "SHA256" 
$name = New-Object -COM "X509Enrollment.CX500DistinguishedName.1" 
$name.Encode("CN=certname", 0) 
$key = New-Object -COM "X509Enrollment.CX509PrivateKey.1" 
$key.ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider"  

$key.KeySpec = 1 
$key.Length = 4096 
$key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)" 
$key.MachineContext = 1 
$key.Create() 
$serverauthoid = New-Object -COM "X509Enrollment.CObjectId.1" 
$serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.1") 
$ekuoids = New-Object -COM "X509Enrollment.CObjectIds.1" 
$ekuoids.Add($serverauthoid) 
$ekuext = New-Object -COM "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1" 
$ekuext.InitializeEncode($ekuoids) 
$cert = New-Object -COM "X509Enrollment.CX509CertificateRequestCertificate.1" 
$cert.InitializeFromPrivateKey(2, $key, "") 
$cert.Subject = $name 
$cert.Issuer = $cert.Subject 
$cert.NotBefore = (Get-Date).AddDays(-1) 
$cert.NotAfter = $cert.NotBefore.AddDays(1095) 
$SigOID = New-Object -ComObject X509Enrollment.CObjectId 
$SigOID.InitializeFromValue(([Security.Cryptography.Oid]$SignatureAlgorithm).Value) 
[string[]] $AlternativeName += $hostnonFQDN 
$AlternativeName += $hostFQDN 
$IAlternativeNames = New-Object -ComObject X509Enrollment.CAlternativeNames 
foreach ($AN in $AlternativeName) { 
$AltName = New-Object -ComObject X509Enrollment.CAlternativeName 
$AltName.InitializeFromString(0x3, $AN) 
$IAlternativeNames.Add($AltName) 
} 
$SubjectAlternativeName = New-Object -ComObject X509Enrollment.CX509ExtensionAlternativeNames 
$SubjectAlternativeName.InitializeEncode($IAlternativeNames) 
[String[]]$KeyUsage = ("DigitalSignature", "KeyEncipherment") 
$KeyUsageObj = New-Object -ComObject X509Enrollment.CX509ExtensionKeyUsage 
$KeyUsageObj.InitializeEncode([int][Security.Cryptography.X509Certificates.X509KeyUsageFlags]($KeyUsage)) 
$KeyUsageObj.Critical = $true 
$cert.X509Extensions.Add($KeyUsageObj) 
$cert.X509Extensions.Add($ekuext) 
$cert.SignatureInformation.HashAlgorithm = $SigOID 
$CERT.X509Extensions.Add($SubjectAlternativeName) 
$cert.Encode() 
$enrollment = New-Object -COM "X509Enrollment.CX509Enrollment.1" 
$enrollment.InitializeFromRequest($cert) 
$certdata = $enrollment.CreateRequest(0) 
$enrollment.InstallResponse(2, $certdata, 0, "") 
# extract/return the thumbprint from the generated cert 
$parsed_cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 
$parsed_cert.Import([System.Text.Encoding]::UTF8.GetBytes($certdata))
  1. В командной строке Windows PowerShell выполнить следующую команду:

powershell -executionpolicy bypass -file .\имя

где имя – имя файла формата «txt», в который был сохранен скрипт п. 4
6. Настроить службу WinRM Listener на работу через HTTPS. Для чего в командной строке Windows PowerShell выполнить следующие команды:

$thumbprint = "отпечаток сгенерированного сертификата" 
# Create the hashtables of settings to be used. 
$valueset = @{ 
Hostname = $env:COMPUTERNAME 
CertificateThumbprint = $thumbprint 
} 
$selectorset = @{ 
Transport = "HTTPS" 
Address = "*" 
} 
New-WSManInstance -ResourceURI 'winrm/config/Listener' -SelectorSet $selectorset -ValueSet $valueset
  1. Включить опции аутентификации службы WinRM с помощью следующих команд:

Set-Item -Path "WSMan:\localhost\Service\Auth\Basic" -Value $true 
Set-Item -Path WSMan:\localhost\Service\Auth\Certificate -Value $true 
8. Включить правила для Firewall с помощью выполнения следующих команд в командной строке Windows PowerShell: 

$fwtest1 = netsh advfirewall firewall show rule name="Allow WinRM HTTPS" 
$fwtest2 = netsh advfirewall firewall show rule name="Allow WinRM HTTPS" profile=any 
If ($fwtest1.count -lt 5) { 
netsh advfirewall firewall add rule profile=any name="Allow WinRM HTTPS" dir=in localport=5986 protocol=TCP action=allow 
} 
ElseIf (($fwtest1.count -ge 5) -and ($fwtest2.count -lt 5)) { 114 

netsh advfirewall firewall set rule name="Allow WinRM HTTPS" new profile=any 
}
  1. Установить значения регистра для выполнения команд с помощью протокола WinRM от имени администратора. Для чего выполнить следующие команды:

$token_path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" 
$token_prop_name = "LocalAccountTokenFilterPolicy" 
$token_key = Get-Item -Path $token_path 
$token_value = $token_key.GetValue($token_prop_name, $null) 
if ($token_value -ne 1) { 
if ($null -ne $token_value) { 
Remove-ItemProperty -Path $token_path -Name $token_prop_name 
} 
New-ItemProperty -Path $token_path -Name $token_prop_name -Value 1 -PropertyType DWORD > $null 
}

Для подключения с использованием сертификата необходимо выполнить следующие действия:

  1. Импортировать сертификат, используя следующие команды:

$certpath = “путь к сертификату”
Import-Certificate -FilePath $certpath -CertStoreLocation cert:\LocalMachine\root
Import-Certificate -FilePath $certpath -CertStoreLocation cert:\LocalMachine\TrustedPeople
2. Скопировать отпечаток сертификата открыв сертификат и скопировать значение из поля «CertificateThumbprint».
3. Выполнить следующие команды в Windows PowerShell:

$username = "имя пользователя" 
$passwordseq= "пароль" | ConvertTo-SecureString -AsPlainText -Force 
$thumbprint = "отпечаток" 

$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $passwordseq 
New-Item -Path WSMan:\localhost\ClientCertificate ` 
-Subject "*" ` 
-URI * ` 
-Issuer $thumbprint ` 
-Credential $credential ` 
-Force

Для установки подключения по протоколу WinRM с использованием пары ключей типа «EC P521» в командной строке Windows PowerShell необходимо выполнить следующую команду:
Enable-TlsEccCurve nistp521

Б.3 Ручная настройка подключения по протоколу WinRM для Windows Server 2008 и Windows 7
Для подключения к узлам исследуемой сети, функционирующим на базе старых версий ОС семейства Windows (Windows 7 и Windows Server 2008) по протоколу WinRM необходима их дополнительная настройка.
Для настройки таких узлов исследуемой сети необходимо выполнить следующие действия:

  1. Установить обновления для Windows Server 2008 Update to add support for TLS 1.1 and TLS 1.2 in Windows Server 2008 SP2, Windows Embedded POSReady 2009, and Windows Embedded Standard 2009 - Microsoft Support, для Windows 7 – Update to enable TLS 1.1 and TLS 1.2 as default secure protocols in WinHTTP in Windows - Microsoft Support.

  2. Перейти в редактор реестра нажав сочетание клавиш Win+R и введя «regedit».

  3. В редакторе реестра перейти по пути HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\

  4. Нажать правую кнопку мыши в любом месте в правой части окна редактора реестра и нажать «Создать» и выбрать в открывшемся списке «Раздел» и назвать его «TLS 1.2».

  5. В созданном разделе «TLS 1.2» аналогично создать два раздела с именами «Server» и «Client».

  6. В разделе «Server» нажать правую кнопку мыши, нажать «Создать» и в открывшемся списке выбрать «параметр DWORD (32 бита)».

  7. Переименовать созданный параметр в «DisabledByDefault» и присвоить ему значение «0».

  8. Аналогично создать параметр с именем «Enabled» и присвоить ему значение «1».

  9. Перейти в созданный на 5 раздел с именем «Client».

  10. Создать в этом разделе такие же два параметра, как и в разделе «Server».

  11. Перезагрузить настраиваемый узел исследуемой сети.

  12. Запустить от имени администратора Windows PowerShell.

  13. Ввести команду:

Enable-Psremoting -force
14. Запустить скрипт «winrm.ps1» с помощью команды:

Powershell.exe -ExecutionPolicy Bypass -File путь\до\файла\winrm.ps1
После выполнения скрипта «winrm.ps1» станет доступным подключение по протоколу WinRM методом Basic.
Для установки подключения методом KeyPair помимо настройки описанной ранее необходимо выполнить следующие дополнительные действия:

  1. Для настройки подключения необходимо скопировать сгенерированный с помощью Сканер-ВС публичный ключ и поместить его в файл с расширением «.cer» на узле исследуемой сети.

  2. Нажать комбинацию клавиш Win+R, ввести «mmc.exe» и нажать клавишу ввод.

  3. В открывшейся консоли управления нажать «Файл» и в открывшемся списке выбрать «Добавить или удалить оснастку…».

  4. В левой части открывшегося окна «Добавление и удаление оснасток» в разделе «Доступные оснастки» выбрать «Сертификаты» и нажать кнопку «Добавить >».

  5. В открывшемся окне «Оснастка диспетчера сертификатов» выбрать «учетной записи компьютера» и нажать кнопку «Далее >».

  6. В отобразившемся окне «Выбор компьютера» необходимо выбрать «локальным компьютером (тем, на котором выполняется эта консоль)» и нажать кнопку «Готово».

  7. В правой части окна «Добавление и удаление оснасток» в поле «Выбранные оснастки» появились «Сертификаты (локальный компьютер)».

  8. Необходимо выбрать данную оснастку путем нажатия на нее левой кнопкой мыши и нажать кнопку «ОК».

  9. Далее в левой части консоли управления необходимо нажать на «Сертификаты (локальный компьютер)» после чего отобразится список локальных хранилищ, соответствующих добавленной оснастке, в средней части окна консоли управления.

  10. В списке логических хранилищ необходимо найти «Личное», нажать на данное хранилище правой кнопкой мыши, выбрать «все задачи» и в открывшемся списке нажать на «Импорт…», после чего откроется мастер импорта сертификатов.

  11. В окне мастера импорта сертификатов необходимо нажать кнопку «Далее» и в отобразившемся интерфейсе импорта файлов добавить файл со скопированным на шаге 1 публичным ключом и нажать кнопку «Далее».

  12. Повторить добавление сертификата в хранилища с именами «Доверенные лица» и «Доверенные корневые центры сертификации».

  13. В окне консоли управления открыть импортированный сертификат, перейти к вкладке «Состав» и скопировать значение в поле «Отпечаток».

ВАЖНО! Отпечаток сертификата не должен иметь никаких пробелов ни в начале, ни в конце!
14. Открыть скрипт с именем «clientCertOld.ps1», который распаковывается при установке Сканер-ВС в папку /opt/echelon/scanner/scripts, либо его можно скачать перейдя по ссылке https://localhost/winrm/.
15. Скрипт должен иметь следующее содержание:


param($thumbprint, $username, $password) 
if (!$thumbprint -or !$username -or !$password){ 
write-host "need 3 arguments: certificate thumbprint, local username and password" 
return 
} 
$passwordseq= "$password" | ConvertTo-SecureString -AsPlainText -Force 
$thumbprint = "$thumbprint" 
# Создание маппинга сертификата 
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $passwordseq 
New-Item -Path WSMan:\localhost\ClientCertificate ` 
-Subject "*" ` 
-URI * ` 
-Issuer $thumbprint ` 
-Credential $credential ` 
-Force
  1. В данном скрипте необходимо заполнить поля «$passwordseq» и «$thumbprint» валидными паролем и отпечатком сертификата соответственно.
  2. Запустить Windows PowerShell от имени администратора.
  3. Запустить выполнение скрипта следующей командой:

Powershell.exe -ExecutionPolicy Bypass -File путь\до\файла\clientCertOld.ps1