Назад | Перейти на главную страницу

Можете ли вы установить количество раундов, которое использует фильтр password_hash jinja2 в ansible?

В анзибле довольно удобно использовать что-то вроде этого:

- name: Make sure user password is set 
  user:
    name: my_user
    password: "{{ user_password|password_hash('sha512', 'SomeSalt') }}"

где user_password - это пароль в виде открытого текста, хранящийся в доступном файле хранилища.

В моем ansible 2.5.0, работающем на MacOS, создается хэш пароля, который выглядит примерно так:

$6$rounds=656000$SomeSalt$PlupV2TAHwwc520gHp0dL4padL5EHa50G6hdYm.JLuy4pnP5u2F.HRAHZrGY77BwdRv5UbUGqIAbuhehS00ZD0

У меня проблема в том, что устройство, которое я пытаюсь настроить, является Raspberry Pi, и, как вы можете видеть из сгенерированного хэша, rounds=656000. Для генерации хэша требуется довольно много вычислительной мощности, а на Raspberry Pi это занимает 10-15 секунд. Это означает, что после того, как этот хэш пароля установлен для пользователя, любое действие, которое требует, чтобы Raspberry Pi генерировал хеш для сравнения с ним, например, вход в систему или изменение пароля, также требует 10-15 секунд.

Хуже того, после того, как этот хэш пароля установлен для пользователя, если это пользователь, который подключается к ansible, каждая отдельная задача, выполняемая ansible, занимает значительно больше времени. Время, в течение которого моя playbook запускается против Raspberry Pi в первый раз (когда у задач действительно есть работа) с паролем по умолчанию, составляло около 15 минут. Моя playbook устанавливает пароль пользователя в самом конце. Второй прогон (когда задачам нечего делать) длился около 30 мин.

Я не вижу способа изменить количество раундов в документации для фильтра password_hash (). Можно ли каким-либо образом настроить это значение?

Проведя небольшое исследование, очевидно, что это был запрос функции.

Реализовано Вот.

Для этой функции есть запрос на слияние Вот.

Насколько я могу судить, над этой функцией все еще ведется работа, и она была закрыта из-за бездействия без включения в основной код доступа. Он может быть повторно открыт и завершен в какой-то момент, но текущий доступный код не имеет этой функции.

Похоже, нет возможности предоставить аргумент раундов с использованием фильтра password_hash. Функция, вызываемая фильтром, принимает в качестве аргументов только пароль, тип хэша и соль.

Если вам действительно нужно это установить, вы можете установить mkpasswd (часть пакета whois в Debian / Ubuntu) и запустить его. Это не совсем безопасно: если бы другой человек наблюдал за запущенными процессами в системе, в которой вы запускаете ansible, он бы увидел пароль в выводе «ps ax».

- hosts: slowremote
  gather_facts: no
  tasks:
  - shell: |
      echo 'hunter2' | mkpasswd --method=sha-512 --rounds=1000 --stdin
    register: results
    delegate_to: localhost
  - debug:
      var: results.stdout_lines
  - name: Make sure user password is set 
    user:
      name: my_user
      password: "{{results.stdout_lines}}"

я использовал ожидать модуль для выполнения пароль:

- name: Install required lib
  apt:
    name: 'python-expect'
    state: present
- name: Change user's password
  expect:
    command: passwd pi
    responses:
      'Enter new UNIX password:': "{{ new_password }}"
      'Retype new UNIX password:': "{{ new_password }}"
  no_log: True