RHCE8.0讲义:管理机密

来自CloudWiki
跳转至: 导航搜索

介绍 ANSIBLE VAULT

Ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机。通常,此信息可能以纯文 本形式存储在清单变量或其他Ansible文件中。但若如此,任何有权访问Ansible文件的用户或存储 这些Ansible文件的版本控制系统都能够访问此敏感数据。这显然存在安全风险。

使用Ansible随附的Ansible Vault可以加密和解密任何由Ansible使用的结构化数据文件。若要 使用Ansible Vault,可通过一个名为ansible-vault的命令行工具创建、编辑、加密、解密 和查看文件。Ansible Vault可以加密任何由Ansible使用的结构化数据文件。这可能包括清单变 量、playbook中含有的变量文件、在执行playbook时作为参数传递的变量文件,或者Ansible角色 中定义的变量。

重要:

Ansible Vault并不实施自有的加密函数,而是使用外部Python工具集。文件通过利 用AES256的对称加密(将密码用作机密密钥)加以保护。请注意,这种方式尚未得 到第三方正式审核。

创建加密的文件

要创建新的加密文件,可使用ansible-vault create filename命令。该命令将提示输 入新的vault密码,然后利用默认编辑器vi打幵文件。您可以设置和导出EDITOR环境变量, 通过设置和导出指定其他默认编辑器。例如,若要将默认编辑器设为nano,可设置为export EDIT0R=nano

[student@demo ~]$ ansible-vault create secret.yml
New Vault password: redhat
Confirm New Vault password: redhat

您可以使用vault密码文件来存储vault密码,而不是通过标准输入途径输入vault密码。您需要使 用文件权限和其他方式来严密保护该文件。

[student@demo ~]$ ansible-vault create --vault-password-file=vault-pass secret.yml

在最近版本的Ansible中,用于保护文件的密文是AES256,但利用较旧版本加密的文件可能依然使 用 128 位 AES

查看加密的文件

您可以使用ansible-vault view filename命令查看AnsibleVault加密的文件,而不必打开 它进行编辑。

[student@demo ~]$ ansible-vault view secret.yml

Vault password: secret
less 458 (POSIX regular expressions)
Copyright (C) 1984-2012 Mark Nudelman
less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution, see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less my_secret: "yJJvPqhsiusmmPPZdnj ndkdnYNDjdj782meUZcwH

编辑现有的加密文件

要编辑现有的加密文件,AnsibleVault提供了 ansible-vault edit filename命令。此命令将 文件解密为一个临时文件,并允许您编辑该文件。保存时,它将复制其内容并删除临时文件。

[student@demo ~]$ ansible-vault edit secret.yml

Vault password: redhat

注意:H edit子命令始终重写文件,因此只应在进行更改时使用它。这在文件保管在版本控 制下时有影响。要查看文件的内容而不进行更改,始终应使用view子命令。

加密现有的文件

要加密已存在的文件,请使用ansible-vault encrypt filename命令。此命令可取多个欲加 密文件的名称作为参数。

[student@demo ~]$ ansible-vault encrypt secretl.yml

New Vault password: redhat
Confirm New Vault password: redhat
Encryption successful

使用--output=0UTPUT_FILE选项,可将加密文件保存为新的名称。您只能通过--output选 项使用一个输入文件。

解密现有的文件

现有的加密文件可以通过ansible-vault decrypt filename命令永久解密。在解密单个文件 时,可使用--output选项以其他名称保存解密的文件。

[student@demo ~]$ ansible-vault decrypt secretl.yml --output=secretl-decrypted.yml

Vault password: redhat
Decryption successful

更改加密文件的密码

可使用ansible-vault rekey filename命令更改加密文件的密码。此命令可一次性更新多个 数据文件的密钥。它将提示提供原始密码和新密码。

[student@demo ~]$ ansible-vault rekey secret.yml
Vault password: redhat
New Vault password: RedHat
Confirm New Vault password: RedHat
Rekey successful

在使用vault密码文件时'请使用--new-vault-password-file选项:

[student@demo -]$ ansible-vault rekey \
> --new-vault-password-file=NEW_VAULT_PASSWORD_FILE secret.yml

运行ANSIBLE VAULT加密脚本

要运行可访问通过Ansible Vault加密的文件的playbook,需要向ansible-playbook命令提供加 密密码。如果不提供密码,playbook将返回错误:

[student@demo ~]$ ansible-playbook site.yml
ERROR: A vault password must be specified to decrypt vars/api_key.yml

要为playbook提供vault密码,可使用- -vault-id选项。例如,要以交互方式提供vault密码, 请使用下例中所示的 --vault-id @prompt:

[student@demo ~]$ ansible-playbook --vault-id @prompt site.yml
Vault password (default): redhat

重要

如果您使用的是版本2.4之前的Ansible版本,则需要使用- -ask-vault-pass选 项以交互方式提供vault密码。如果playbook使用的所有vault加密文件都使用同一 密码加密,则仍可使用该选项。

[student@demo ~]$ ansible-playbook --ask-vault-pass site.yml
Vault password: redhat

此外,也可使用-- vault - password -file选项指定以纯文本存储加密密码的文件。密码应当在 该文件中存储为一行字符串。由于该文件包含敏感的纯文本密码,因此务必要通过文件权限和其他 安全措施对其加以保护。

[student@demo ~]$ ansible-playbook --vault-password-file=vault-pw-file site.yml

您也可以使用ANSIBLE_VAULT_PASSWORD_FILE环境变量,指定密码文件的默认位置。

重要

从Ansible2.4幵始,您可以通过ansible-playbook使用多个AnsibleVault密码。要使用多个密码'请将多个--vault-id或--vault-password-file选项 传递给 ansible - playbook 命令。

[student@demo ~]$ ansible-playbook \
> --vault-id one@prompt --vault-id two@prompt site.yml
Vault password (one):
Vault password (two):
... output omitted

@prompt前面的vault ID one和two可以是任何字符,甚至可以完全省略它们。不 过,如果在使用ansible-vault命令加密文件时使用--vault-id id选项,则在运行ansible-playbook时,将最先尝试匹配ID的密码。如果不匹配,接下来 将尝试您提供的其他密码。没有ID的vault ID ©prompt实际上是default@prompt 的简写,这意味着提示输入vault ID default的密码。

变量文件管理的推荐做法

若要简化管理,务必要设置您的Ansible项目,使敏感变量和所有其他变量保存在相互独立的文件 中。然后,包含敏感变量的文件可通过ansible-vault命令进行保护。

请记住,管理组变量和主机变量的首选方式是在playbook级别上创建目录。group_vars目录通 常包含名称与它们所应用的主机组匹配的变量文件。host.vars目录通常包含名称弓它们所应用 的受管主机名称匹配的变量文件。

不过,除了使用group_vars或host_vars中的文件外,您也可对每一主机组或受 管主机使用目录。这些目录而后可包含多个变量文件,它们都由该主机组或受管主机使 用。例如,在playbook.yml的以下项目目录中'webservers主机组的成员将使用 group_vars/webservers/vars 文件中白勺变量' 而 demo. example. com "寻使用 host_vars/ demo. example. com/vars 和 host_vars/demo. example. com/vault 中的变量:

.
I—— ansible.cfg
I——group_vars
1—— webservers
1——vars
I——host_vars
1—— demo.example.com
I——vars
1——vault
I——inventory
1—— playbook.yml

在这种情景中,其好处在于用于demo.example.com的大部分变量可以放在vars文件中,敏感 变量则可单独放在vault文件中保密。然后,管理员可以使用ansible-vault加密vault文 件,而将vars文件保留为纯文本。

在本例中,host_vars/demo.example.com目录内使用的文件名没有什么特别之处。该目录可 以包含更多文件,一些由AnsibleVault加密,另一些则不加密。

Playbook变量(与清单变量相对)也可通过Ansible Vault保护。敏感的playbook变量可以放在单 独的文件中,此文件通过AnsibleVault加密,并通过vars_files指令包含在该playbook中。这 很有用处,因为playbook变量的优先级高于清单变量。

如果您在playbook中使用多个vault密码,请确保为每个加密文件分配一个vault ID,并在运行 playbook时输入具有该vault ID的匹配密码。这可确保在解密vault加密文件时先选择正确的密 码,这比强制Ansible尝试您提供的所有vault密码直至找到正确的密码要快。

参考文献

ansible-playbook(l)和 ansible-vault(l)帮助手册

Vault — Ansible 文档

https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html

变量和 Vault — Ansible 文档 https://docs.ansible.com/ansible/latest/user_guide/ playbooks_best_practices.html#best-practices-for-variables-and-vaults