Перейти к основному содержимому
Версия: Privileged Access Manager 3.4

Ansible Lookup Plugin

С помощью Lookup Plugin можно управлять учетными данными Indeed PAM прямо в Ansible-плейбуках.
Все запросы на получение и просмотр учетных данных записываются в журнал События.

Примечание

Для управления данными учетных записей Indeed PAM используется метод Application to Application Password Management (AAPM).

Требования

Для работы с Ansible Lookup Plugin требуется:

Предварительные действия

Чтобы настроить работу с Ansible Lookup Plugin:

  1. Перейдите в папку с пакетом AAPM для Python SDK и выполните команду:

    pip install pam_aapm-3.4.0-py3-none-any.whl
  2. Перейдите в папку с дистрибутивом Lookup Plugin для Ansible Collection и выполните команду:

    ansible-galaxy collection install indeed-pam-3.4.0.tar.gz
  3. Перейдите в консоль администратора Indeed PAM и добавьте приложение.
  4. Для приложения добавьте разрешение с включенной опцией Разрешить просмотр учетных данных.
    Разрешение позволит приложению использовать пароли и SSH-ключи учетных записей PAM.
  5. Назначьте администраторов приложения, которые могут просматривать его пароль.
  6. Откройте консоль пользователя Indeed PAM и перейдите на вкладку Приложения.
  7. Просмотрите пароль от приложения и сохраните его.

Далее настройте конфигурацию Ansible и получите доступ к серверу Indeed PAM.

Настройка Ansible

Чтобы установить соединение с сервером Indeed PAM и получить токены доступа, настройте конфигурацию Ansible одним из способов:

  • Конфигурационный файл ansible.cfg — укажите переменные в файле, если конфигурация между запусками сценария не меняется. Рекомендуется шифровать учетные данные или передавать их через переменные окружения.
  • Переменные окружения — укажите переменные в терминале перед запуском сценария. Переменные существуют только в рамках текущей сессии. Рекомендуется использовать в CI/CD-автоматизациях.
  • Ansible-плейбук — передайте параметры как именованные аргументы при вызове функции lookup(). Способ подходит, когда нужно обратиться к другому серверу или переопределить параметр, например ca_cert.

Подробнее о работе сценария, если конфигурация определена в нескольких местах, — в документации Ansible.

Параметры конфигурации
ПараметрПеременная окруженияТребование
Описание
idp_serverPAM_IDP_SERVERОбязательныйURL-адрес компонента Indeed PAM IdP
core_serverPAM_CORE_SERVERОбязательныйURL-адрес компонента Indeed PAM Core
usernamePAM_USERNAMEОбязательныйНазвание приложения
passwordPAM_PASSWORDОбязательныйПароль указанного приложения. Администратор приложения может просмотреть пароль в консоли пользователя.
timeoutPAM_TIMEOUTНеобязательныйВремя ожидания ответа на запрос, сек.
Значение по умолчанию: 30.0.
verify_sslPAM_VERIFY_SSLНеобязательныйПроверка SSL-сертификата сервера:
  • True — требуется;
  • False — не требуется.
Значение по умолчанию: True.

Примечание: Включенная проверка уменьшает риск перехвата данных. Если вы отключили проверку — рекомендуется обратить на это внимание в скрипте и оставить комментарий.
ca_certPAM_CA_CERTНеобязательныйПуть к сертификату для проверки SSL-соединения. Укажите, если сервер PAM использует сертификат, подписанный внутренним УЦ. Сертификат должен быть в формате PEM.

Пример: ca_cert="/path/to/ca.crt".
Значение по умолчанию: None.
Примеры
[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

После настройки доступа используйте плагины, чтобы получить учетные данные.

Плагины

Примечание

Используйте параметр no_log: true, чтобы не выводить учетные данные в консоль после завершения задачи.

Плагины Ansible вызываются через функцию lookup() и позволяют получить из Indeed PAM:

get_password

Плагин используется для получения пароля учетной записи PAM.

Параметры get_password
ПараметрТребование
Описание
_termsОбязательныйИмя учетной записи в формате:
  • LOCATION/username — рекомендуемый формат;
  • LOCATION\username — требует экранирования в Python-скриптах, например "SERVER\\admin".
Передается вторым аргументом после имени плагина.
reasonНеобязательныйПричина получения учетных данных. Указание причины определяется политикой, действующей на учетную запись.
errorsНеобязательныйРежим обработки ошибок:
  • strict — выводит ошибку и прерывает выполнение задачи. Используйте, когда выполнение сценария без пароля невозможно.
  • warn — выводит предупреждение и присваивает переменной пустую строку. Используйте, если отсутствие пароля не влияет на сценарий.
  • ignore — не выводит сообщений и присваивает переменной пустую строку. Используйте, если ошибку обрабатываете самостоятельно.
- 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ОбязательныйИмя учетной записи в формате:
  • LOCATION/username — рекомендуемый формат;
  • LOCATION\username — требует экранирования в Python-скриптах, например "SERVER\\admin".
Передается вторым аргументом после имени плагина.
decryptНеобязательныйВернуть расшифрованный SSH-ключ:
  • True — вернуть;
  • False — не возвращать.
Значение по умолчанию: True.
reasonНеобязательныйПричина получения учетных данных. Указание причины определяется политикой, действующей на учетную запись.
errorsНеобязательныйРежим обработки ошибок:
  • strict — выводит ошибку и прерывает выполнение задачи. Используйте, когда выполнение сценария без SSH-ключа невозможно.
  • warn — выводит предупреждение и присваивает переменной пустую строку. Используйте, если отсутствие SSH-ключа не влияет на сценарий.
  • ignore — не выводит сообщений и присваивает переменной пустую строку. Используйте, если ошибку обрабатываете самостоятельно.
Параметры ответа
ПараметрОписание
Если в запросе decrypt=True
keySSH-ключ учетной записи в формате 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Требуется ли согласно политике указывать причину для просмотра учетных данных:
  • true — требуется;
  • false — не требуется.
- 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.

Чтобы зашифровать пароль приложения:

  1. Откройте терминал и выполните команду для шифрования пароля:

    ansible-vault encrypt_string --ask-vault-pass '<password>' --name '<variable>'
    • password — пароль приложения Indeed PAM, который нужно зашифровать;
    • variable — имя переменной для шифрования.
  2. Введите пароль, который используется для расшифровки переменной при запуске плейбука.
    В результате в терминале отобразится зашифрованная переменная.

  3. Создайте файл в формате YAML или JSON и сохраните в него результат команды.

    vault_pam_password: !vault |
    $ANSIBLE_VAULT;1.1;AES256
    31643864386664376639656162346664313937633035346638656139376138656163376638656164
    6337663961383964666137633930626439656637666137660a31323334353637383930616263646566
    30313233343536373839616263646566303132333435363738396162636465660a6162636465663132
  4. Укажите переменную в плейбуке:

    • Для параметра 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

Рекомендации по безопасности

  1. Используйте параметр no_log: true, чтобы не выводить учетные данные в консоль при завершении задачи.
  2. Не храните пароли в открытом виде — используйте Ansible Vault для шифрования учетных данных.
  3. Проверка SSL-подключения включена по умолчанию. Отключайте ее только для тестирования в изолированных средах.
  4. При одновременном запуске сценария на разных хостах рекомендуется указывать адрес хоста в причину подключения. Пример: reason='host={{ ansible_host }}; operation=maintenance'.