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

Подключение через SSH Proxy

Indeed PAM поддерживает подключение Ansible к ресурсам через прокси-сервер. При таком сценарии Ansible подключается к компоненту SSH Proxy, который предоставляет доступ к ресурсам по протоколам SSH, SCP и SFTP.

Компонент SSH Proxy контролирует доступ к ресурсу, устанавливает соединение от имени указанной учетной записи и записывает все действия пользователя в журналы События, Активные сессии и Все сессии.

Примечание

В сценарии работы Ansible через SSH Proxy не поддерживается двухфакторная аутентификация. Рекомендуется использовать отдельную учетную запись с настроенной аутентификацией по SSH-ключам.

Требования

Для работы Ansible через SSH Proxy требуется:

  • Ansible 2.14 и выше — установите компонент на хосте, с которого выполняется подключение к SSH Proxy
  • Доступ к компоненту Indeed PAM SSH Proxy
  • Учетная запись Indeed PAM с доступом к SSH-ресурсу
  • AAPM-лицензия, если используется Ansible Lookup Plugin

Настройка подключения

Чтобы настроить подключение из Ansible-плейбука через SSH Proxy:

  1. Сформируйте строку подключения к SSH Proxy в кодировке UTF-8 по шаблону:

    <pam_user>#<resource_address>#<account_name>#[reason]
    • pam_user — имя пользователя Indeed PAM для аутентификации в SSH Proxy
    • resource_address — IP-адрес или DNS-имя целевого ресурса
    • account_name — имя учетной записи, от имени которой пользователь подключается к целевому ресурсу
    • reason — причина подключения к ресурсу, если ее требуется указать согласно политике

    Пример: pam.admin#192.168.0.100#PAM.LOCAL\pam-admin#Обслуживание

    Пример без указания причины: pam.admin#192.168.0.100#PAM.LOCAL\pam-admin##

  2. Настройте конфигурацию Ansible для подключения к Indeed PAM в одном из файлов:

    • Ansible-плейбук — укажите параметры в секции vars.

    • Конфигурационный файл inventory.yml — укажите параметры в секции hosts.

      Параметры конфигурации
      ПараметрТребованиеОписание
      ansible_hostОбязательныйDNS-имя или IP-адрес компонента SSH Proxy
      ansible_portОбязательныйПорт компонента SSH Proxy.
      Порт по умолчанию: 2222.
      ansible_userОбязательныйСтрока подключения к SSH Proxy.
      Пример: pam.admin#10.0.0.1#DOMAIN\admin.
      ansible_passwordНеобязательныйПароль пользователя PAM. Укажите, если настроена аутентификация по паролю. Рекомендуется шифровать пароль с помощью Ansible Vault.
      ansible_ssh_private_key_fileНеобязательныйПуть к SSH-ключу пользователя PAM. Укажите, если настроена аутентификация по SSH-ключу.
      Пример: /home/user/.ssh/id_rsa.
      ansible_ssh_retriesНеобязательныйКоличество повторных попыток подключения. Укажите, чтобы подключиться заново после разрыва соединения или закрытия сессии в консоли администратора Indeed PAM.
      ansible_ssh_extra_argsНеобязательныйПозволяет передавать дополнительные аргументы командной строки SSH-клиенту. Используйте для настройки SCP- и SFTP-подключений.
      Примеры
      - name: Выполнить команду через PAM SSH Proxy
      hosts: all
      gather_facts: false

      vars:
      ansible_host: "pam.company.com"
      ansible_port: 2222
      ansible_user: "pam.admin#192.168.0.100#DOMAIN\\admin"
      ansible_password: "{{ pam_password }}"

      tasks:
      - name: Получить информацию о системе
      ansible.builtin.raw: uname -a
      register: result
      changed_when: false

      - name: Показать результат
      ansible.builtin.debug:
      msg: "{{ result.stdout | trim }}"

Запуск сценария

Чтобы запустить сессию, откройте терминал и выполните команду для подключения к ресурсу через SSH Proxy:

ansible-playbook <playbook> [-i <inventory>] [-e <variable>]
  • playbook — название Ansible-плейбука
  • inventory — имя конфигурационного файла с настройками подключения
  • variable — имя переменной окружения
Примеры команд запуска
Настройки подключения указаны в плейбуке
ansible-playbook playbook.yml
Настройки подключения указаны в конфигурационном файле
ansible-playbook playbook.yml -i inventory.yml
Использование переменной окружения
ansible-playbook playbook.yml -i inventory.yml -e "pam_password=${PAM_PASSWORD}"

Использование Ansible Vault

Рекомендуется шифровать учетные с помощью компонента Ansible Vault, а не хранить их в открытом виде.

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

  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: Выполнить команду через PAM SSH Proxy с использованием Ansible Vault
    hosts: all
    gather_facts: false
    vars_files:
    - ./vault.yml

    vars:
    ansible_host: "pam.company.com"
    ansible_port: 2222
    ansible_user: "pam.admin#192.168.0.100#PAM.LOCAL\\pam-admin"
    ansible_password: "{{ vault_pam_password }}"

    tasks:
    - name: Проверить подключение
    ansible.builtin.raw: id
    register: result
    changed_when: false
    no_log: true
  5. Запустите плейбук с параметров --ask-vault-pass, чтобы Ansible запросил пароль для расшифровки переменной:

    Если настройки подключения указаны в плейбуке
    ansible-playbook playbook.yml --ask-vault-pass
    Если настройки подключения указаны в файле inventory.yml
    ansible-playbook playbook.yml -i inventory.yml --ask-vault-pass

Передача файлов по SCP и SFTP

С хоста, на котором запущен плейбук, можно передать файлы на SSH-ресурс по следующим протоколам:

  • SCP — для быстрой передачи одного файла на ресурс.
  • SFTP — для CI/CD-автоматизаций или передачи нескольких файлов на ресурс.
Ограничения

При передаче файла используйте модуль ansible.builtin.shell и утилиту sshpass.

Модуль ansible.builtin.copy не подходит для передачи файлов через SSH Proxy. Модуль на ресурсе создает временную директорию и загружает туда файл, перемещает файл из временной директории в целевую, назначает права доступа и удаляет временную директорию. Для этого требуется отдельный канал связи, но SSH Proxy разрешает только передачу файлов по SCP и SFTP и завершает сессию сразу после того, как файл передан.

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

В консоли администратора Indeed PAM выполните следующие действия:

  1. Перейдите в раздел Политики и нажмите на нужную политику.
  2. Перейдите в подраздел SSHПередача данных.
  3. Для протоколов SCP и SFTP выберите опцию Разрешена только на ресурс или Разрешена в обоих направлениях.
  4. Нажмите Сохранить.

Настройка хоста

На хосте, с которого планируется подключение к SSH-ресурсу, выполните следующие действия:

  1. Установите утилиту sshpass, которая позволяет автоматически заполнять пароль для SSH-подключения.

    sudo dnf install sshpass
  2. Настройте конфигурацию для подключения к SSH-ресурсу одним из способов:

    • Укажите параметры в файле ssh_config и передайте путь к файлу в переменной ansible_ssh_extra_args — рекомендуемый способ. Настройка в этом файле позволит не экранировать содержимое строки подключения.

    • Укажите параметры напрямую в ansible_ssh_extra_args в файле inventory.yml или Ansible-плейбуке.

      Экранирование специальных символов

      Строка подключения к SSH Proxy содержит спецсимволы # и \ — их необходимо экранировать. При настройке конфигурации в YML-файле указывайте строку подключения в одинарных кавычках.

      При подстановке переменных в команду, например src_file или ansible_user, используйте фильтр quote, чтобы обработать пробелы и спецсимволы.

      Параметры
      Параметр
      Описание
      HostNameDNS-имя или IP-адрес компонента SSH Proxy.
      Можно указать в параметре ansible_host в inventory.yml или плейбуке.
      PortПорт компонента SSH Proxy. Порт по умолчанию: 2222.
      Можно указать в параметре ansible_host в inventory.yml или плейбуке.
      UserСтрока подключения к SSH Proxy.
      Пример: pamadmin@pam.local#ssh-host.example.com#RESOURCE\user##.
      Можно указать в параметре ansible_user в inventory.yml или плейбуке.
      PreferredAuthenticationsПорядок методов аутентификации, которые используются при подключении к прокси-серверу. Возможные значения:
      • keyboard-interactive — интерактивная аутентификация (запрос-ответ)
      • password — аутентификация по паролю
      • publickey — аутентификация по SSH-ключам
      Пример: publickey,keyboard-interactive — сначала проверяется SSH-ключ, и, если он не подошел, сервер запросит пароль.
      KbdInteractiveAuthenticationРазрешить интерактивную аутентификацию методом keyboard-interactive. Возможные значения:
      • true
      • false
      PubkeyAuthenticationРазрешить вход по SSH-ключам. Возможные значения:
      • true
      • false
      NumberOfPasswordPromptsКоличество попыток ввода пароля. При превышении количества попыток соединение с прокси-сервером разрывается.
      UserKnownHostsFileПуть к файлу known_hosts
      StrictHostKeyCheckingПроверка SSH-ключа сервера:
      • yes — строгая проверка. Если ключ сервера не найден в файле known_hosts или не совпадает с сохраненным для этого хоста, подключение прерывается с ошибкой.
      • no — проверка отключена. Если ключа нет в файле known_hosts, он автоматически добавляется.
      • accept-new — проверка только для новых хостов. Если ключа нет в файле known_hosts, он автоматически добавляется, и соединение устанавливается. Если указанный ключ не совпадает с ключом в known_hosts, соединение разрывается.
      Ключи для хостов из known_hosts не перезаписываются.
      ConnectTimeoutВремя ожидания ответа (в секундах) на установку TCP-соединения с сервером
      Примеры
      Параметры заданы в inventory.yml
      all:
      hosts:
      pam_target:
      ansible_connection: ssh
      ansible_host: pam.example.com
      ansible_port: 2222
      ansible_user: 'pamadmin@pam.local#ssh-host.example.com#RESOURCE\pam-user##'
      ansible_password: "{{ vault_pam_password }}"
      ansible_ssh_extra_args: >-
      -tt
      -o PreferredAuthentications=keyboard-interactive,password
      -o KbdInteractiveAuthentication=yes
      -o PubkeyAuthentication=no
      -o NumberOfPasswordPrompts=1
      -o StrictHostKeyChecking=yes
      -o UserKnownHostsFile=./known_hosts
      -o ConnectTimeout=10
      В inventory.yml указан путь к ssh_config
      all:
      hosts:
      pam_target:
      ansible_connection: ssh
      ansible_password: "{{ vault_pam_password }}"
      ansible_ssh_extra_args: '-tt -F ./ssh_config'
      Пример файла ssh_config
      Host pam_target
      HostName pam.example.com
      Port 2222
      User pamadmin@pam.local#ssh-host.example.com#RESOURCE\pam-user##
      PreferredAuthentications keyboard-interactive,password
      KbdInteractiveAuthentication yes
      PubkeyAuthentication no
      NumberOfPasswordPrompts 1
      UserKnownHostsFile ./known_hosts
      StrictHostKeyChecking yes
      ConnectTimeout 10
  3. Добавьте открытый ключ компонента SSH Proxy в файл known_hosts.

    Предупреждение

    Этот шаг обязателен, если для параметра StrictHostKeyChecking указано yes. Если не записать отпечаток прокси-сервера перед первым запуском, плейбук завершится с ошибкой.

    ssh-keyscan [-p <port>] <host> >> ./known_hosts
    • port — порт компонента SSH Proxy
    • host — DNS-имя или IP-адрес компонента SSH Proxy

    Чтобы подтвердить отпечаток, в терминале введите yes.

  4. Запустите плейбук и передайте файлы с хоста на SSH-ресурс по выбранному протоколу.

    ansible-playbook <playbook> \
    -e src_file=<source_path> \
    -e dest_dir=<destination_dir> \
    --ask-vault-pass
    • playbook — название Ansible-плейбука
    • source_path — путь к файлу, который требуется передать с хоста на целевой ресурс
    • dest_dir — директория, куда передается файл с хоста
    • ask-vault-pass — запрос пароля для расшифровки переменных в плейбуке
    Пример плейбука
    ---
    - name: Передача файла через SSH Proxy по протоколу SCP
    hosts: all
    gather_facts: false

    vars:
    src_file: /tmp/file.txt
    dest_dir: /home/user
    dest_file: "{{ dest_dir }}/{{ src_file | basename }}"

    tasks:
    - name: Передача файла через SSH Proxy по протоколу SCP
    delegate_to: localhost
    environment:
    SSHPASS: "{{ ansible_password }}"
    ansible.builtin.shell: >-
    sshpass -e scp
    -F ./ssh_config
    -O
    {{ src_file | quote }}
    {{ inventory_hostname }}:{{ dest_file | quote }}
    register: scp_result
    failed_when: false

    - name: Verify file exists on target
    ansible.builtin.raw: "test -f {{ dest_file | quote }} && echo OK"
    register: verify_result
    changed_when: false
    failed_when: "'OK' not in verify_result.stdout"

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

  1. Для аутентификации сервера и поддержки сценариев автоматизации перед первым подключением к PAM добавьте открытый ключ компонента SSH Proxy в файл known_hosts:

    ssh-keyscan [-p <port>] <host> >> ~/.ssh/known_hosts
    • port — порт компонента SSH Proxy
    • host — DNS-имя или IP-адрес компонента SSH Proxy
    предупреждение

    Убедитесь в подлинности открытого ключа: команда ssh-keyscan использует механизм Trust on first use (TOFU), при котором ключ добавляется без проверки.

  2. При настройке подключения включите проверку открытого ключа: для параметра StrictHostKeyChecking укажите yes.

  3. Не храните пароли в открытом виде — используйте Ansible Vault для шифрования учетных данных.

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

  5. В CI/CD-сценариях передавайте пароль и SSH-ключ через переменные окружения.

  6. Файл ssh_config содержит данные подключения. Рекомендуется ограничить права на файл командой:

    chmod 600 ~/.ssh/config
  7. Для повышения уровня безопасности рекомендуется использовать следующие параметры:

    • gather_facts: false — отключает сбор информации о хосте и позволяет не выводить в логи команды запуска Python-скриптов.

    • no_log: true — отключает вывод в консоль и запись в логи Ansible. Используйте для задач с учетными данными.

    • become: true и become_method: sudo — повышает привилегии пользователя для выполнения команд, требующих прав root.

    • Модуль raw — позволяет выполнять команды через SSH Proxy без установки Python на целевом ресурсе и предоставляет информативный лог в профиле сессии в консоли администратора.

      Пример сценария
      ---
      - name: Выполнить команду через PAM SSH Proxy
      hosts: all
      gather_facts: false
      become: true
      become_method: sudo

      vars:
      ansible_host: "pam.company.com"
      ansible_port: 2222
      ansible_user: "pam.admin#10.10.5.190#PAM.LOCAL\\pam-admin"
      ansible_password: "{{ pam_password }}"

      tasks:
      - name: Выполнить команду (учетные данные скрыты)
      ansible.builtin.raw: uname -a
      register: result
      changed_when: false
      no_log: true

      - name: Показать результат команды (лог отображается)
      ansible.builtin.debug:
      msg: "{{ result.stdout | trim }}"
      no_log: false