Spec-Zone.ru › Ansible

Руководство по инвентаризации LDAP

В этом руководстве содержится информация о плагине инвентаризации LDAP, входящем в эту коллекцию. Этот плагин инвентаризации можно использовать для создания инвентаризации на основе источника LDAP-сервера, например Microsoft Active Directory.

  • Сведения о подключении
  • Атрибуты
  • Имя узла в инвентаризации
  • Типы значений и шаблоны
  • LAPS

Сведения о подключении

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

plugin: microsoft.ad.ldap

# LDAP connection options can be defined in the yaml config.
auth_protocol: simple
username: UserName
password: MyPassword123
tls_mode: ldaps

Атрибуты

Плагин инвентаризации LDAP можно использовать для задания пользовательских фактов для каждого полученного узла на основе атрибутов LDAP объекта компьютера. Получение пользовательских атрибутов выполняется с помощью параметра attributes в определении плагина инвентаризации. Значением может быть один из следующих трех типов:

  • Пустая строка или null
  • Строка шаблона
  • Словарь

Примечание

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

Также можно использовать параметр инвентаризации compose, чтобы задействовать встроенную обработку шаблонов compose, предоставляемую плагинами инвентаризации. Однако сначала необходимо запросить атрибуты LDAP с помощью параметра attributes и указать на них в шаблоне compose через факт узла, для которого задано значение attributes.

Пустая строка или null

attributes:
  comment:
  objectSid: ''
  ms-Mcs-AdmPwd:

В этом случае значения каждого атрибута будут заданы как факты узла в соответствии с преобразованием, определяемым схемой LDAP; см. раздел типы значений и шаблоны. Имя каждого факта будет основано на имени атрибута, при этом - будет заменено на _. В приведенном выше примере фактам узла comment, objectSid и ms_Mcs_AdmPwd будут присвоены преобразованные значения.

# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
comment: test comment
ms_Mcs_AdmPwd: Password123!
objectSid: S-1-5-21-1234-1108
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

Строка шаблона

attributes:
  comment: this
  objectSid: raw | microsoft.ad.as_sid
  ms-Mcs-AdmPwd: raw | first

В этом формате факт узла задается на основе указанного значения шаблона. Каждый шаблон неявно оборачивается в {{ ... }} и обрабатывается Jinja2 для получения результата. Это означает, что строка шаблона может содержать фильтры, предоставляемые Ansible и другими коллекциями, для преобразования исходного значения LDAP в более полезный формат. Переменная this ссылается на преобразованное значение атрибута LDAP, а raw — на список строк байтовых данных исходного значения атрибута LDAP, закодированных в base64. Дополнительные сведения о возможностях шаблонов см. в разделе типы значений и шаблоны. Имя каждого факта узла будет соответствовать имени атрибута, при этом - будет заменено на _. В приведенном выше примере фактам узла command, objectSid и ms_Mcs_AdmPwd будут присвоены результаты обработки шаблонов.

# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
comment: test comment
ms_Mcs_AdmPwd: UGFzc3dvcmQxMjMh
objectSid:
- S-1-5-21-1234-1108
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

Словарь

attributes:
  comment:
    # Jinja2 native types will automatically convert this to a dict as
    # the value is a json string.
    my_comment:
    other_var: this | from_json
  objectSid:
    sid: raw | microsoft.ad.as_sid | first
  ms-Mcs-AdmPwd:
    ansible_password: this

Последнее значение, которое можно задать для каждого атрибута, — это словарь, в котором ключи являются фактами узла, подлежащими установке, а значения — шаблонами, используемыми для получения итогового значения. Значение может быть null или пустой строкой, чтобы указать на значение атрибута, преобразованное LDAP (this), либо строкой шаблона для создания нового значения в соответствии с текущими требованиями. Дополнительные сведения о null и пустой строке, а также о строковом значении шаблона см. в описаниях двух предыдущих форматов. В приведенном выше примере задаются 4 факта узла:

  • my_command — преобразованное значение атрибута comment
  • other_var — словарь, созданный из преобразованного значения comment, если оно является строкой JSON
  • sid — значение SID компьютера в виде строки, полученное из objectSid
  • ansible_password — преобразованное значение пароля LAPS, полученное из ms-Mcs-AdmPwd
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
ansible_password: Password123!
my_comment:
  foo: bar
other_var:
  foo: bar
sid: S-1-5-21-1234-1108
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

Примечание

Имена фактов для каждого ключа атрибута должны соответствовать соглашениям Python об именовании переменных. Например, следует использовать _ вместо -. Некоторые версии Ansible могут завершить работу с ошибкой, если использовать недопустимое имя.

Имя узла в инвентаризации

По умолчанию значение inventory_hostname для найденного узла будет основано на значении атрибута LDAP name. Если для найденной учетной записи компьютера задан атрибут dNSHostName, он будет установлен как факт ansible_host. Чтобы задать пользовательский inventory_hostname или ansible_host, укажите его в attributes либо в параметре плагина compose под соответствующим ключом. Например, этот вариант задаст inventory_hostname значением sAMAccountName без конечного $, а не атрибутом LDAP учетной записи компьютера name.

attributes:
  sAMAccountName:
  inventory_hostname: sAMAccountName[:-1]
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
microsoft_ad_distinguished_name: CN=OtherName,CN=Computers,DC=domain,DC=com
sAMAccountName: MYHOST$

Также можно задать inventory_hostname в разделе compose. Следующий пример даст тот же результат, что и приведенный выше.

attributes:
  sAMAccountName:

compose:
  inventory_hostname: sAMAccountName[:-1]

Пример задания пользовательского факта ansible_host, используемого в качестве узла подключения, при сохранении значения inventory_hostname по умолчанию — имени учетной записи компьютера:

attributes:
  sAMAccountName:
  ansible_host: sAMAccountName[:-1]

Типы значений и шаблоны

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

  • Логические значения
  • Целые числа
  • Байты
  • Строки

Логические значения, целые числа и строки преобразуются в соответствующие типы Python, а байты преобразуются в строку с кодировкой base64.

Примечание

Атрибуты objectGuid и objectSid всегда преобразуются в строки, представляющие соответственно идентификатор безопасности и GUID. Это единственные атрибуты со специальными правилами преобразования, не предусмотренными синтаксисом схемы LDAP.

Значения атрибутов LDAP также могут быть однозначными или многозначными. Однозначный атрибут содержит только преобразованное значение или None/null, если значение не задано; многозначный атрибут задается как список преобразованных значений. Например, comment — это однозначная строка, а servicePrincipalName — многозначная строка. Используя эту конфигурацию инвентаризации, которая запрашивает comment и servicePrincipalName, мы получим следующее определение узла инвентаризации:

plugin: microsoft.ad.ldap

attributes:
  comment:
  servicePrincipalName:
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
comment: test comment
servicePrincipalName:
- WSMAN/MYHOST
- WSMAN/MYHOST.domain.com
- TERMSRV/MYHOST
- TERMSRV/MYHOST.domain.com
- RestrictedKrbHost/MYHOST
- HOST/MYHOST
- RestrictedKrbHost/MYHOST.domain.com
- HOST/MYHOST.domain.com
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

Некоторые атрибуты, например pwdLastSet, обычно представлены значением даты и времени, но внутри хранятся как целые числа. Поскольку в схеме LDAP нет метаданных, указывающих, что эти целые числа являются объектами даты и времени, по умолчанию они преобразуются только в целые числа.

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

  • microsoft.ad.as_datetime
  • microsoft.ad.as_guid
  • microsoft.ad.as_sid
  • microsoft.ad.parse_dn
  • microsoft.ad.split_dn

Пример использования этих фильтров в параметре attributes приведен ниже:

plugin: microsoft.ad.ldap

attributes:
  pwdLastSet:
    password_last_set_int: this
    password_last_set_datetime: this | microsoft.ad.as_datetime
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
password_last_set_datetime: 2023-02-06T07:39:09.195321+0000
password_last_set_int: 133201427491953218
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

В шаблонах также можно ссылаться на другие фильтры, не входящие в коллекцию, например на встроенный фильтр Ansible from_json и другие. Значение — это то, что было бы помещено внутрь {{ ... }} при обычной обработке шаблона.

Примечание

В шаблонах значений атрибутов нельзя использовать поисковые запросы, только фильтры.

Каждый шаблон, используемый в параметре инвентаризации attributes, может ссылаться на следующие переменные:

  • this
  • raw
  • Любые ранее определенные атрибуты

Переменная this ссылается на преобразованное значение атрибута LDAP, а raw — на список строк base64, представляющих исходное значение LDAP до преобразования. При обработке каждого факта узла для атрибута он также становится доступен в последующих шаблонах под именем этого факта узла. Ниже приведен пример более сложного набора атрибутов:

plugin: microsoft.ad.ldap

attributes:
  objectSid:
    sid: this
    sid_raw: raw
    sid_raw_filtered: raw | microsoft.ad.as_sid | first
  objectGuid:
  sAMAccountName:
    computer_name:
  comment:
    comment: this
    # Can refer to previously set attributes above
    description: computer_name ~ " - " ~ sid ~ " - " ~ objectGuid ~ " - " ~ this

# Can also be used as a template and refer to the vars retrieved above
compose:
  comment2: comment
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
comment: test comment
comment2: test comment
computer_name: MYHOST$
description: MYHOST$ - S-1-5-21-1234-1108 - 51cc490f-1de0-41ae-98ad-dc065d5b33e2 - test comment
objectGuid: 51cc490f-1de0-41ae-98ad-dc065d5b33e2
sid: S-1-5-21-1234-1108
sid_raw:
- AQMAAAAAAAUVAAAA0gQAAFQEAAA=
sid_raw_filtered: S-1-5-21-1234-1108
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

LAPS

Решение Local Administrator Password Solution (LAPS) можно использовать для автоматической смены пароля локальной учетной записи администратора на узлах, присоединенных к домену. Плагин подключения LDAP может получить значение, управляемое LAPS, и назначить его паролем подключения для целевого узла.

LAPS может использовать для хранения сведений о пароле три разных атрибута:

  • ms-Mcs-AdmPwd — устаревший атрибут LAPS, содержащий пароль
  • msLAPS-Password — атрибут Windows LAPS, содержащий имя пользователя и пароль
  • msLAPS-EncryptedPassword — атрибут Windows LAPS, содержащий зашифрованные имя пользователя и пароль

Если используется устаревшая конфигурация LAPS, следующий пример получит имя пользователя и пароль подключения и присвоит им значения, управляемые LAPS:

plugin: microsoft.ad.ldap

attributes:
  ms-Mcs-AdmPwd:
    ansible_user: '"Administrator"'
    ansible_password: this
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
ansible_password: aR$lmrqK1l622H
ansible_user: Administrator
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com

Примечание

Устаревшая версия LAPS не хранит имя пользователя; в приведенном выше примере имя пользователя Administrator задано жестко.

Если используется Windows LAPS без шифрования, следующий пример задаст имени пользователя и паролю подключения значения, управляемые LAPS:

plugin: microsoft.ad.ldap

attributes:
  msLAPS-Password:
    ansible_user: (this | from_json).n
    ansible_password: (this | from_json).p
    raw_example: raw
    this_example: this
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
ansible_password: AWznso@ZJ+J6p9
ansible_user: Administrator
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com
raw_example:
- eyJuIjoiQWRtaW5pc3RyYXRvciIsInQiOiIxZDk4MmI0MzdiN2E1YzYiLCJwIjoiQVd6bnNvQFpKK0o2cDkifQ==
this_example:
  n: Administrator
  p: AWznso@ZJ+J6p9
  t: 1d982b437b7a5c6

В отличие от устаревшей версии LAPS, значение атрибута представляет собой строку JSON, содержащую ключи:

  • n — имя учетной записи, для которой был зашифрован пароль
  • p — пароль учетной записи
  • t — время установки пароля, закодированное как FILETIME в шестнадцатеричном формате

Примечание

Рекомендуется использовать фильтр from_json (как показано в примере выше) для значения this, чтобы обеспечить согласованное поведение независимо от наличия поддержки нативных типов Jinja2.

Для получения зашифрованного значения Windows LAPS необходимо установить библиотеку Python dpapi-ng. Дополнительные сведения об этом необязательном пакете и проверке его установки см. в разделе требования к подключению LDAP.

Примечание

Использование зашифрованного пароля Windows LAPS в настоящее время является экспериментальной функцией.

После установки пакета dpapi-ng авторизованный пользователь LDAP может расшифровать управляемые LAPS имя пользователя и пароль и назначить их для подключения к целевому узлу следующим образом:

plugin: microsoft.ad.ldap

attributes:
  msLAPS-EncryptedPassword:
    ansible_user: (this.value | from_json).n
    ansible_password: (this.value | from_json).p
    raw_example: raw
    this_example: this
# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
ansible_password: 6jr&}yK++{0Q}&
ansible_user: Administrator
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com
raw_example:
- toLZAWR7rgfk...
this_example:
  encrypted_value: MIIETgYJKoZI...
  flags: 0
  info: ''
  update_timestamp: 133281382308674404
  value: '{"n":"Administrator","t":"1d982b607ae7b64","p":"6jr&}yK++{0Q}&"}'

Значение raw содержит исходное значение в кодировке base64, сохраненное в AD. Значение this содержит словарь со следующими ключами:

  • encrypted_value: зашифрованный блок пароля в виде строки base64
  • flags: флаги, заданные в виде целого числа с побитовым представлением; в настоящее время Microsoft не документирует их
  • update_timestamp: значение FILETIME момента, когда
  • value: расшифрованное значение с именем пользователя и паролем в виде строки JSON
  • debug: отладочная информация, указывающая причину неудачной расшифровки значения

Ключ value присутствует только в случае успешной расшифровки. Если расшифровать значение не удалось, будет присутствовать ключ debug с указанием причины ошибки.

Если библиотека dpapi-ng не установлена, вывод будет выглядеть следующим образом:

# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com
raw_example:
- toLZAWR7rgfk...
this_example:
  debug: Cannot decrypt value as the Python library dpapi-ng is not installed
  encrypted_value: MIIETgYJKoZI...
  flags: 0
  update_timestamp: 133281382308674404

Ключ value больше не присутствует, а debug содержит сообщение о том, что dpapi-ng не установлена.

Если библиотека dpapi-ng установлена, но пользователь подключения не авторизован для расшифровки значения, вывод будет выглядеть следующим образом:

# ansible-inventory -i microsoft.ad.ldap.yml --host MYHOST --vars --yaml

ansible_host: MYHOST.domain.com
microsoft_ad_distinguished_name: CN=MYHOST,CN=Computers,DC=domain,DC=com
raw_example:
- toLZAWR7rgfk...
this_example:
  debug: Failed to decrypt value due to error - ValueError GetKey failed 0x80070005
  encrypted_value: MIIETgYJKoZI...
  flags: 0
  update_timestamp: 133281382308674404

Простой способ проверить, может ли пользователь подключения расшифровать пароль, — выполнить команду Get-LapsADPassword -Identity MYHOST на узле Windows от имени этого пользователя.

© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/microsoft/ad/docsite/guide_ldap_inventory.html

Spec-Zone.ru

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