Понимание повышения привилегий: become
Ansible использует существующие системы повышения привилегий для выполнения задач с правами root или с правами другого пользователя. Поскольку эта функция позволяет вам «стать» другим пользователем, отличным от пользователя, вошедшего в систему (удаленный пользователь), мы называем её become. Ключевое слово become использует существующие инструменты повышения привилегий, такие как sudo, su, pfexec, doas, pbrun, dzdo, ksu, runas, machinectl и другие.
-
- Риски повышения привилегий до непривилегированного пользователя
- Не поддерживается всеми плагинами подключения
- Только один метод может быть включен на хост
- Повышение привилегий должно быть общим
- Невозможно получить доступ к переменным среды, заполненным pamd_systemd
- Решение проблем с временными файлами
Использование become
Вы можете управлять использованием become с помощью директив playbook или задач, переменных подключения или в командной строке. Если вы задаёте свойства повышения привилегий несколькими способами, ознакомьтесь с общими правилами приоритета, чтобы понять, какие настройки будут использованы.
Полный список всех плагинов become, включённых в Ansible, можно найти в списке плагинов.
Директивы become
Вы можете задать директивы, которые управляют become на уровне playbook или задачи. Вы можете переопределить их, задав переменные подключения, которые часто отличаются от одного хоста к другому. Эти переменные и директивы независимы. Например, установка become_user не устанавливает become.
- become
-
установлено в
trueдля активации повышения привилегий. - become_user
-
установлено на пользователя с желаемыми правами — пользователя, которым вы
become, а НЕ пользователя, под которым вы вошли в систему. Не подразумеваетbecome: true, чтобы позволить его установку на уровне хоста. Значение по умолчанию —root. - become_method
-
(на уровне playbook или задачи) переопределяет метод по умолчанию, установленный в
ansible.cfg, и устанавливает любой из плагинов become. - become_flags
-
(на уровне playbook или задачи) позволяют использовать определённые флаги для задач или ролей. Одно из распространённых применений — изменение пользователя на nobody, когда оболочка установлена на nologin. Добавлено в Ansible 2.2.
Например, чтобы управлять системной службой (требующей привилегий root), подключившись как непривилегированный пользователь, можно использовать значение по умолчанию become_user (root):
- name: Ensure the httpd service is running
service:
name: httpd
state: started
become: true
Чтобы выполнить команду как пользователь apache:
- name: Run a command as the apache user command: somecommand become: true become_user: apache
Чтобы выполнить действие как пользователь nobody при установленной оболочке nologin:
- name: Run a command as nobody command: somecommand become: true become_method: su become_user: nobody become_flags: '-s /bin/sh'
Чтобы указать пароль для sudo, выполните ansible-playbook с --ask-become-pass (-K для краткости). Если вы выполняете playbook, использующий become, и playbook зависает, скорее всего, он застрял на запросе повышения привилегий. Остановите его CTRL-c, затем выполните playbook с -K и соответствующим паролем.
Переменные подключения become
Вы можете определить различные опции become для каждого управляемого узла или группы. Вы можете определить эти переменные в инвентаре или использовать их как обычные переменные.
- ansible_become
-
переопределяет директиву
becomeи определяет, используется ли повышение привилегий. - ansible_become_method
-
метод повышения привилегий, который следует использовать
- ansible_become_user
-
устанавливает пользователя, до которого вы повышаете привилегии; не подразумевает
ansible_become: true - ansible_become_password
-
устанавливает пароль повышения привилегий. См. Использование зашифрованных переменных и файлов для получения информации о том, как избежать наличия секретов в открытом виде
- ansible_common_remote_group
-
определяет, должен ли Ansible пытаться
chgrpсвои временные файлы в группу, еслиsetfaclиchownоба терпят неудачу. См. Риски повышения привилегий до непривилегированного пользователя для получения дополнительной информации. Добавлено в версии 2.10.
Например, если вы хотите выполнить все задачи как root на сервере с именем webserver, но можете подключиться только как пользователь manager, вы можете использовать запись в инвентаре следующим образом:
webserver ansible_user=manager ansible_become=true
Примечание
Переменные, определённые выше, являются общими для всех плагинов become, но также могут быть установлены и специфичные для плагина. Обратитесь к документации для каждого плагина для получения списка всех опций, имеющихся у плагина, и способов их определения. Полный список плагинов become в Ansible можно найти по адресу плагины become.
Опции командной строки become
- --ask-become-pass, -K
-
запросить пароль повышения привилегий; не подразумевает, что будет использоваться become. Обратите внимание, что этот пароль будет использоваться для всех хостов.
- --become, -b
-
выполнить операции с become (пароль не подразумевается)
- --become-method=BECOME_METHOD
-
метод повышения привилегий для использования (по умолчанию=sudo), допустимые значения: [ sudo | su | pbrun | pfexec | doas | dzdo | ksu | runas | machinectl ]
- --become-user=BECOME_USER
-
выполнить операции от имени этого пользователя (по умолчанию=root), не подразумевает
--become/-b
Риски и ограничения become
Хотя повышение привилегий в основном интуитивно понятно, существуют некоторые ограничения в его работе. Пользователи должны быть осведомлены об этих ограничениях, чтобы избежать неожиданностей.
Риски повышения привилегий до обычного пользователя
Модули Ansible выполняются на удалённой машине путём сначала подстановки параметров в файл модуля, затем копирования файла на удалённую машину и, наконец, его выполнения там.
Всё в порядке, если файл модуля выполняется без использования become, когда become_user имеет права root, или когда подключение к удалённой машине выполняется как root. В этих случаях Ansible создаёт файл модуля с правами, которые позволяют читать только пользователю и root, или только позволяют читать обыкновенному пользователю, к которому происходит переключение.
Однако, когда и пользователь подключения, и become_user — обычные пользователи, файл модуля записывается как пользователь, от имени которого Ansible подключается (remote_user), но файл должен быть читаемым пользователем, к которому Ansible настроен (become). Подробности того, как Ansible решает эту проблему, могут варьироваться в зависимости от платформы. Однако на POSIX-системах Ansible решает эту проблему следующим образом:
Во-первых, если setfacl установлен и доступен на удалённой PATH, а временная директория на удалённом хосте смонтирована с поддержкой POSIX.1e ACL для файловой системы, Ansible будет использовать POSIX ACL для совместного доступа к файлу модуля со вторым обычным пользователем.
Далее, если POSIX ACL недоступны или setfacl не удалось запустить, Ansible попытается изменить владельца файла модуля, используя chown для систем, которые поддерживают это выполнение обычным пользователем.
С Ansible 2.11 в этот момент Ansible попробует chmod +a, что является специфичным для macOS способом установки ACL для файлов.
С Ansible 2.10, если всё вышеперечисленное не сработает, Ansible проверит значение параметра конфигурации ansible_common_remote_group. Многие системы позволят данному пользователю изменить владение группой файла на группу, в которой этот пользователь состоит. В результате, если у второго обычного пользователя (become_user) есть общая UNIX-группа с пользователем, от имени которого подключён Ansible (remote_user), и если ansible_common_remote_group определён как эта группа, Ansible может попытаться изменить владение группой файла модуля на эту группу, используя chgrp, тем самым, сделав его читаемым для become_user.
В этот момент, если ansible_common_remote_group был определён и chgrp был успешно выполнен, Ansible предполагает (но, что важно, не проверяет), что нового владельца группы достаточно и не делает дальнейших попыток. То есть Ansible **не проверяет**, что become_user действительно является членом группы с remote_user; если команда выполнена успешно, Ansible считает результат успешным и не переходит к проверке world_readable_temp согласно описанию ниже.
Если ansible_common_remote_group **не** установлен и описанный выше chown завершился неудачей, или если ansible_common_remote_group *установлен*, но chgrp (или последующие права группы chmod) вернули не успешный код выхода, Ansible в последнюю очередь проверит параметр world_readable_temp. Если он установлен, Ansible поместит файл модуля в временную директорию с правами чтения для всех, что позволит become_user (и, кстати, любому другому пользователю в системе) читать содержимое файла. **Если какие-либо параметры, передаваемые в модуль, носят конфиденциальный характер, и вы не доверяете удалённым машинам, то это потенциальный риск безопасности.**
После завершения выполнения модуля Ansible удаляет временный файл.
Существует несколько способов полностью избежать вышеописанного логического потока:
- Используйте
pipelining. При включённом конвейерном режиме Ansible не сохраняет модуль во временный файл на клиенте. Вместо этого он перенаправляет модуль в стандартный ввод удалённого интерпретатора Python. Конвейерный режим не работает для Python-модулей, связанных с передачей файлов (например: copy, fetch, template), или для модулей, не являющихся Python-модулями. - Избегайте повышения привилегий до обычного пользователя. Временные файлы защищены правами доступа в UNIX при переключении на root или при отсутствии использования
become. В Ansible 2.1 и выше права доступа в UNIX также защищены, если вы подключаетесь к управляемой машине как root, а затем используетеbecomeдля доступа к учётной записи обычного пользователя.
Предупреждение
Хотя файловая система Solaris ZFS имеет ACL, эти ACL не являются POSIX.1e ACL (они являются NFSv4 ACL). Ansible не может использовать эти ACL для управления правами своего временного файла, поэтому вам может потребоваться воспользоваться параметром world_readable_temp, если удалённые машины используют ZFS.
Изменено в версии 2.1.
Ansible затрудняет неосознанное небезопасное использование become. Начиная с Ansible 2.1, Ansible по умолчанию выдаёт ошибку, если не может безопасно выполнить become. Если вы не можете использовать конвейерный режим или POSIX ACL, должны подключаться как обычный пользователь, должны использовать become для выполнения от имени другого обычного пользователя и считаете, что ваши управляемые узлы достаточно безопасны, чтобы модули, которые вы хотите запустить на них, были доступны всем, вы можете включить параметр world_readable_temp, что изменит это с ошибки на предупреждение и позволит задаче выполняться так, как это было до версии 2.1.
Изменено в версии 2.10.
Ansible 2.10 вводит вышеупомянутую отсечку по умолчанию ansible_common_remote_group. Как упоминалось выше, если он включен, он используется, когда remote_user и become_user — оба обычные пользователи. Обратитесь к вышеизложенному тексту для получения подробностей о том, когда происходит эта отсечка.
Предупреждение
Как упоминалось выше, если ansible_common_remote_group и world_readable_temp оба включены, маловероятно, что отсечка world-readable будет когда-либо срабатывать, но Ansible всё равно может не получить доступ к файлу модуля. Это происходит потому, что после успешного изменения владения группой Ansible не делает дальнейших проверок и также не проверяет, является ли become_user членом «общей группы». Это решение по дизайну, так как такая проверка потребует дополнительного обращения к удалённой машине, что является дорогостоящей операцией по времени. Однако Ansible выводит предупреждение в этом случае.
Не поддерживается всеми плагинами подключения
Методы повышения привилегий также должны поддерживаться используемым плагином подключения. Большинство плагинов подключения выдадут предупреждение, если они не поддерживают become. Некоторые просто проигнорируют его, так как всегда выполняют работу от имени root (тюрьма, chroot и т. д.).
Разрешено только один метод на хост
Методы не могут быть объединены. Вы не можете использовать sudo /bin/su - для перехода к пользователю, вам необходимо иметь права на выполнение команды от имени этого пользователя в sudo или иметь возможность su непосредственно к нему (то же самое для pbrun, pfexec или других поддерживаемых методов).
Повышение привилегий должно быть общим
Вы не можете ограничить права повышения привилегий определёнными командами. Ansible не всегда использует конкретную команду для выполнения действий, но запускает модули (код) из временного файла с именем, меняющимся каждый раз. Если у вас есть `/sbin/service` или `/bin/chmod` в качестве разрешённых команд, это не сработает с Ansible, так как эти пути не будут совпадать с временным файлом, который Ansible создаёт для выполнения модуля. Если у вас есть правила безопасности, которые ограничивают вашу sudo/pbrun/doas среду для выполнения только определённых путей команд, используйте Ansible от специальной учётной записи, у которой нет этого ограничения, или используйте AWX или Red Hat Ansible Automation Platform для управления косвенным доступом к SSH-ключам.
Невозможно получить доступ к переменным окружения, заполненным pamd_systemd
Для большинства дистрибутивов Linux, использующих systemd в качестве своего init, используемые по умолчанию методы become не открывают новую «сессию» в смысле systemd. Поскольку модуль pam_systemd не полностью инициализирует новую сессию, у вас могут возникнуть неожиданности по сравнению с обычной сессией, открытой через ssh: некоторые переменные среды, установленные pam_systemd, в частности XDG_RUNTIME_DIR, не заполняются для нового пользователя и вместо этого наследуются или просто очищаются.
Это может вызвать проблемы при попытке вызвать systemd команды, которые зависят от XDG_RUNTIME_DIR для доступа к шине:
$ echo $XDG_RUNTIME_DIR $ systemctl --user status Failed to connect to bus: Permission denied
Чтобы принудительно заставить become открыть новую systemd сессию, которая проходит через pam_systemd, вы можете использовать become_method: machinectl.
Дополнительную информацию можно найти в этой проблеме systemd.
Решение проблем с ошибками временных файлов
- Не удалось установить права доступа на временные файлы, которые Ansible должен создать при повышении привилегий до обычного пользователя
- Эту ошибку можно исправить, установив пакет, который предоставляет команду
setfacl(часто это пакетacl, но проверьте документацию вашей ОС).
Автоматизация повышения привилегий и сетевых операций
Начиная с версии 2.6, Ansible поддерживает become для повышения привилегий (переход в режим enable или режим привилегированных команд EXEC) на всех поддерживающих enable сетевых платформах, управляемых Ansible. Использование become заменяет опции authorize и auth_pass в словаре provider.
Для использования become для повышения привилегий на сетевых устройствах, необходимо установить тип подключения либо на connection: ansible.netcommon.network_cli, либо на connection: ansible.netcommon.httpapi. Подробную информацию см. в документации по Параметрам платформ.
Вы можете использовать повышенные привилегии только для конкретных задач, для всего выполнения (play) или для всех выполнений. Добавление become: true и become_method: enable указывает Ansible на необходимость перехода в режим enable перед выполнением задачи, выполнения или книги задач (playbook), где установлены эти параметры.
Если вы видите это сообщение об ошибке, задача, которая его сгенерировала, требует режима enable для успешного выполнения:
Invalid input (privileged mode required)
Для установки режима enable для конкретной задачи добавьте become на уровне задачи:
- name: Gather facts (eos)
arista.eos.eos_facts:
gather_subset:
- "!hardware"
become: true
become_method: enable
Чтобы включить режим для всех задач в одном выполнении (play), добавьте become на уровне выполнения (play):
- hosts: eos-switches
become: true
become_method: enable
tasks:
- name: Gather facts (eos)
arista.eos.eos_facts:
gather_subset:
- "!hardware"
Установка режима enable для всех задач
Часто необходимо, чтобы все задачи во всех выполнениях (play) выполнялись с режимом привилегий. Лучше всего это достигается с помощью group_vars.
group_vars/eos.yml
ansible_connection: ansible.netcommon.network_cli ansible_network_os: arista.eos.eos ansible_user: myuser ansible_become: true ansible_become_method: enable
Пароли для режима enable
Если для входа в режим enable требуется пароль, вы можете указать его двумя способами:
- предоставление параметра командной строки
--ask-become-pass - установка переменной подключения
ansible_become_password
Предупреждение
Напоминаем, что пароли никогда не должны храниться в открытом виде. Для получения информации об шифровании паролей и других секретов с помощью Ansible Vault, см. Ansible Vault.
Become и Windows
Начиная с Ansible 2.3, become может использоваться на хостах Windows через метод runas. Become на Windows использует ту же настройку инвентаризации и аргументы вызова, что и become на хостах, не являющихся Windows, поэтому настройка и имена переменных такие же, как определено в этом документе, за исключением become_user. Поскольку для become_user в Windows нет разумного значения по умолчанию, оно требуется при использовании become. Подробности см. в плагине ansible.builtin.runas become.
Хотя become может использоваться для принятия личности другого пользователя, существуют и другие варианты его применения с хостами Windows. Важное применение — обойти некоторые ограничения, налагаемые при выполнении на WinRM, такие как ограниченная делегация сети или доступ к запрещённым системным вызовам, например, API WUA. Вы можете использовать become с тем же пользователем, что и ansible_user, чтобы обойти эти ограничения и выполнить команды, которые обычно недоступны в сеансе WinRM.
Примечание
В Windows нельзя подключиться с учетной записью с ограниченными правами и использовать become для повышения прав. Become может быть использован только в том случае, если учетная запись подключения уже является администратором целевого хоста.
Права администратора
Многие задачи в Windows требуют административных привилегий для выполнения. При использовании метода become runas, Ansible попытается выполнить модуль с полными правами, доступными пользователю become. Если повышение прав пользователя не удастся, оно продолжит использовать ограниченный токен во время выполнения.
Пользователь должен иметь SeDebugPrivilege для запуска процесса become с повышенными привилегиями. Эта привилегия назначается администраторам по умолчанию. Если привилегия отладки недоступна, процесс become будет выполняться с ограниченным набором привилегий и групп.
Чтобы определить тип токена, который Ansible смог получить, выполните следующую задачу:
- name: Check my username ansible.windows.win_whoami: become: true
Вывод будет примерно таким:
ok: [windows] => {
"account": {
"account_name": "vagrant-domain",
"domain_name": "DOMAIN",
"sid": "S-1-5-21-3088887838-4058132883-1884671576-1105",
"type": "User"
},
"authentication_package": "Kerberos",
"changed": false,
"dns_domain_name": "DOMAIN.LOCAL",
"groups": [
{
"account_name": "Administrators",
"attributes": [
"Mandatory",
"Enabled by default",
"Enabled",
"Owner"
],
"domain_name": "BUILTIN",
"sid": "S-1-5-32-544",
"type": "Alias"
},
{
"account_name": "INTERACTIVE",
"attributes": [
"Mandatory",
"Enabled by default",
"Enabled"
],
"domain_name": "NT AUTHORITY",
"sid": "S-1-5-4",
"type": "WellKnownGroup"
},
],
"impersonation_level": "SecurityAnonymous",
"label": {
"account_name": "High Mandatory Level",
"domain_name": "Mandatory Label",
"sid": "S-1-16-12288",
"type": "Label"
},
"login_domain": "DOMAIN",
"login_time": "2018-11-18T20:35:01.9696884+00:00",
"logon_id": 114196830,
"logon_server": "DC01",
"logon_type": "Interactive",
"privileges": {
"SeBackupPrivilege": "disabled",
"SeChangeNotifyPrivilege": "enabled-by-default",
"SeCreateGlobalPrivilege": "enabled-by-default",
"SeCreatePagefilePrivilege": "disabled",
"SeCreateSymbolicLinkPrivilege": "disabled",
"SeDebugPrivilege": "enabled",
"SeDelegateSessionUserImpersonatePrivilege": "disabled",
"SeImpersonatePrivilege": "enabled-by-default",
"SeIncreaseBasePriorityPrivilege": "disabled",
"SeIncreaseQuotaPrivilege": "disabled",
"SeIncreaseWorkingSetPrivilege": "disabled",
"SeLoadDriverPrivilege": "disabled",
"SeManageVolumePrivilege": "disabled",
"SeProfileSingleProcessPrivilege": "disabled",
"SeRemoteShutdownPrivilege": "disabled",
"SeRestorePrivilege": "disabled",
"SeSecurityPrivilege": "disabled",
"SeShutdownPrivilege": "disabled",
"SeSystemEnvironmentPrivilege": "disabled",
"SeSystemProfilePrivilege": "disabled",
"SeSystemtimePrivilege": "disabled",
"SeTakeOwnershipPrivilege": "disabled",
"SeTimeZonePrivilege": "disabled",
"SeUndockPrivilege": "disabled"
},
"rights": [
"SeNetworkLogonRight",
"SeBatchLogonRight",
"SeInteractiveLogonRight",
"SeRemoteInteractiveLogonRight"
],
"token_type": "TokenPrimary",
"upn": "vagrant-domain@DOMAIN.LOCAL",
"user_flags": []
}
В ключе label, запись account_name определяет, имеет ли пользователь права администратора. Вот метки, которые могут быть возвращены и что они представляют:
-
Medium: Ansible не смог получить повышенный токен и выполнился с ограниченным токеном. Во время выполнения модуля доступна только часть привилегий, назначенных пользователю, и у пользователя нет прав администратора. -
High: Был использован повышенный токен, и все привилегии, назначенные пользователю, доступны во время выполнения модуля. -
System: Используется учетная записьNT AUTHORITY\System, которая имеет наивысший уровень доступных привилегий.
Вывод также покажет список привилегий, предоставленных пользователю. Когда значение привилегии равно disabled, привилегия назначена токену входа, но не активирована. В большинстве случаев эти привилегии автоматически активируются при необходимости.
Если выполнение происходит на версии Ansible, более ранней чем 2.5, или обычный процесс повышения прав runas терпит неудачу, повышенный токен можно получить:
- Установите
become_userв значениеSystem, которое имеет полный контроль над операционной системой. -
Предоставьте
SeTcbPrivilegeпользователю Ansible, подключающемуся к WinRM.SeTcbPrivilege— это привилегия высокого уровня, предоставляющая полный контроль над операционной системой. По умолчанию ни одному пользователю эта привилегия не предоставляется, и следует проявлять осторожность при предоставлении этой привилегии пользователю или группе. Дополнительную информацию об этой привилегии см. в Действовать от имени операционной системы. Вы можете использовать следующую задачу для установки этой привилегии на хосте Windows:- name: grant the ansible user the SeTcbPrivilege right ansible.windows.win_user_right: name: SeTcbPrivilege users: '{{ansible_user}}' action: add -
Отключите UAC на хосте и перезагрузите его перед повторной попыткой повышения прав. UAC — это протокол безопасности, разработанный для запуска учетных записей с принципом
least privilege. Вы можете отключить UAC, выполнив следующие задачи:- name: turn UAC off win_regedit: path: HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system name: EnableLUA data: 0 type: dword state: present register: uac_result - name: reboot after disabling UAC win_reboot: when: uac_result is changed
Примечание
Предоставление SeTcbPrivilege или отключение UAC может привести к уязвимостям безопасности Windows, и следует проявлять осторожность при выполнении этих шагов.
Учетные записи локальных служб
До версии Ansible 2.5, become работало только с учетной записью локального или доменного пользователя в Windows. Учетные записи локальных служб, такие как System или NetworkService, не могли использоваться в качестве become_user в этих более ранних версиях. Это ограничение было снято с момента выпуска Ansible 2.5. Три учетные записи служб, которые можно установить в become_user, следующие:
- System
- NetworkService
- LocalService
Поскольку учетные записи локальных служб не имеют паролей, параметр ansible_become_password не требуется и игнорируется, если указан.
Become без задания пароля
Начиная с Ansible 2.8, become можно использовать для повышения прав локальной или доменной учетной записи Windows без необходимости ввода пароля для этой учетной записи. Для работы этого метода должны быть выполнены следующие требования:
- Пользователь подключения имеет привилегию
SeDebugPrivilege - Пользователь подключения входит в группу
BUILTIN\Administrators - Учетная запись
become_userимеет право пользователяSeBatchLogonRightилиSeNetworkLogonRight
Использование become без пароля достигается одним из двух методов:
- Дублирование токена существующего сеанса входа, если учетная запись уже подключена
- Использование S4U для создания токена входа, действительного только на удалённом хосте
В первом случае процесс become запускается из другого входа той же учетной записи пользователя. Это может быть существующий RDP-вход, консольный вход, но это не гарантируется.
В случае, если другой вход учетной записи become не существует, используется S4U для создания нового входа и запуска модуля через него. Это аналогично Run whether user is logged on or not с опцией Do not store password для задачи планировщика. В этом случае процесс become не сможет получить доступ к сетевым ресурсам, как обычный процесс WinRM.
Чтобы отличить использование become без пароля от повышения прав для учетной записи без пароля, убедитесь, что ansible_become_password не определено или установлено в ansible_become_password:.
Примечание
Поскольку нет гарантии, что для пользователя при выполнении Ansible будет существовать существующий токен, велика вероятность, что процесс become будет иметь доступ только к локальным ресурсам. Используйте become с паролем, если задача должна получить доступ к сетевым ресурсам
Учетные записи без пароля
Предупреждение
В качестве общей рекомендации по безопасности следует избегать предоставления учетных записей без паролей.
Ansible можно использовать для повышения прав учетной записи Windows, у которой нет пароля (например, учетной записи Guest). Чтобы повысить права для учетной записи без пароля, настройте переменные как обычно, но установите ansible_become_password: ''.
Прежде чем become сможет работать с такой учетной записью, необходимо отключить локальную политику Accounts: Limit local account use of blank passwords to console logon only. Это можно сделать либо через объект групповой политики (GPO), либо с помощью этой задачи Ansible:
- name: allow blank password on become
ansible.windows.win_regedit:
path: HKLM:\SYSTEM\CurrentControlSet\Control\Lsa
name: LimitBlankPasswordUse
data: 0
type: dword
state: present
Примечание
Это относится только к учетным записям без пароля. Вы по-прежнему должны установить пароль учетной записи в ansible_become_password, если у пользователя become есть пароль.
Флаги become для Windows
В Ansible 2.5 был добавлен параметр become_flags к методу runas become. Этот параметр можно задать с помощью директивы задачи become_flags или в конфигурации Ansible с помощью ansible_become_flags. Два допустимых значения, которые изначально поддерживаются для этого параметра, это logon_type и logon_flags.
Примечание
Эти флаги следует устанавливать только при переходе к обычному учетной записи пользователя, а не к локальной учетной записи службы, такой как LocalSystem.
Ключ logon_type задаёт тип операции входа в систему. Значение может быть установлено на одно из следующих:
-
interactive: Тип входа по умолчанию. Процесс будет запущен в контексте, аналогичном запуску процесса локально. Это обходит все ограничения WinRM и является рекомендуемым методом. -
batch: Запускает процесс в контексте пакетной обработки, похожем на запланированную задачу с установленным паролем. Это должно обойти большинство ограничений WinRM и полезно, еслиbecome_userне разрешено входить в систему интерактивно. -
new_credentials: Запускает процесс с теми же учетными данными, что и вызывающий пользователь, но исходящие подключения выполняются в контекстеbecome_userиbecome_password, аналогичноrunas.exe /netonly. Также должен быть установлен флагlogon_flagsв значениеnetcredentials_only. Используйте этот флаг, если процесс должен получить доступ к сетевому ресурсу (например, к общему ресурсу SMB) с использованием другого набора учетных данных. -
network: Запускает процесс в сетевом контексте без кэширования учетных данных. Это приводит к тому же типу сеанса входа в систему, что и запуск обычного процесса WinRM без делегирования учетных данных и работает в тех же ограничениях. -
network_cleartext: Как тип входаnetwork, но вместо этого кэширует учетные данные для доступа к сетевым ресурсам. Это соответствует типу сеанса входа в систему, как при запуске обычного процесса WinRM с делегированием учетных данных.
Дополнительную информацию можно найти в dwLogonType.
Ключ logon_flags определяет, как Windows войдёт в систему пользователя при создании нового процесса. Значение может быть установлено на none или на комбинацию следующих:
-
with_profile: Установленный по умолчанию флаг входа в систему. Процесс загрузит профиль пользователя в ключе реестраHKEY_USERSдоHKEY_CURRENT_USER. -
netcredentials_only: Процесс будет использовать тот же маркер, что и вызывающий, но будет использоватьbecome_userиbecome_passwordпри доступе к удалённому ресурсу. Это полезно в сценариях междоменных взаимодействий, где нет отношения доверия, и должно использоваться с флагомnew_credentialslogon_type.
По умолчанию logon_flags=with_profile установлен, если профиль не должен загружаться, установите logon_flags=, или если профиль должен загрузиться с netcredentials_only, установите logon_flags=with_profile,netcredentials_only.
Дополнительную информацию можно найти в dwLogonFlags.
Ниже приведены примеры использования become_flags с задачами Windows:
- name: copy a file from a fileshare with custom credentials
ansible.windows.win_copy:
src: \\server\share\data\file.txt
dest: C:\temp\file.txt
remote_src: true
vars:
ansible_become: true
ansible_become_method: runas
ansible_become_user: DOMAIN\user
ansible_become_password: Password01
ansible_become_flags: logon_type=new_credentials logon_flags=netcredentials_only
- name: run a command under a batch logon
ansible.windows.win_whoami:
become: true
become_flags: logon_type=batch
- name: run a command and not load the user profile
ansible.windows.win_whomai:
become: true
become_flags: logon_flags=
Ограничения become на Windows
- Запуск задачи с
asyncиbecomeна Windows Server 2008, 2008 R2 и Windows 7 работает только при использовании Ansible 2.7 или новее. - По умолчанию пользователь become входит в систему с интерактивным сеансом, поэтому он должен иметь право на это на хосте Windows. Если он не наследует привилегию
SeAllowLogOnLocallyили наследует привилегиюSeDenyLogOnLocally, процесс become завершится ошибкой. Добавить привилегию или установить флагlogon_typeдля изменения типа входа в систему. - До версии Ansible 2.3, become работал только когда
ansible_winrm_transportбыл либоbasicилиcredsspЭто ограничение снято с версии Ansible 2.4 для всех хостов, кроме Windows Server 2008 (без версии R2). - Сервис вторичного входа
seclogonдолжен быть запущен для использованияansible_become_method: runas. - Пользователь подключения должен быть администратором на хосте Windows для использования
runas. Целевой пользователь become не должен быть администратором.
См. также
- Связь
-
Есть вопросы? Нужна помощь? Хотите поделиться идеями? Посетите руководство по коммуникации 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/playbook_guide/playbooks_privilege_escalation.html