目录

前言:

什么是 Ansible Vault?

为什么需要 Ansible Vault?

Ansible Vault 的基本操作

1. 创建加密文件

2. 使用密码文件(推荐用于自动化)

3. 查看加密文件内容

4. 编辑加密文件

5. 加密现有文件

6. 解密文件

7. 更改加密密码

在 Playbook 中使用 Ansible Vault

提供 Vault 密码的方式

1. 交互式提示(用于手动执行)

2. 使用密码文件(用于自动化)

3. 使用环境变量

使用多个 Vault 密码

变量文件管理的最佳实践

推荐的目录结构

分离敏感和非敏感变量

Playbook 中的变量加密

使用 Vault ID 管理多个密码

加密时指定 Vault ID

运行 Playbook 时指定对应的 Vault ID

安全注意事项

总结


前言:

当我们使用 Ansible 管理服务器时,经常需要处理一些敏感信息,如密码、API 密钥、私钥等。如果这些信息以纯文本形式存储,会带来严重的安全风险。本文将详细介绍 Ansible Vault,这是一个保护敏感数据的强大工具,并涵盖其所有核心功能和最佳实践。


什么是 Ansible Vault?

Ansible Vault 是 Ansible 内置的加密工具,用于加密和解密任何 Ansible 使用的数据文件。它通过 AES256 对称加密算法(早期版本可能使用 128 位 AES)保护你的敏感数据,确保只有授权用户才能访问这些信息。

为什么需要 Ansible Vault?

  • 安全风险:敏感数据以纯文本形式存储在版本控制系统中,任何有访问权限的人都能看到

  • 合规要求:许多行业标准要求对敏感数据进行加密存储

  • 团队协作:在团队中安全地共享包含敏感信息的配置


Ansible Vault 的基本操作

1. 创建加密文件

要创建新的加密文件,使用 ansible-vault create 命令:

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

这个命令会:

  1. 提示输入新的 Vault 密码

  2. 使用默认编辑器(通常是 vi)打开文件

  3. 保存时会自动加密文件内容

如果你想使用其他编辑器,可以设置 EDITOR 环境变量:

export EDITOR=nano

2. 使用密码文件(推荐用于自动化)

为了避免交互式输入密码,可以使用密码文件:

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

密码文件应该包含一行字符串形式的密码,并设置严格的文件权限保护。

3. 查看加密文件内容

不需要编辑就能查看加密文件的内容:

ansible-vault view secret1.yml
Vault password: secret

4. 编辑加密文件

编辑现有加密文件使用 ansible-vault edit 命令:

ansible-vault edit secret1.yml
Vault password: redhat

这个命令会:

  1. 解密文件到临时文件

  2. 打开编辑器供你修改

  3. 保存后重新加密并删除临时文件

5. 加密现有文件

将已存在的纯文本文件转换为加密格式:

ansible-vault encrypt secret1.yml secret2.yml
New Vault password: redhat
Confirm New Vault password: redhat
Encryption successful

此命令可以同时加密多个文件。如果想将加密文件保存为新名称,使用 --output 选项:

ansible-vault encrypt file.yml --output=encrypted-file.yml

6. 解密文件

将加密文件永久解密为纯文本:

ansible-vault decrypt secret1.yml --output=secret-decrypted.yml
Vault password: redhat
Decryption successful

7. 更改加密密码

更改加密文件的密码:

ansible-vault rekey secret.yml
Vault password: redhat  # 原始密码
New Vault password: RedHat  # 新密码
Confirm New Vault password: RedHat
Rekey successful

使用密码文件时:

ansible-vault rekey --new-vault-password-file=NEW_VAULT_PASSWORD_FILE secret.yml

注:NEW_VAULT_PASSWORD_FILE就是一个纯文本文件,里面只有一行字符串——这个字符串就是 Vault 密码。


在 Playbook 中使用 Ansible Vault

运行需要访问加密文件的 playbook 时,必须提供 Vault 密码。

提供 Vault 密码的方式

1. 交互式提示(用于手动执行)
ansible-navigator run -m stdout --playbook-artifact-enable false site.yml --vault-id @prompt
Vault password (default): redhat

重要提示:必须禁用 playbook artifact 才能交互式输入密码。可以通过以下方式之一禁用:

  • 命令行:--playbook-artifact-enable false

  • 配置文件:在 ansible-navigator.yml 中设置 playbook-artifact: enable: false

2. 使用密码文件(用于自动化)
ansible-navigator run site.yml --vault-password-file=vault-pass.txt
3. 使用环境变量
export ANSIBLE_VAULT_PASSWORD_FILE=/path/to/vault-pass.txt
ansible-navigator run site.yml

注:执行第一行后,当前终端会话中的所有 Ansible 工具都会自动从这个文件读取 Vault 密码。

使用多个 Vault 密码

在复杂环境中,可能需要使用多个不同的 Vault 密码:

ansible-navigator run -m stdout --playbook-artifact-enable false site.yml --vault-id one@prompt --vault-id two@prompt
Vault password (one): 
Vault password (two): 

使用 --vault-id id@prompt 格式可以为不同的加密文件指定不同的密码。Ansible 会尝试匹配 ID 的密码,如果不匹配则尝试其他密码。

注:

1.在同一个playbook中使用多个加密文件时,需要提供每个文件标签对应的密码。文件在加密时被贴上了标签(如one、two),如果不指定标签,就是default。运行时提供标签和密码的对应关系,Ansible会自动用匹配的密码解密对应的文件。

2.如果两个加密文件标签相同但密码不同,Playbook会报错,因为运行时只能为同一个标签提供一个密码。如果标签不同,即使密码相同,Playbook也能正常运行。


变量文件管理的最佳实践

合理的变量文件结构可以大大简化 Ansible Vault 的管理。

推荐的目录结构

text

project/
├── playbook.yml
├── group_vars/
│   └── webservers/
│       └── vars          # webservers 组的非敏感变量
├── host_vars/
│   └── demo.example.com/
│       ├── vars          # 主机的非敏感变量
│       └── vault         # 主机的敏感变量(已加密)
└── roles/
    └── ...

分离敏感和非敏感变量

最佳做法是将敏感变量和非敏感变量保存在不同的文件中:

  1. 非敏感变量:保存在纯文本文件中(如 vars

  2. 敏感变量:保存在 Ansible Vault 加密的文件中(如 vault

Playbook 中的变量加密

Playbook 变量也可以通过 Ansible Vault 保护:

# playbook.yml
- hosts: all
  vars_files:
    - vars/common.yml        # 非加密文件
    - vars/secrets.yml       # 加密文件
  tasks:
    - name: 使用加密变量
      debug:
        msg: "API密钥是 {{ api_key }}"

加密 vars/secrets.yml 文件:

ansible-vault encrypt vars/secrets.yml

使用 Vault ID 管理多个密码

当使用多个 Vault 密码时,最佳实践是为每个加密文件分配一个 Vault ID:

加密时指定 Vault ID

ansible-vault encrypt --vault-id prod@prompt prod-secrets.yml
ansible-vault encrypt --vault-id dev@prompt dev-secrets.yml

运行 Playbook 时指定对应的 Vault ID

ansible-navigator run site.yml --vault-id prod@prompt --vault-id dev@prompt

这样做的好处是:

  1. Ansible 会首先尝试匹配 ID 的密码,提高解密速度

  2. 提高安全性,不同环境的密码可以不同

  3. 简化管理,明确知道哪个文件使用哪个密码

安全注意事项

  1. 密码文件保护:Vault 密码文件必须设置严格的权限(如 600),并考虑额外的安全措施

  2. 加密算法:Ansible Vault 使用 AES256 加密,但请注意它尚未经过正式的第三方安全审计

  3. 密码强度:使用强密码保护你的 Vault

  4. 备份:定期备份加密文件和密码,但确保备份位置的安全

  5. 团队协作:在团队中安全地共享 Vault 密码,考虑使用密码管理器


总结

Ansible Vault 是保护敏感数据的必备工具,它提供了完整的加密解决方案,从创建、编辑到解密都有相应的命令支持。通过合理组织变量文件结构,结合 Vault ID 功能,你可以在确保安全的同时,保持 Ansible 配置的可管理性和可维护性。

记住以下关键点:

  • 始终分离敏感和非敏感变量

  • 为自动化环境使用密码文件而非交互式输入

  • 考虑使用多个 Vault ID 管理不同环境或用途的加密文件

  • 定期轮换(rekey)你的 Vault 密码以提高安全性

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐