【问题标题】:Ansible Vault not reading defined variablesAnsible Vault 未读取已定义的变量
【发布时间】:2018-04-23 02:01:58
【问题描述】:

我正在为 Cumulus-Linux(白盒)网络开发 Ansible 自动化。我正在使用 Ansible Vault 加密我想要在新 Cumulus 交换机上构建的本地帐户的密码。但是,当我运行剧本时,似乎 ansible 能够从我的保险库加密文件中读取用户名变量,但不能读取我定义的密码变量。无法检查 Ansible 将这些密码设置为什么;当然,即使在 -vvvv Ansible 输出中,密码也是加密的。

根据我看到的每个 Ansible Vault 示例,我的变量都是这样定义的(未加密变量引用加密变量):

  • “user”的值来自“vault_user”,它位于我的 Vault 加密变量文件中。
  • “password”的值来自“vault_password”,它也位于我的保险库加密文件中。

我目前的剧本结构:

root
--> ansible.cfg
--> hosts
--> main.yml (main playbook)
--> group_vars
    --> all
        --> main.yml (where unencrypted "user" and "password" declared)
        --> vault.yml (encrypted, has values for "vault_user" and "vault_password")

我的剧本中创建/修改帐户的实际部分:

  - name: create_admin_account
    user:
      name={{ user }}
      shell=/bin/bash
      password={{ password }}
      groups=sudo
      append=yes

/group_vars/all/main.yml 中的变量定义

user: "{{ vault_user }}"
password: "{{ vault_password }}"

然后,在保管库加密的文件中,/group_vars/all/vault.yml(不共享实际帐户信息):

vault_user: 'xxxx'
vault_password: 'yyyy'

加密密码存储在一个单独的文件中,我通过 jenkins 自动化/Github 将 Ansible 指向该文件(而不是在 ansible.cfg 中定义保险库密码文件)。

问题:

当我运行这个剧本时,它成功完成,它实际上读取了我的保管库文件并创建了“xxxx”用户帐户。但是,它似乎没有将帐户密码设置为我定义的值,因为之后我无法使用这些凭据登录。我验证了该帐户已正确创建并随后出现在 sudoers 组中。

如果 ansible 可以读取存储的“用户”变量,为什么它不能读取相同的“密码”变量?

我什至尝试使用未加密的纯文本文件运行它——ansible 仍然无法正确读取我的“密码”变量。

有没有人知道一种破解方法或方法来查看 Ansible 在运行时将什么纯文本值插入到该变量中(可能是一个愚蠢的问题,因为这将是一个巨大的安全风险!)?

【问题讨论】:

    标签: linux ansible ansible-vault


    【解决方案1】:

    除非您在 macOS 上执行,否则您应该为 user 节点的 password 参数提供密码哈希,不是纯文本密码。

    Reference:

    password

    (可选)将用户密码设置为此加密值。请参阅 github 示例目录中的用户示例,了解它在剧本中的样子。有关生成这些密码值的各种方法的详细信息,请参阅http://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module。注意达尔文系统,这个值必须是明文。小心安全问题。

    也就是说,将密码哈希存储在 Ansible Vault 加密文件中并没有额外的安全价值。它与可以从目标系统上的/etc/passwd 文件中读取的值相同(默认情况下每个人都可以读取)。


    有没有人知道一种破解方法或方法来查看 Ansible 在运行时将什么纯文本值插入到该变量中(可能是一个愚蠢的问题,因为这将是一个巨大的安全风险!)?

    - debug:
        var: password
    

    严格来说,在某些情况下debug 模块在屏幕上的输出不是原始值(主要是如果变量包含转义字符,如引号)。那么检查值的唯一选择是使用copy 模块并将变量提供给content 参数。

    【讨论】:

    • 谢谢,技术人员。让我试试调试选项——我可以看到放入变量的内容,我大概可以弄清楚到底出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2022-11-28
    相关资源
    最近更新 更多