Удаленное управление Windows
В отличие от хостов Linux/Unix, которые по умолчанию используют SSH, хосты Windows настроены с помощью WinRM. В этом разделе рассматривается настройка и использование WinRM с Ansible.
- Что такое WinRM?
- Аккаунты без прав администратора
- Шифрование 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, чтобы использовать полное доменное имя, а не псевдоним.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