Ansible Lookup Plugin
С помощью Lookup Plugin можно управлять учетными данными Indeed PAM прямо в Ansible-плейбуках.
Все запросы на получение и просмотр учетных данных записываются в журнал События.
Для управления данными учетных записей Indeed PAM используется метод Application to Application Password Management (AAPM).
Требования
Для работы с Ansible Lookup Plugin требуется:
- Python 3.9 и выше
- Ansible 2.14 и выше
- AAPM-лицензия
Предварительные действия
Чтобы настроить работу с Ansible Lookup Plugin:
- Перейдите в папку с пакетом AAPM для Python SDK и выполните команду:
pip install pam_aapm-3.4.0-py3-none-any.whl - Перейдите в папку с дистрибутивом Lookup Plugin для Ansible Collection и выполните команду:
ansible-galaxy collection install indeed-pam-3.4.0.tar.gz - Перейдите в консоль администратора Indeed PAM и добавьте приложение.
- Для приложения добавьте разрешение с включенной опцией Разрешить просмотр учетных данных.
Разрешение позволит приложению использовать пароли и SSH-ключи учетных записей PAM. - Назначьте администраторов приложения, которые могут просматривать его пароль.
- Откройте консоль пользователя Indeed PAM и перейдите на вкладку Приложения.
- Просмотрите пароль от приложения и сохраните его.
Далее настройте конфигурацию Ansible и получите доступ к серверу Indeed PAM.
Настройка Ansible
Чтобы установить соединение с сервером Indeed PAM и получить токены доступа, настройте
- Конфигурационный файл ansible.cfg — укажите переменные в файле, если конфигурация между запусками сценария не меняется. Рекомендуется шифровать учетные данные или передавать их через переменные окружения.
- Переменные окружения — укажите переменные в терминале перед запуском сценария. Переменные существуют только в рамках текущей сессии. Рекомендуется использовать в CI/CD-автоматизациях.
- Ansible-плейбук — передайте параметры как именованные аргументы при вызове функции
lookup(). Способ подходит, когда нужно обратиться к другому серверу или переопределить параметр, напримерca_cert.
Подробнее о работе сценария, если конфигурация определена в нескольких местах, — в документации Ansible.
Параметры конфигурации
| Параметр | Требование | Описание | |
|---|---|---|---|
idp_server | PAM_IDP_SERVER | Обязательный | URL-адрес компонента Indeed PAM IdP |
core_server | PAM_CORE_SERVER | Обязательный | URL-адрес компонента Indeed PAM Core |
username | PAM_USERNAME | Обязательный | Название приложения |
password | PAM_PASSWORD | Обязательный | Пароль указанного приложения. Администратор приложения может просмотреть пароль в консоли пользователя. |
timeout | PAM_TIMEOUT | Необязательный | Время ожидания ответа на запрос, сек. Значение по умолчанию: 30.0. |
verify_ssl | PAM_VERIFY_SSL | Необязательный | Проверка SSL-сертификата сервера:
True. Примечание: Включенная проверка уменьшает риск перехвата данных. Если вы отключили проверку — рекомендуется обратить на это внимание в скрипте и оставить комментарий. |
ca_cert | PAM_CA_CERT | Необязательный | Путь к сертификату для проверки SSL-соединения. Укажите, если сервер PAM использует сертификат, подписанный внутренним УЦ. Сертификат должен быть Пример: ca_cert="/path/to/ca.crt".Значение по умолчанию: None. |
Примеры
- Файл ansible.cfg
- Переменные окружения
- Ansible-плейбук
[pam]
idp_server = https://pam.company.com/idp
core_server = https://pam.company.com/core
username = my-app
password = your-app-password
timeout = 30
verify_ssl = true
ca_cert = /path/to/ca.crt
export PAM_IDP_SERVER="https://pam.company.com/idp"
export PAM_CORE_SERVER="https://pam.company.com/core"
export PAM_USERNAME="my-app"
export PAM_PASSWORD="your-app-password"
export PAM_VERIFY_SSL="true"
export PAM_CA_CERT="/path/to/ca.crt"
export PAM_TIMEOUT="30"
- name: Получить пароль с явным указанием сервера
ansible.builtin.set_fact:
db_password: "{{ lookup('indeed.pam.get_password', 'SERVER/admin',
idp_server='https://pam.company.com/idp',
core_server='https://pam.company.com/core',
username='my-app',
password='app-password') }}"
no_log: true
После настройки доступа используйте плагины, чтобы получить учетные данные.
Плагины
Используйте параметр no_log: true, чтобы не выводить учетные данные в консоль после завершения задачи.
Плагины Ansible вызываются через функцию lookup() и позволяют получить из Indeed PAM:
get_password
Плагин используется для получения пароля учетной записи PAM.
Параметры get_password
| Параметр | Требование | Описание |
|---|---|---|
_terms | Обязательный | Имя учетной записи в формате:
|
reason | Необязательный | Причина получения учетных данных. Указание причины определяется политикой, действующей на учетную запись. |
errors | Необязательный | Режим обработки ошибок:
|
- name: Получить пароль администратора
ansible.builtin.set_fact:
admin_password: "{{ lookup('indeed.pam.get_password', 'PROD-SERVER/admin',
reason='Обслуживание', errors='strict') }}"
no_log: true
get_key
Плагин используется для получения SSH-ключа учетной записи PAM.
Параметры get_key
| Параметр | Описание | |
|---|---|---|
_terms | Обязательный | Имя учетной записи в формате:
|
decrypt | Необязательный | Вернуть расшифрованный SSH-ключ:
True. |
reason | Необязательный | Причина получения учетных данных. Указание причины определяется политикой, действующей на учетную запись. |
errors | Необязательный | Режим обработки ошибок:
|
Параметры ответа
| Параметр | Описание |
|---|---|
Если в запросе decrypt=True | |
key | SSH-ключ учетной записи в формате PEM |
Если в запросе decrypt=False | |
key | Зашифрованный SSH-ключ |
passphrase | Пароль зашифрованного ключа |
# Расшифрованный ключ (по умолчанию)
- name: Развернуть SSH-ключ
ansible.builtin.copy:
content: "{{ lookup('indeed.pam.get_key', 'LINUX-SERVER/automation',
reason='Обслуживание', errors='warn')) }}"
dest: /home/deploy/.ssh/id_rsa
mode: '0600'
no_log: true
# Зашифрованный ключ с паролем
- name: Получить SSH-ключ и его пароль
ansible.builtin.set_fact:
ssh_creds: "{{ lookup('indeed.pam.get_key', 'LINUX-SERVER/automation',
decrypt=false) }}"
no_log: true
get_accounts
Плагин используется для получения списка доступных учетных записей PAM и не требует дополнительных параметров.
Параметры ответа
Ответ содержит список учетных записей в формате словаря (dict) с параметрами из таблицы.
| Параметр | Описание |
|---|---|
display_name | Имя учетной записи |
requires_reason | Требуется ли согласно политике указывать причину для просмотра учетных данных:
|
- name: Показать доступные учетные записи
ansible.builtin.debug:
msg: "{{ lookup('indeed.pam.get_accounts') }}"
- name: Показать только имена учетных записей
ansible.builtin.debug:
msg: "{{ lookup('indeed.pam.get_accounts') | map(attribute='display_name') | list }}"
Использование Ansible Vault
Рекомендуется не хранить учетные данные в открытом виде и шифровать их с помощью компонента Ansible Vault.
Чтобы зашифровать пароль приложения:
Откройте терминал и выполните команду для шифрования пароля:
ansible-vault encrypt_string --ask-vault-pass '<password>' --name '<variable>'password— пароль приложения Indeed PAM, который нужно зашифровать;variable— имя переменной для шифрования.
Введите пароль, который используется для расшифровки переменной при запуске плейбука.
В результате в терминале отобразится зашифрованная переменная.Создайте файл в формате YAML или JSON и сохраните в него результат команды.
- YAML
- JSON
vault_pam_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
31643864386664376639656162346664313937633035346638656139376138656163376638656164
6337663961383964666137633930626439656637666137660a31323334353637383930616263646566
30313233343536373839616263646566303132333435363738396162636465660a6162636465663132{
"vault_pam_password": "$ANSIBLE_VAULT;1.1;AES256\n31643864386664376639656162346664313937633035346638656139376138656163376638656164\n6337663961383964666137633930626439656637666137660a31323334353637383930616263646566\n30313233343536373839616263646566303132333435363738396162636465660a6162636465663132"
}Укажите переменную в плейбуке:
- Для параметра
vars_filesукажите путь к файлу, в котором хранится зашифрованная переменная. - Для параметра
passwordукажите имя переменной.
Пример
- name: Получить пароль с использованием Vault
hosts: localhost
gather_facts: false
vars_files:
- ./vault.yml
tasks:
- name: Запросить пароль учетной записи из PAM
ansible.builtin.set_fact:
db_password: "{{ lookup('indeed.pam.get_password',
'SERVER/admin',
idp_server='https://pam.company.com/idp',
core_server='https://pam.company.com/core',
username='my-app',
password=vault_pam_password) }}"
no_log: true- Для параметра
Рекомендации по безопасности
- Используйте параметр
no_log: true, чтобы не выводить учетные данные в консоль при завершении задачи. - Не храните пароли в открытом виде — используйте Ansible Vault для шифрования учетных данных.
- Проверка SSL-подключения включена по умолчанию. Отключайте ее только для тестирования в изолированных средах.
- При одновременном запуске сценария на разных хостах рекомендуется указывать адрес хоста в причину подключения.
Пример: reason='host={{ ansible_host }}; operation=maintenance'.