Spec-Zone.ru › Ansible

Удаленное управление Windows

В отличие от хостов Linux/Unix, которые по умолчанию используют SSH, хосты Windows настроены с помощью WinRM. В этом разделе рассматривается настройка и использование WinRM с Ansible.

  • Что такое WinRM?
  • Параметры аутентификации WinRM

    • Базовая
    • Сертификат
    • NTLM
    • Kerberos
    • CredSSP
  • Аккаунты без прав администратора
  • Шифрование WinRM
  • Параметры инвентаризации
  • IPv6 адреса
  • Валидация сертификатов HTTPS
  • Поддержка TLS 1.2
  • Ограничения WinRM

Что такое WinRM?

WinRM — это протокол управления, используемый Windows для удалённого взаимодействия с другим сервером. Это протокол на основе SOAP, который взаимодействует через HTTP/HTTPS и входит во все современные операционные системы Windows. Начиная с Windows Server 2012, WinRM включен по умолчанию, но в большинстве случаев требуется дополнительная настройка для использования WinRM с Ansible.

Ansible использует пакет pywinrm для взаимодействия с серверами Windows через WinRM. Он не устанавливается по умолчанию с пакетом Ansible.

Если вы выбрали pipx инструкции по установке, вы можете установить его, выполнив следующее:

pipx inject ansible pywinrm  # if you installed ansible with pipx
pipx inject ansible-core pywinrm  # if you installed ansible-core with pipx

Или, если вы выбрали pip инструкции по установке:

pip install "pywinrm>=0.3.0"

Примечание

на дистрибутивах с несколькими версиями Python используйте pip2 или pip2.x, где x соответствует малой версии Python, под которой работает Ansible.

Предупреждение

Использование плагинов подключения winrm или psrp в Ansible на MacOS в последних выпусках обычно приводит к ошибкам. Это известная проблема, возникающая глубоко внутри стека Python и не может быть изменена Ansible. Единственным решением на сегодня является установка переменной среды no_proxy=* и отказ от использования аутентификации Kerberos.

Параметры аутентификации WinRM

При подключении к хосту Windows можно использовать несколько различных параметров аутентификации учетной записи. Тип аутентификации может быть задан для хостов или групп инвентаризации с помощью переменной ansible_winrm_transport.

Следующая матрица — это общее представление о доступных параметрах:

Вариант

Локальные аккаунты

Аккаунты Active Directory

Делегирование учетных данных

Шифрование HTTP

Базовая

Да

Нет

Нет

Нет

Сертификат

Да

Нет

Нет

Нет

Kerberos

Нет

Да

Да

Да

NTLM

Да

Да

Нет

Да

CredSSP

Да

Да

Да

Да

Базовая

Базовая аутентификация — один из самых простых вариантов, но также и самый небезопасный. Это связано с тем, что имя пользователя и пароль просто кодируются в base64, а если безопасный канал (например, HTTPS) не используется, то их может декодировать любой. Базовая аутентификация может быть использована только для локальных учетных записей (не для учетных записей домена).

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

ansible_user: LocalUsername
ansible_password: Password
ansible_connection: winrm
ansible_winrm_transport: basic

Базовая аутентификация по умолчанию на хосте Windows не включена, но её можно включить, выполнив следующую команду в PowerShell:

Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true

Сертификат

Аутентификация по сертификату использует сертификаты, аналогичные парам ключей SSH, но формат файла и процесс генерации ключа отличаются.

Следующий пример показывает конфигурацию переменных хоста для аутентификации по сертификату:

ansible_connection: winrm
ansible_winrm_cert_pem: /path/to/certificate/public/key.pem
ansible_winrm_cert_key_pem: /path/to/certificate/private/key.pem
ansible_winrm_transport: certificate

Аутентификация по сертификату по умолчанию на хосте Windows не включена, но её можно включить, выполнив следующую команду в PowerShell:

Set-Item -Path WSMan:\localhost\Service\Auth\Certificate -Value $true

Примечание

Зашифрованные приватные ключи не могут быть использованы, так как библиотека urllib3, используемая Ansible для WinRM, не поддерживает эту функциональность.

Примечание

Для включения аутентификации по сертификату с подключением TLS 1.3 требуются Python 3.8+, 3.7.1 или 3.6.7 и пакеты Python urllib3==2.0.7 или более новые.

.._winrm_certificate_generate:

Генерация сертификата

Сертификат должен быть сгенерирован перед тем, как он может быть связан с локальным пользователем. Это можно сделать несколькими способами:

  • OpenSSL
  • PowerShell, используя командлет New-SelfSignedCertificate
  • Службы сертификации Active Directory

Службы сертификации Active Directory выходят за рамки этой документации, но могут быть лучшим вариантом при работе в доменной среде. Для получения дополнительной информации см. документацию по Службам сертификации Active Directory.

Примечание

Использование командлета PowerShell New-SelfSignedCertificate для генерации сертификата для аутентификации работает только при генерации с хоста Windows 10 или Windows Server 2012 R2 и более поздних версий. Для извлечения закрытого ключа из сертификата PFX в формат PEM для использования Ansible всё ещё требуется OpenSSL.

Для генерации сертификата с OpenSSL:

# Set the name of the local user that will have the key mapped to
USERNAME="username"

cat > openssl.conf << EOL
distinguished_name = req_distinguished_name
[req_distinguished_name]
[v3_req_client]
extendedKeyUsage = clientAuth
subjectAltName = otherName:1.3.6.1.4.1.311.20.2.3;UTF8:$USERNAME@localhost
EOL

export OPENSSL_CONF=openssl.conf
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -out cert.pem -outform PEM -keyout cert_key.pem -subj "/CN=$USERNAME" -extensions v3_req_client
rm openssl.conf

Для генерации сертификата с New-SelfSignedCertificate:

# Set the name of the local user that will have the key mapped
$username = "username"
$output_path = "C:\temp"

# Instead of generating a file, the cert will be added to the personal
# LocalComputer folder in the certificate store
$cert = New-SelfSignedCertificate -Type Custom `
    -Subject "CN=$username" `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=$username@localhost") `
    -KeyUsage DigitalSignature,KeyEncipherment `
    -KeyAlgorithm RSA `
    -KeyLength 2048

# Export the public key
$pem_output = @()
$pem_output += "-----BEGIN CERTIFICATE-----"
$pem_output += [System.Convert]::ToBase64String($cert.RawData) -replace ".{64}", "$&`n"
$pem_output += "-----END CERTIFICATE-----"
[System.IO.File]::WriteAllLines("$output_path\cert.pem", $pem_output)

# Export the private key in a PFX file
[System.IO.File]::WriteAllBytes("$output_path\cert.pfx", $cert.Export("Pfx"))

Примечание

Для преобразования файла PFX в закрытый ключ, который может использовать pywinrm, выполните следующую команду с OpenSSL openssl pkcs12 -in cert.pfx -nocerts -nodes -out cert_key.pem -passin pass: -passout pass:

Импорт сертификата в хранилище сертификатов

После генерации сертификата необходимо импортировать сертификат в хранилище Trusted Root Certificate Authorities на хосте LocalMachine, и открытый ключ клиентского сертификата должен быть доступен в папке Trusted People хранилища LocalMachine. В этом примере сертификат издателя и открытый ключ совпадают.

Пример импорта сертификата издателя:

$cert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 "cert.pem"

$store_name = [System.Security.Cryptography.X509Certificates.StoreName]::Root
$store_location = [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine
$store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $store_name, $store_location
$store.Open("MaxAllowed")
$store.Add($cert)
$store.Close()

Примечание

Если для генерации сертификата используется ADCS, то сертификат издателя уже импортирован, и этот шаг можно пропустить.

Код для импорта открытого ключа клиентского сертификата:

$cert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 "cert.pem"

$store_name = [System.Security.Cryptography.X509Certificates.StoreName]::TrustedPeople
$store_location = [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine
$store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $store_name, $store_location
$store.Open("MaxAllowed")
$store.Add($cert)
$store.Close()

Связывание сертификата с учетной записью

После импорта сертификата свяжите его с локальной учетной записью пользователя:

$username = "username"
$password = ConvertTo-SecureString -String "password" -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password

# This is the issuer thumbprint which in the case of a self generated cert
# is the public key thumbprint, additional logic may be required for other
# scenarios
$thumbprint = (Get-ChildItem -Path cert:\LocalMachine\root | Where-Object { $_.Subject -eq "CN=$username" }).Thumbprint

New-Item -Path WSMan:\localhost\ClientCertificate `
    -Subject "$username@localhost" `
    -URI * `
    -Issuer $thumbprint `
    -Credential $credential `
    -Force

После этого переменная хоста ansible_winrm_cert_pem должна быть установлена на путь открытого ключа, а переменная ansible_winrm_cert_key_pem должна быть установлена на путь закрытого ключа.

NTLM

NTLM — более старый механизм аутентификации, используемый Microsoft, который поддерживает как локальные, так и доменные учетные записи. NTLM включён по умолчанию в службе WinRM, поэтому перед его использованием дополнительная настройка не требуется.

NTLM — самый простой протокол аутентификации и более безопасен, чем аутентификация Basic. При работе в доменной среде вместо NTLM следует использовать Kerberos.

Kerberos имеет ряд преимуществ перед использованием NTLM:

  • NTLM — устаревший протокол и не поддерживает более новые протоколы шифрования.
  • NTLM медленнее в аутентификации, так как требует больше обменов с хостом на стадии аутентификации.
  • В отличие от Kerberos, NTLM не поддерживает делегирование учетных данных.

В этом примере показаны переменные хостов, настроенные для использования аутентификации NTLM:

ansible_user: LocalUsername
ansible_password: Password
ansible_connection: winrm
ansible_winrm_transport: ntlm

Kerberos

Kerberos — рекомендуемый вариант аутентификации при работе в среде домена. Kerberos поддерживает такие функции, как делегирование учетных данных и шифрование сообщений по протоколу HTTP, и является одним из более безопасных вариантов, доступных через WinRM.

Для корректной работы Kerberos требуется дополнительная настройка хоста Ansible.

В следующем примере показаны переменные хоста, настроенные для аутентификации Kerberos:

ansible_user: username@MY.DOMAIN.COM
ansible_password: Password
ansible_connection: winrm
ansible_port: 5985
ansible_winrm_transport: kerberos

Начиная с версии Ansible 2.3, билет Kerberos будет создаваться на основе ansible_user и ansible_password. Если вы работаете со старой версией Ansible или когда ansible_winrm_kinit_mode имеет значение manual, то билет Kerberos должен быть получен заранее. Более подробную информацию см. ниже.

Можно установить дополнительные переменные хоста:

ansible_winrm_kinit_mode: managed/manual (manual means Ansible will not obtain a ticket)
ansible_winrm_kinit_cmd: the kinit binary to use to obtain a Kerberos ticket (default to kinit)
ansible_winrm_service: overrides the SPN prefix that is used, the default is ``HTTP`` and should rarely ever need changing
ansible_winrm_kerberos_delegation: allows the credentials to traverse multiple hops
ansible_winrm_kerberos_hostname_override: the hostname to be used for the Kerberos exchange

Установка библиотеки Kerberos

Перед использованием Kerberos необходимо установить некоторые системные зависимости. Ниже приведен скрипт, перечисляющий зависимости в зависимости от дистрибутива:

# Through Yum (RHEL/Centos/Fedora for the older version)
yum -y install gcc python-devel krb5-devel krb5-libs krb5-workstation

# Through DNF (RHEL/Centos/Fedora for the newer version)
dnf -y install gcc python3-devel krb5-devel krb5-libs krb5-workstation

# Through Apt (Ubuntu older than 20.04 LTS (focal))
sudo apt-get install python-dev libkrb5-dev krb5-user

# Through Apt (Ubuntu newer than 20.04 LTS)
sudo apt-get install python3-dev libkrb5-dev krb5-user

# Through Portage (Gentoo)
emerge -av app-crypt/mit-krb5
emerge -av dev-python/setuptools

# Through Pkg (FreeBSD)
sudo pkg install security/krb5

# Through OpenCSW (Solaris)
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i libkrb5_3

# Through Pacman (Arch Linux)
pacman -S krb5

После установки зависимостей можно установить оболочку python-kerberos.

Если вы выбрали инструкции по установке pipx, вы можете установить ее, выполнив следующее:

pipx inject ansible pywinrm[kerberos]  # if you installed ansible with pipx
pipx inject ansible-core pywinrm[kerberos]  # if you installed ansible-core with pipx

Или, если вы выбрали инструкции по установке pip, выполните:

pip install pywinrm[kerberos]

Примечание

Хотя Ansible уже некоторое время поддерживает аутентификацию Kerberos через pywinrm, дополнительные функции или более безопасные варианты могут быть доступны только в более новых версиях библиотек pywinrm и/или pykerberos. Рекомендуется обновить каждую версию до последней доступной версии для устранения предупреждений или ошибок. Это можно сделать с помощью инструментов, таких как pip или менеджера пакетов системы, например dnf, yum, apt, но имена и версии доступных пакетов могут отличаться между инструментами.

Настройка Kerberos на хосте

После установки зависимостей Kerberos необходимо настроить для связи с доменом. Эта настройка выполняется в файле /etc/krb5.conf, который устанавливается вместе с пакетами в приведенном выше скрипте.

Для настройки Kerberos в разделе, начинающемся с:

[realms]

Добавьте полное имя домена и полные доменные имена первичных и вторичных контроллеров домена Active Directory. Должно получиться что-то вроде этого:

[realms]
    MY.DOMAIN.COM = {
        kdc = domain-controller1.my.domain.com
        kdc = domain-controller2.my.domain.com
    }

В разделе, начинающемся с:

[domain_realm]

Добавьте строку, подобную следующей, для каждого домена, к которому Ansible должен иметь доступ:

[domain_realm]
    .my.domain.com = MY.DOMAIN.COM

Вы можете настроить другие параметры в этом файле, например, домен по умолчанию. Подробнее см. в krb5.conf.

Автоматическое управление билетами Kerberos

Ansible версии 2.3 и выше по умолчанию автоматически управляет билетами Kerberos, когда для хоста указаны ansible_user и ansible_password. В этом процессе для каждого хоста создается новый билет в временном кэше учетных данных. Это выполняется перед выполнением каждой задачи, чтобы свести к минимуму вероятность истечения срока действия билета. Временные кэши учетных данных удаляются после завершения каждой задачи и не будут мешать кэшу учетных данных по умолчанию.

Чтобы отключить автоматическое управление билетами, установите ansible_winrm_kinit_mode=manual в инвентаре.

Для автоматического управления билетами требуется стандартный двоичный файл kinit в пути системы управления хостом. Чтобы указать другое расположение или имя двоичного файла, установите переменную хоста ansible_winrm_kinit_cmd на полный путь к двоичному файлу MIT krbv5, совместимому с kinit.

Ручное управление билетами Kerberos

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

kinit username@MY.DOMAIN.COM

Примечание

Домен должен точно совпадать с настроенным областью Kerberos и быть в верхнем регистре.

Чтобы увидеть полученные билеты (если таковые имеются), используйте следующую команду:

klist

Чтобы уничтожить все полученные билеты, используйте следующую команду:

kdestroy

Отладка Kerberos

Для работы Kerberos требуется правильно настроенная среда. Для устранения проблем с Kerberos убедитесь в следующем:

  • Имя хоста, заданное для хоста Windows, является полным доменным именем (FQDN), а не IP-адресом. * Если вы подключаетесь с помощью IP-адреса, вы получите сообщение об ошибке Server not found in Kerberos database. * Чтобы определить, используете ли вы IP-адрес или FQDN, запустите свою книгу задач (или вызов модуля win_ping) с флагом -vvv.
  • Прямые и обратные DNS-запросы работают правильно в домене. Для проверки выполните ping хоста Windows по имени, а затем используйте полученный IP-адрес с nslookup. То же имя должно возвращаться при использовании nslookup с IP-адресом.
  • Часы хоста Ansible синхронизированы с контроллером домена Active Directory. Kerberos чувствителен ко времени, и небольшое смещение часов может привести к сбою процесса генерации билета.
  • Убедитесь, что полное доменное имя домена настроено в файле krb5.conf. Для проверки выполните:
  • kinit -C username@MY.DOMAIN.COM
    klist
    
  • Если имя домена, возвращаемое klist, отличается от запрошенного, используется псевдоним. Необходимо обновить файл krb5.conf, чтобы использовать полное доменное имя, а не псевдоним.
  • Если стандартные инструменты Kerberos были заменены или изменены (некоторые решения IdM могут сделать это), это может вызвать проблемы при установке или обновлении Python-библиотеки Kerberos. На момент написания этой статьи эта библиотека называется pykerberos и известна своей совместимостью с библиотеками Kerberos MIT и Heimdal. Для решения проблем с установкой pykerberos, убедитесь, что удовлетворены системные зависимости Kerberos (см.: Установка библиотеки Kerberos), удалите все пользовательские пути Kerberos из переменной среды PATH и повторите установку пакета Python Kerberos library.

CredSSP

Аутентификация CredSSP — это более новый протокол аутентификации, который позволяет делегирование учетных данных. Это достигается путем шифрования имени пользователя и пароля после успешной аутентификации и отправки этого на сервер с использованием протокола CredSSP.

Поскольку имя пользователя и пароль отправляются на сервер для использования в аутентификации с двойным переходом, убедитесь, что хосты, с которыми взаимодействует хост Windows, не скомпрометированы и являются доверенными.

CredSSP можно использовать как для локальных, так и для доменных учетных записей, а также поддерживает шифрование сообщений по протоколу HTTP.

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

ansible_user: Username
ansible_password: Password
ansible_connection: winrm
ansible_winrm_transport: credssp

Некоторые дополнительные переменные хоста, которые можно установить, показаны ниже:

ansible_winrm_credssp_disable_tlsv1_2: when true, will not use TLS 1.2 in the CredSSP auth process

Аутентификация CredSSP по умолчанию не включена на хосте Windows, но ее можно включить, выполнив следующее в PowerShell:

Enable-WSManCredSSP -Role Server -Force

Установка библиотеки CredSSP

Оболочку requests-credssp можно установить с помощью pip:

pip install pywinrm[credssp]

CredSSP и TLS 1.2

По умолчанию библиотека requests-credssp настроена на аутентификацию по протоколу TLS 1.2. TLS 1.2 устанавливается и включается по умолчанию для Windows Server 2012 и Windows 8 и более поздних релизов.

Существует два способа использования более старых хостов с CredSSP:

  • Установите и включите исправление для поддержки TLS 1.2 (рекомендуется для Server 2008 R2 и Windows 7).
  • Установите ansible_winrm_credssp_disable_tlsv1_2=True в инвентаре, чтобы работать через TLS 1.0. Это единственный вариант при подключении к Windows Server 2008, который не поддерживает TLS 1.2.

См. Поддержка TLS 1.2 для получения дополнительной информации о том, как включить TLS 1.2 на хосте Windows.

Установить сертификат CredSSP

CredSSP работает путем шифрования учетных данных с помощью протокола TLS и использует самозаверяющий сертификат по умолчанию. Параметр CertificateThumbprint в настройках службы WinRM можно использовать для указания отпечатка другого сертификата.

Примечание

Эта настройка сертификата не зависит от сертификата прослушивателя WinRM. С CredSSP передача сообщений все равно происходит через прослушиватель WinRM, но внутри канала зашифрованные сообщения TLS используют сертификат службы.

Для явного указания сертификата, который следует использовать для CredSSP:

# Note the value $certificate_thumbprint will be different in each
# situation, this needs to be set based on the cert that is used.
$certificate_thumbprint = "7C8DCBD5427AFEE6560F4AF524E325915F51172C"

# Set the thumbprint value
Set-Item -Path WSMan:\localhost\Service\CertificateThumbprint -Value $certificate_thumbprint

Учетные записи без прав администратора

WinRM по умолчанию настроен так, что допускает подключения только от учетных записей в локальной группе Administrators. Это можно изменить, выполнив:

winrm configSDDL default

Это отобразит редактор ACL, где можно добавить новых пользователей или группы. Для выполнения команд через WinRM пользователи и группы должны иметь разрешения Read и Execute.

Хотя учетные записи без прав администратора можно использовать с WinRM, большинство типичных задач администрирования сервера требуют определенного уровня административных прав, поэтому этот инструмент обычно ограничен.

Шифрование WinRM

По умолчанию WinRM не будет работать при использовании незащищенного канала. Протокол WinRM считает канал зашифрованным, если используется TLS через HTTP (HTTPS) или шифрование на уровне сообщений. Использование WinRM с TLS является рекомендуемым вариантом, так как оно работает со всеми вариантами аутентификации, но требует создания и использования сертификата на прослушивателе WinRM.

Если вы работаете в доменной среде, ADCS может создать сертификат для хоста, выданный самим доменом.

Если использование HTTPS недоступно, то можно использовать HTTP, когда опция аутентификации равна NTLM, Kerberos или CredSSP. Эти протоколы зашифруют полезную нагрузку WinRM с помощью своего метода шифрования перед отправкой на сервер. Шифрование на уровне сообщений не используется при работе через HTTPS, так как шифрование использует более безопасный протокол TLS. Если требуется как транспортное, так и шифрование сообщений, установите ansible_winrm_message_encryption=always в переменных хоста.

Примечание

Шифрование сообщений через HTTP требует pywinrm>=0.3.0.

В качестве последнего средства можно отключить требование шифрования на хосте Windows. Это следует использовать только для целей разработки и отладки, так как все отправленные данные от Ansible могут быть просмотрены или изменены, а удаленная сессия может быть полностью захвачена любым пользователем в той же сети. Чтобы отключить требование шифрования:

Set-Item -Path WSMan:\localhost\Service\AllowUnencrypted -Value $true

Примечание

Не отключайте проверку шифрования, если это не абсолютно необходимо. Это может привести к тому, что конфиденциальная информация, такая как учетные данные и файлы, будет перехвачена другими пользователями в сети.

Параметры инвентаризации

Поддержка Windows в Ansible полагается на несколько стандартных переменных для указания имени пользователя, пароля и типа подключения удаленных хостов. Эти переменные проще всего настроить в инвентаризации, но могут быть настроены на уровне host_vars/ group_vars.

При настройке инвентаризации необходимы следующие переменные:

# It is suggested that these be encrypted with ansible-vault:
# ansible-vault edit group_vars/windows.yml
ansible_connection: winrm

# May also be passed on the command-line through --user
ansible_user: Administrator

# May also be supplied at runtime with --ask-pass
ansible_password: SecretPasswordGoesHere

Используя переменные выше, Ansible подключится к хосту Windows с помощью аутентификации Basic через HTTPS. Если у ansible_user есть значение UPN, такое как username@MY.DOMAIN.COM, то опция аутентификации автоматически попытается использовать Kerberos, если ansible_winrm_transport не установлена на значение, отличное от kerberos.

Также поддерживаются следующие пользовательские переменные инвентаризации для дополнительной настройки подключений WinRM:

  • ansible_port: Порт, по которому будет работать WinRM, HTTPS — 5986, что является значением по умолчанию, а HTTP — 5985
  • ansible_winrm_scheme: Укажите схему подключения (http или https) для использования в подключении WinRM. Ansible использует https по умолчанию, если ansible_port не равно 5985
  • ansible_winrm_path: Укажите альтернативный путь к точке входа WinRM, Ansible использует /wsman по умолчанию
  • ansible_winrm_realm: Укажите домен для использования аутентификации Kerberos. Если ansible_user содержит @, Ansible по умолчанию будет использовать часть имени пользователя после @
  • ansible_winrm_transport: Укажите одну или несколько опций транспортного аутентификации в виде списка через запятую. По умолчанию Ansible будет использовать kerberos, basic, если модуль kerberos установлен и определен домен, в противном случае это будет plaintext
  • ansible_winrm_server_cert_validation: Укажите режим проверки валидности сертификата сервера (ignore или validate). Ansible по умолчанию использует validate в Python 2.7.9 и выше, что приведет к ошибкам проверки сертификатов для самозаверяющих сертификатов Windows. Если не были настроены проверяемые сертификаты на прослушивателях WinRM, это значение следует установить на ignore
  • ansible_winrm_operation_timeout_sec: Увеличение значения таймаута по умолчанию для операций WinRM, Ansible использует 20 по умолчанию
  • ansible_winrm_read_timeout_sec: Увеличение таймаута чтения WinRM, Ansible использует 30 по умолчанию. Полезно при периодических проблемах с сетью и постоянных ошибках таймаута чтения
  • ansible_winrm_message_encryption: Укажите операцию шифрования сообщений (auto, always, never), Ansible использует auto по умолчанию. auto означает, что шифрование сообщений используется только тогда, когда ansible_winrm_scheme равно http, и ansible_winrm_transport поддерживает шифрование сообщений. always означает, что шифрование сообщений всегда будет использоваться, а never означает, что шифрование сообщений никогда не будет использоваться
  • ansible_winrm_ca_trust_path: Используется для указания другого контейнера cacert, отличного от используемого в модуле certifi. Подробности см. в разделе "Проверка валидности сертификатов HTTPS".
  • ansible_winrm_send_cbt: При использовании ntlm или kerberos по HTTPS библиотека аутентификации попытается отправить токены привязки канала для защиты от атак «человек посередине». Этот флаг управляет отправкой этих привязок (по умолчанию: true).
  • ansible_winrm_*: Любые дополнительные ключевые аргументы, поддерживаемые winrm.Protocol, могут быть предоставлены вместо *

Кроме того, существуют также определенные переменные, которые необходимо установить для каждой опции аутентификации. Подробности см. в разделе об аутентификации выше.

Примечание

Ansible 2.0 устарел параметр «ssh» в ansible_ssh_user, ansible_ssh_pass, ansible_ssh_host, и ansible_ssh_port, заменив его на ansible_user, ansible_password, ansible_host, и ansible_port. Если используется версия Ansible, предшествующая 2.0, вместо этого следует использовать более старый стиль (ansible_ssh_*). Более короткие переменные игнорируются в более старых версиях Ansible без предупреждений.

Примечание

ansible_winrm_message_encryption отличается от транспортного шифрования, выполненного через TLS. Полезная нагрузка WinRM по-прежнему шифруется с помощью TLS при работе через HTTPS, даже если ansible_winrm_message_encryption=never.

IP-адреса IPv6

IP-адреса IPv6 могут использоваться вместо IP-адресов IPv4 или имен хостов. Этот параметр обычно настраивается в инвентаризации. Ansible попытается разобрать адрес с использованием пакета ipaddress и передать его в pywinrm корректно.

При определении хоста с использованием IP-адреса IPv6 просто добавьте IP-адрес IPv6 так же, как и IP-адрес IPv4 или имя хоста:

[windows-server]
2001:db8::1

[windows-server:vars]
ansible_user=username
ansible_password=password
ansible_connection=winrm

Примечание

Библиотека ipaddress по умолчанию включена только в Python 3.x. Чтобы использовать IP-адреса IPv6 в Python 2.7, убедитесь, что выполнено pip install ipaddress, который устанавливает пакет с обратной совместимостью.

Проверка валидности сертификатов HTTPS

В рамках протокола TLS сертификат проверяется для обеспечения соответствия хоста субъекту и доверия клиента к издателю сертификата сервера. При использовании самозаверяющего сертификата или установке ansible_winrm_server_cert_validation: ignore эти механизмы безопасности отключаются. В то время как самозаверяющие сертификаты всегда требуют флага ignore, сертификаты, выданные центром сертификации, по-прежнему могут быть проверены.

Один из наиболее распространенных способов настройки прослушивателя HTTPS в доменной среде — использование службы Active Directory Certificate Services (AD CS). AD CS используется для генерации подписанных сертификатов из запроса на подписание сертификата (CSR). Если прослушиватель WinRM HTTPS использует сертификат, подписанный другим центром сертификации, например AD CS, Ansible может быть настроен на доверие к этому издателю в рамках рукопожатия TLS.

Чтобы Ansible доверял центру сертификации (ЦС), например AD CS, сертификат издателя ЦС можно экспортировать в формате PEM. Этот сертификат можно скопировать на узел управления Ansible и использовать в качестве источника проверки сертификатов, иначе известного как цепочка ЦС.

Цепочка ЦС может содержать один или несколько сертификатов издателей, и каждая запись находится в новой строке. Затем для использования пользовательской цепочки ЦС в процессе проверки установите ansible_winrm_ca_trust_path на путь к файлу. Если эта переменная не установлена, используется цепочка ЦС по умолчанию, которая находится в пути установки пакета Python certifi.

Примечание

Каждый вызов HTTP выполняется библиотекой Python requests, которая не использует встроенный хранилище сертификатов системы в качестве центра доверия. Проверка сертификата завершится ошибкой, если издатель сертификата сервера добавлен только в хранилище доверия системы.

Поддержка TLS 1.2

Так как WinRM работает через протокол HTTP, использование HTTPS означает, что протокол TLS используется для шифрования сообщений WinRM. TLS автоматически попытается договориться о наилучшем протоколе и наборе шифров, доступном как клиенту, так и серверу. Если совпадение не найдено, Ansible выдаст сообщение, подобное:

HTTPSConnectionPool(host='server', port=5986): Max retries exceeded with url: /wsman (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1056)')))

Обычно это происходит, когда хост Windows не настроен на поддержку TLS v1.2, но это также может означать, что на контрольном узле Ansible установлена более старая версия OpenSSL.

Windows 8 и Windows Server 2012 поставляются с установленным и включенным по умолчанию TLS v1.2, но на более старых хостах, таких как Server 2008 R2 и Windows 7, его нужно включить вручную.

Примечание

Существует ошибка с исправлением TLS 1.2 для Server 2008, которая помешает Ansible подключиться к хосту Windows. Это означает, что Server 2008 не может быть настроен на использование TLS 1.2. Server 2008 R2 и Windows 7 не затронуты этой проблемой и могут использовать TLS 1.2.

Чтобы проверить, какой протокол поддерживает хост Windows, можно выполнить следующую команду на контрольном узле Ansible:

openssl s_client -connect <hostname>:5986

Вывод будет содержать информацию о сессии TLS, а строка Protocol отобразит согласованную версию:

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: 962A00001C95D2A601BE1CCFA7831B85A7EEE897AECDBF3D9ECD4A3BE4F6AC9B
    Session-ID-ctx:
    Master-Key: ....
    Start Time: 1552976474
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: AE16000050DA9FD44D03BB8839B64449805D9E43DBD670346D3D9E05D1AEEA84
    Session-ID-ctx:
    Master-Key: ....
    Start Time: 1552976538
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)

Если хост возвращает TLSv1, необходимо настроить включение TLS v1.2. Это можно сделать, выполнив следующий скрипт PowerShell:

Function Enable-TLS12 {
    param(
        [ValidateSet("Server", "Client")]
        [String]$Component = "Server"
    )

    $protocols_path = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols'
    New-Item -Path "$protocols_path\TLS 1.2\$Component" -Force
    New-ItemProperty -Path "$protocols_path\TLS 1.2\$Component" -Name Enabled -Value 1 -Type DWORD -Force
    New-ItemProperty -Path "$protocols_path\TLS 1.2\$Component" -Name DisabledByDefault -Value 0 -Type DWORD -Force
}

Enable-TLS12 -Component Server

# Not required but highly recommended to enable the Client side TLS 1.2 components
Enable-TLS12 -Component Client

Restart-Computer

Ниже приведены задачи Ansible, которые также можно использовать для включения TLS v1.2:

- name: enable TLSv1.2 support
  win_regedit:
    path: HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\{{ item.type }}
    name: '{{ item.property }}'
    data: '{{ item.value }}'
    type: dword
    state: present
  register: enable_tls12
  loop:
  - type: Server
    property: Enabled
    value: 1
  - type: Server
    property: DisabledByDefault
    value: 0
  - type: Client
    property: Enabled
    value: 1
  - type: Client
    property: DisabledByDefault
    value: 0

- name: reboot if TLS config was applied
  win_reboot:
  when: enable_tls12 is changed

Существуют и другие способы настройки протоколов TLS, а также наборов шифров, предлагаемых хостом Windows. Одним инструментом, который предоставляет графический интерфейс для управления этими настройками, является IIS Crypto от Nartac Software.

Ограничения WinRM

Из-за особенностей протокола WinRM существует несколько ограничений при использовании WinRM, которые могут вызвать проблемы при создании playbooks для Ansible. К ним относятся:

  • Учетные данные не делегируются для большинства типов аутентификации, что приводит к ошибкам аутентификации при доступе к сетевым ресурсам или установке определенных программ.
  • Многие вызовы API Windows Update блокируются при работе через WinRM.
  • Некоторые программы не устанавливаются с WinRM из-за отсутствия делегирования учетных данных или из-за доступа к запрещенным API Windows, таким как WUA через WinRM.
  • Команды в WinRM выполняются в неинтерактивной сессии, что может препятствовать выполнению определенных команд или исполняемых файлов.
  • Нельзя запустить процесс, взаимодействующий с DPAPI, который используется некоторыми установщиками (например, Microsoft SQL Server).

Некоторые из этих ограничений можно смягчить, выполнив одно из следующих действий:

  • Установите ansible_winrm_transport на credssp или kerberos (с ansible_winrm_kerberos_delegation=true), чтобы обойти проблему двойного перехода и получить доступ к сетевым ресурсам
  • Используйте become для обхода всех ограничений WinRM и выполнения команды так, как если бы она выполнялась локально. В отличие от использования транспортного средства аутентификации, такого как credssp, это также позволит снять ограничения на неинтерактивность и ограничения доступа к API, такие как WUA и DPAPI
  • Используйте запланированную задачу для выполнения команды, которую можно создать с помощью модуля win_scheduled_task. Как и в become, это обходит все ограничения WinRM, но позволяет выполнить только команду, а не модули.

См. также

Сценарии Ansible

Введение в сценарии

Советы и рекомендации для Ansible

Советы и рекомендации по сценариям

Список модулей Windows

Список модулей, специфичных для Windows, все реализованы в PowerShell

Связь

Есть вопросы? Нуждаетесь в помощи? Хотите поделиться своими идеями? Посетите руководство по общению с Ansible

© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/os_guide/windows_winrm.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API