您可以设置 ansible 的 password_hash jinja2 过滤器使用的轮数吗?

您可以设置 ansible 的 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 vault 文件中。

在我的 MacOS 上运行的 ansible 2.5.0 上,这会生成一个如下所示的密码哈希:

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

我遇到的问题是,我尝试配置的设备是 Raspberry Pi,从生成的哈希值可以看出。rounds=656000这需要相当多的处理能力来生成哈希值,在 Raspberry Pi 上,需要 10-15 秒。这意味着一旦为用户设置了此密码哈希值,任何需要 Raspberry Pi 生成哈希值以与其进行比较的操作(例如登录或密码更改)也需要 10-15 秒。

更糟糕的是,一旦为用户设置了此密码哈希,如果 ansible 以该用户的身份进行连接,则 ansible 运行的每个任务都需要更长的时间才能完成。我的剧本第一次(当任务实际上有工作要做时)使用默认密码对 Raspberry Pi 运行的时间长度约为 15 分钟。我的剧本在最后设置用户密码。第二次运行(当任务没有任何工作要做时)大约需要 30 分钟。

我在 password_hash() 过滤器的文档中没有找到更改轮数的方法。这个值可以以任何方式配置吗?

答案1

似乎没有任何选项可以使用 password_hash 过滤器提供 rounds 参数。过滤器调用的函数仅接受密码、哈希类型和盐作为参数。

如果您确实需要设置它,您可以安装 mkpasswd(Debian/Ubuntu 上 whois 包的一部分),然后运行它。这不是完全安全的,如果另一个人在您正在运行 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}}"

答案2

做了一些研究,显然这是一个功能要求

它已得到实施这里

该功能有一个合并请求这里

据我所知,此功能仍在开发中,并且因不活跃而关闭,未合并到主要的 ansible 代码中。它可能会在某些时候重新开放并完成,但当前的 ansible 代码没有此功能。

答案3

我用了预计要执行的模块密码

- 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

相关内容