怎样使用 Ansible Vault 保护敏感 Playbook 数据

在这篇文章中,我们将学习 什么是 Ansible Vault 以及怎样 使用 Ansible Vault 保护敏感的剧本数据 通过在 Linux 中加密数据。

什么是 Ansible Vault?

Ansible 保险库 是 ansible 的一个功能,它允许你 将密码或密钥等敏感数据保存在加密文件中,而不是让数据在剧本或角色中以明文形式显示。

身份验证和授权是控制软件应用程序访问部分的两个重要层。 当您在协作环境中工作时,并非所有数据都对您可见。

同样,当您使用 Ansible,您可能希望保护一些敏感信息,例如 api 密钥、数据库密码和访问令牌的安全。

让所有人都能看到这些信息不利于安全,尤其是当您将其存储在公共存储库中时。

在接下来的部分中 Ansible 保险库教程,我们将学习怎样使用 ansible vault 加密文件或字符串,以便 保护您的秘密 安全以及怎样 在剧本中使用 Ansible Vault 来保护敏感数据 和 example 命令。

使用 Ansible Vault 命令

默认情况下 ansible-vault 带有 ansible 安装。 启动您的终端并运行以下命令,该命令将为您提供可与 ansible vault 命令一起使用的选项列表。

$ ansible-vault --help
Ansible 帮助部分

使用 Ansible Vault 加密文件

如果要创建一个新文件,向其中写入一些数据并对其进行加密,然后运行以下命令。 这里 secretkey 是文件名。

$ ansible-vault create secretkey

让我们了解运行此命令时会发生什么。

  • 由于此文件不可用,因此将创建并打开一个文件以进行写入。
  • 系统将提示您提供此文件的密码,该密码应妥善保管。 请记住没有密码,您将无法解密文件 再次。
使用 Ansible Vault 加密新文件

文件关闭后,内容将被加密。 如果您尝试打开使用文本编辑器/查看器应用程序加密的文件,您将看到一些随机数据,如下图所示。

查看加密文件查看加密文件

在第一行,有一些元数据 ansible 将在内部用于加密和解密。 正如你从第一行看到的, AES256 算法 用于加密文件。

您还可以加密现有文件。

要加密现有文件,请运行以下命令。 系统将再次提示您提供稍后用于解密文件的保管库密码。

$ echo "api_key: 'XUITZ89776XX'" > secretkey2 # Writing random data to file
$ ansible-vault encrypt secretkey2
加密现有文件加密现有文件

怎样更改 Ansible Vault 密码

您可以通过运行以下命令为任何现有的加密文件设置新的保管库密码。 在这里,您应该记住您的旧密码,它将首先提示您,然后是新的保管库密码。

$ ansible-vault rekey secretkey2
更改 Ansible Vault 密码更改 Ansible Vault 密码

怎样解密加密文件

如果要查看文件的原始内容,有几种方法可以做到。 第一种方法是运行 decrypt 命令将文件置于未加密的形式。

$ ansible-vault decrypt secretkey2
解密加密文件解密加密文件

您还可以通过运行以下命令来查看加密文件的内容而无需解密 view 代替 ”decrypt”。

$ ansible-vault view secretkey2
在不解密的情况下查看加密文件的内容在不解密的情况下查看加密文件的内容

和…之间的不同 decryptview 是前者将删除加密以查看原始内容,但后者只会解密和打印内容,同时保持原始文件加密。

修改加密文件中的内容

假设您要编辑加密文件的内容。 在这种情况下,您可以解密文件编辑内容,或再次加密文件。 或者,您可以使用 edit 命令来编辑内容。

$ ansible-vault edit secretkey2
修改加密文件中的内容修改加密文件中的内容

与“edit“命令是你不需要解密文件并再次加密它。它将打开文件进行编辑,一旦你 close 该文件将被自动加密。

使用 Ansible Playbook 加密内容

到目前为止,我们已经了解了怎样在文件级别加密和解密数据。 您还可以加密字符串。 让我们来一个 example.

我有一些用于远程连接的变量,它还包含一个连接密码。 要加密密码,请运行以下命令。 在这里,我使用密码作为 “密码”.

记住解密字符串所需的保管库密码。

$ ansible-vault encrypt_string "password"

在下面的剧本中,我创建了一些模拟连接细节的变量和 connect_pwd 将存储加密数据。 我正在打印“connection_pwd” 使用任务中的调试模块的变量。

- name: "Test playbook for ansible vault"
  gather_facts: False
  hosts: local

  vars:
    remote_user: produser
    default_role: prodrole
    connect_pwd: << COPY PASTE THE ENCRYPTED PASSWORD HERE >>

  tasks:

    - name: print the password
      debug:
        msg: "{{ connect_pwd }}"
在剧本中使用 Ansible Vault在剧本中使用 Ansible Vault

运行剧本时,您应该使用 --ask-vault-password 或者 --ask-vault-pass 标志将提示您输入保险库密码以解密字符串。

$ ansible-playbook playbook.yml --ask-vault-pass
使用 Ansible Vault 运行剧本使用 Ansible Vault 运行剧本

如果您尝试在没有 --ask-vault-password 或者 --ask-vault-pass 标志,任务将失败并出现以下错误。

fatal: [master.anslab.com]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}

您还可以将保管库密码存储在文件中并将其作为参数传递给 --vault-password-file 或者 --vault-pass-file 争论。

将保管库密码存储在文件中时, 确保设置了适当的权限 这样只有文件所有者才能读取文件的内容。

$ echo "password" > .secretkey
$ chmod 600 .secretkey

我创建了一个名为 .secretkey 并将权限设置为 600. 现在,这个文件可以用来解密我剧本中的字符串。

$ ansible-playbook --vault-password-file .secretkey playbook.yml

将 Vault 密码存储在 Ansible 配置文件中

您还可以将保管库密码存储在 ansible.cfg 文件。 在这种情况下,您可以运行 playbook 命令而无需任何额外的保管库标志。

vault_password_file = .secretkey

您还可以设置以下将用于所有解密的环境变量。

export ANSIBLE_VAULT_PASSWORD_FILE="./.secretkey"

结论

到这个时候,您应该对怎样使用 Ansible 保险库保护您的机密有一个大致的了解。 使用 Ansible Vault 加密内容非常简单,不需要任何外部工具。

练习文章中给出的所有示例,这将帮助您更多地了解 Ansible 保险库怎样帮助保护敏感的 Playbook 数据。

资源:

特色图片由 贾格里特·帕拉朱利关注.