RuToken + Ansible: костыль с локальной аутентификацией
Ansible не поддерживает управление хостами с двухфакторной аутентификацией (2FA), причина этого разъясняется в FAQ (https://docs.ansible.com/ansible/latest/reference_appendices/faq.html).
Рекомендации различных ресурсов интернета по обходу этого ограничения можно свести к трем группам:
- выделить на хосте пользователя, под которым будет исполняться
Ansible, и для этого пользователя в настройках
sudoотменить запрос пароля; - также выделить пользователя для Ansible и изменить настройки PAM или SSH-сервера, чтобы для этого пользователя 2FA стала необязательной;
- разработать become plugin для Ansible, который будет служить
оберткой программы
sudoи обрабатывать приглашение 2FA.
Однако когда Ansible обслуживает тот же хост, на котором она запускается, существует простая лазейка.
Вначале опишу симптомы проблемы.
Я использую RuToken ЭЦП для локального входа на рабочую станцию под Linux, токен используется как необязательное средство аутентификации. Настроено по документации RuToken (https://dev.rutoken.ru/pages/viewpage.action?pageId=3440696 и https://dev.rutoken.ru/pages/viewpage.action?pageId=3440665).
Для подключения к хосту этой рабочей станции в Ansible используется локальное соединение, повышение привилегий — по умолчанию (в [sudo]). Файлы inventory зашифрованы в Ansible Vault.
Файл hosts.yml:
all:
hosts:
workstation1:
ansible_python_interpreter: /usr/bin/python3.9
ansible_connection: local
ansible_become_pass: PASSWORD
Если к компьютеру токен не подключен, повышение привилегий происходит успешно:
$ ansible workstation1 -m ping -b
Vault password:
workstation1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Если же токен подключен, повышение привилегий не происходит: после ввода
пароля от vault на терминал ничего не выводится, а после прерывания
работы Ansible клавиатурной комбинацией Ctrl+C приходит уведомление
безопасности, содержащее «a password is required».
Лазейка — в том, чтобы в терминале, где позже будет запущена
Ansible, выполнить команду sudo. В
течение некоторого времени после этого (по умолчанию — 15 минут)
повышение привилегий произойдет без повторной аутентификации.
Пример:
$ sudo which false
Login with RuToken001:
/usr/bin/false
$ ansible workstation1 -m ping -b
Vault password:
workstation1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Пусть такое решение — очевидный костыль, надеюсь, оно будет вам полезным.
Опубликовано на Хабре 27 марта 2023 года, URL: https://habr.com/ru/sandbox/188360/
Опубликовано в ЖЖ 23 апреля 2023 года, URL: https://moury.livejournal.com/124406.html
Вы можете комментировать в ЖЖ.