使用Ansible Vault保护您的秘密

保护您的秘密不落入错误的手中是首要任务。但确切地说,您是如何确保您的秘密安全的呢?将其保存在本地文本文件中吗?没有加密,这个选择太冒险了。为什么不使用Ansible Vault来加密您的变量和文件呢?

在本教程中,您将学习如何使用Ansible Vault保护敏感内容,如密码或密钥。

继续阅读,让窥探的眼睛远离您的秘密!

先决条件

本教程将进行实际演示。如果您想跟着操作,请确保您具备以下条件。

  • A Linux machine – This tutorial uses Ubuntu 20.04, but any Linux distribution will work.
  • 在您的计算机上安装了Ansible。

配置默认的Ansible Vault编辑器

作为系统管理员,您可能会处理包含不同服务器用户名和密码的各种Ansible Playbooks。您不能以纯文本格式将这些文件提交到版本控制系统,因为这是不安全的。因此,Ansible Vault就派上用场了。

Ansible Vault旨在集成到您现有的工作流程中,将数据存储在加密文件中。但在创建第一个Ansible Vault之前,您需要设置默认的Ansible Vault编辑器。

1. 打开终端并SSH到您的计算机。

2. 接下来,使用文本编辑器打开~/.bashrc文件。 ~/.bashrc文件是一个shell脚本,每次启动新的终端会话时都会运行。这个shell脚本初始化一个交互式shell会话并定义环境变量。

3. 在~/.bashrc文件的末尾添加以下行,保存更改并退出编辑器。

此行设置了当前登录用户的EDITOR变量。 EDITOR变量确保每次打开新终端会话时都使用您喜欢的文本编辑器。

您可以设置任何其他您喜欢的文本编辑器,但本教程使用nano文本编辑器。

export EDITOR=nano
Setting the Default Text Editor

4. 最后,运行以下命令以应用更改(source),而无需注销并重新登录,并打印(echo)您系统当前默认的文本编辑器。

# 将环境变量加载到当前shell会话中。
source ~/.bashrc
# 打印您系统当前默认的文本编辑器。
echo $EDITOR

确保编辑器变量设置为您喜欢的编辑器,如下所示。

Applying and Verifying Changes

创建和加密您的第一个Ansible Vault

你已经设置了默认的保险库编辑器,现在是时候创建你的第一个保险库了。你将创建并加密一个包含敏感信息的文件,比如用户名、密码、秘密访问密钥等。

你将运行ansible-vault命令,这是与Ansible Vaults进行交互的主要界面。

1. 运行以下命令来创建 secret.yml 文件。Ansible使用YAML,这是一种与JSON等其他数据格式相比更易读的格式。

ansible-vault create secret.yml

系统会提示你输入并确认文件的密码。以后你将使用这个密码来加密和解密secret.yml文件,所以请确保选择一个你能记住的强密码。

Creating the secret.yml File with a Password

2. 设置了保险库密码后,你的默认文本编辑器将打开一个空文件。输入你想存储在文件中的敏感信息,保存并关闭编辑器。

本教程将aws_access_key和aws_secret_key变量存储在secret.yml 文件中。此时,Ansible加密了 secret.yml文件,除非知道保险库密码,否则其他人无法阅读保险库的内容。

Providing Sensitive Information (secrets)

3. 运行cat命令尝试在没有密码的情况下查看 secret.yml 文件的内容。

cat secret.yml

你可以通过看到随机数字来验证文件内容已加密,如下所示。文件顶部的$ANSIBLE_VAULT;1.1;AES256标头表示该文件使用Ansible Vault使用AES256密码加密。

高级加密标准(AES)是一种对称密钥算法,它使用相同的密钥来加密和解密数据。

Viewing the secret.yml file Without the Vault’s Password

加密现有文件

你已经从头开始创建了一个自动加密的文件。但是如何加密现有文件呢?Ansible也提供了encrypt子命令来加密指定的文件。要查看如何加密现有文件,您将加密一个包含Ansible变量的特定文件。

运行以下命令以加密一个文件(vars.yml)。

ansible-vault encrypt vars.yml

就像您第一次创建secret.yml文件时一样,此时将提示您为vars.yml文件提供密码。

默认编辑器这次不会打开,因为vars.yml文件已经存在。相反,您将收到加密成功的消息,表示Ansible已加密该文件,如下所示。

Encrypting an Existing File (vars.yml)

现在,运行下面的cat命令来验证Ansible已加密vars.yml文件。

cat vars.yml
Verifying Encrypted Existing File

从Ansible Vault解密数据

你已经看到如何加密文件,使其更安全。但是当你需要查看文件内容时,如何解密文件呢?解密文件在你想编辑一个加密文件或在不每次提供密码的情况下阅读其内容时非常有用。Ansible的decrypt子命令会派上用场。

1. 运行以下命令以解密secret.yml文件。

解密子命令以加密文件路径作为其唯一参数。

ansible-vault decrypt secret.yml

提供文件的密码,文件内容将被解密并以纯文本形式写入磁盘。

Decrypting File Data

2. 接下来,运行cat命令查看secret.yml文件的解密内容。

cat secret.yml

您可以在终端中看到secret.yml 文件的内容,没有任何加密。此时,您可以随心所欲地添加、编辑或删除文件中的任何行。

file to your heart’s content

3. 最后,运行以下命令加密 secret.yml 文件并提供密码以保护文件内容。

ansible-vault encrypt secret.yml
Encrypting a Decrypted File (secret.yml)

更新Ansible Vault的密码

你已经看到每次加密和解密文件时都需要输入密码。但也许,你只想更新文件的密码而不解密文件。如果是这样,你需要使用rekey子命令。这个子命令允许你随意更改文件的密码。

运行以下命令来更新secret.yml文件的密码。

rekey子命令将一个加密文件的路径作为其唯一参数。

ansible-vault rekey secret.yml

提供文件的当前密码,然后是新密码,如下所示。

此时,旧密码将无法解密文件。

Updating Ansible Vault’s Password

现在,运行下面的命令来尝试解密secret.yml

ansible-vault decrypt secret.yml

在提示时提供旧密码,您将看到一个错误消息,说明解密失败,如下所示。此输出确认文件的密码已成功更新。

Verifying New Password is in Effect

在Playbooks和模块中使用安全数据

您已经看到了运行命令来加密和解密文件的工作原理。但是,如果您计划安全地自动化应用程序的过程,您将需要使用Playbooks和模块。

1. 在编辑器中打开Ansible配置文件(~/.ansible.cfg),其中包含Ansible的设置。

复制并粘贴以下代码到~/.ansible.cfg文件的末尾,保存更改并关闭编辑器。此代码告诉Ansible查找清单文件(~/.ansible-hosts)。

[defaults]
hostfile = ~/.ansible-hosts

2. 接下来,打开~/.ansible-hosts文件,其中包含您的Ansible管理节点可以管理的主机清单。

使用以下代码填充~/.ansible-hosts文件,保存更改并关闭文件。此代码告诉Ansible它可以通过本地连接类型管理本地主机。

localhost ansible_connection=local

3. 运行下面的命令创建一个新的加密文件。您可以给文件起任何名字,但在本教程中文件被命名为helloworld.yml。

ansible-vault create helloworld.yml
Creating Ansible Playbook (helloworld.yml)

将下面的代码填充到helloworld.yml文件中,保存更改并关闭编辑器。

这段代码是一个基本的Ansible playbook,在您的清单中的所有主机上打印“hello world”消息。代码块顶部的—符号表示YAML文档的开始。

---

- hosts: all # 设置在清单中的所有主机上执行任务 
  tasks: # 设置要执行的任务
    - shell: echo 'hello world' # 打印'hello world'消息

4. 最后,运行下面的ansible-playbook命令,后面跟着–ask-vault-pass选项,在您的清单中的所有主机上执行helloworld.yml playbook。

ansible-playbook --ask-vault-pass helloworld.yml

在提示时提供helloworld.yml文件的密码。正如下面所示,您的playbook运行已经成功。

  • ok=2 – 表示您的两个任务都已成功运行。
  • changed=1 – 表示您的任务已更改系统状态一次。在这种情况下,它向shell写入了一条hello world消息。
  • unreachable和failed都是0 – 表示在运行过程中没有主机不可访问或失败。
Running your playbook

使用带密码文件的Ansible Vault

尽管在运行一次性任务时手动输入密码是可行的,但在实际使用中并不实际。

A better way to provide the password for encrypting and decrypting files is to use a password file. This way, you can store the password in a secure location, and Ansible will read the password from the file needed.

1. 运行以下命令将 Ansible Vault 密码存储在名为 .vault_pass的文件中。将 my_vault_password 替换为您的实际 Vault 密码。

echo 'my_vault_password' > .vault_pass

2. 接下来,运行每个以下命令以更改文件的所有权 (chown) 为 root 并更改 .vault_pass 文件的权限。这些命令确保只有您(root 用户)能够读取和写入该文件。

# 将文件所有权更改为 root 用户
chown root:root .vault_pass
# 将文件权限更改为仅限 root(读取和写入权限)
chmod 700 .vault_pass

3. 最后,运行下面的 ansible-playbook 命令,然后加上 –vault-password-file 选项以使用密码文件(.vault_pass)执行 playbook(helloworld.yml)。

ansible-playbook --vault-password-file=.vault_pass helloworld.yml

请注意下面 Ansible 执行 playbook 时无需询问加密文件的密码。

Running Playbook using a Password File

结论

在本教程中,您已经学会了如何使用 Ansible Vault 对 Ansible playbook 和任务中的敏感数据进行加密和解密。您已使用密码文件将 Ansible Vault 密码存储在安全位置。在执行 playbook 时,这种行为对减少用户干预非常有用。

使用这些新发现的知识,您现在可以自信地加密敏感数据,并与他人分享您的操作手册,而不必担心数据安全。

如果您使用LastPass进行密码管理,为什么不将您的Ansible Vault密码存储在LastPass中,并在需要时让Ansible自动检索它呢?

Source:
https://adamtheautomator.com/ansible-vault/