2

使用ansible保护你的秘密

秘密就是保持秘密(Secrets are meant to stay secret.)。无论是云服务的凭证或数据资源的密码,它们都有有原因的秘密。如果落入坏人之手,它们可能被用来发现商业机密和私人客户数据,为邪恶的、或者更糟糕的目的创造基础条件。所有这些都会让你和你的组织花费大量的时间和金钱,让你头疼! 本章,我们会阐述如何安全保护这些秘密。

• 加密静态数据。
• 操作过程中的秘密保护。

加密静态数据

作为一种配置系统或编排引擎,ansible具有很强的能力。为了掌握这强大的能力,有必要将隐私数据委托(entrust)给ansible。随时提醒操作员输入密码的自动化系统不是非常有效。为了展示ansible最大化的能力,私密数据被写入一个ansible可以读取和使用其中数据的文件里边。

但是这会带来风险!你的隐私在你的文件系统中是以纯文本的形式存在的。存在物理上和数字上的风险。 从物理上来讲,计算器可以从你身上拿走,然后偷偷的寻找私密数据。而从数字上来说,任何可能破坏设置在它上面的边界集合的恶意软件可以读取你用户账户可以访问的任意数据。如果你利用一个源控制系统,保存仓库的基础设施同样处于风险之中。

值得庆幸的是,ansible提供了一个保护你隐私的设施。那个设施就是Vault,它允许加密文本文件,它允许以加密格式加密静态存储的文本文件。没有key或者大量的计算能力,数据是不可解读的。

处理加密静态存储数据的关键课程包含:

  • 有效的加密目标。
  • 创建新的加密文件。
  • 加密现有的未加密的文件。
  • 编辑加密文件。
  • 修改文件上的加密密码。
  • 解密加密文件。
  • 运行ansible-playbook命令来引用加密文件。

Vault可以加密的东西

Vault可以加密ansible使用的任意结构的数据文件。基本上是ansible操作过程中使用的任意的yaml(或JSON)文件。可以包含如下:

  • group_vars/ 文件。
  • host_vars/ 文件。
  • include_vars目标。
  • vars_files目标。
  • --extra-vars目标。
  • 角色变量。
  • 角色默认值。
  • 任务文件。
  • 处理器文件。

如果文件可以以yaml格式表达,并且可以被ansible读取,这些文件就可以使用Vault来加密。因为整个文件静态时都是不可读的,所以在选择那些文件需要加密时,应该注意不要过于狂热。任何带有源代码控制操作的文件都用加密内容来完成,这样就会让同行审阅变得非常困难。最佳实践,最小数量的可能数据应该加密;这甚至意味着需要将一些变量移到它们自己的文件中。

创建新的加密文件

ansible提供了一个新的程序ansible-vault用来创建新的加密文件。这个程序用于创建Vault加密文件,以及和它的交互。创建加密文件的子程序是create。

ansible-vault create --help
Usage: ansible-vault create [options] file_name

ansible数据文件的加解密工具

Options:
  --ask-vault-pass      询问vault秘密
  --encrypt-vault-id=ENCRYPT_VAULT_ID
                        用于加密的vault id(required if more than
                        vault-id is provided)
  -h, --help            show this help message and exit
  --new-vault-id=NEW_VAULT_ID
                        the new vault identity to use for rekey
  --new-vault-password-file=NEW_VAULT_PASSWORD_FILE
                        new vault password file for rekey
  --vault-id=VAULT_IDS  the vault identity to use
  --vault-password-file=VAULT_PASSWORD_FILES
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)
  --version             show program's version number and exit

 See 'ansible-vault <command> --help' for more information on a specific

要创建新文件,你需要提前了解两个事情:

  • Vault用于加密文件的密码。
  • 要加密的文件名。
vim password.sh

#!/usr/bin/bash
echo "password more more"

chmod +x password.sh

ansible-vault创建新加密文件

ansible-vault create --vault-password-file password.sh new_secret.yaml

ansible-vault加密原有文件

ansible-vault encrypt --vault-password-file password.sh new_secret.yaml

ansible-vault编辑加密文件

ansible-vault edit a_encrypt_file.yaml

ansible-vault加密文件密码修改

ansible-vault rekey --vault-password-file password.sh new_secret.yaml

ansible-vault解密加密文件

ansible-vault decrypt --vault-password-file password.sh new_secret.yaml

操作中的隐私保护

添加no_log。

---
   - name: show me an encrypted var
     hosts: localhost
     gather_facts: false
     vars_files:
       - a_vars_file.yaml
     tasks:
       - name: print the variable
         debug:
           var: something
no_log: true

总结

Ansible can deal with sensitive data. It is important to understand how this data is stored at rest and how this data is treated when utilized. With a little care and attention, Ansible can keep your secrets secret. Encrypting secrets with ansible- vault can protect them while dormant on your filesystem or in a shared source control repository. Preventing Ansible from logging task data can protect against leaking data to remote log files or on-screen displays.
In the next chapter, we will explore the powers of the Jinja2 templating engine used by Ansible.

目录


老将廉颇
878 声望297 粉丝