使用 Ansible Vault 保护你的敏感数据:完整指南
AnsibleVault是Ansible内置的加密工具,用于保护敏感数据如密码和API密钥。它通过AES256算法加密文件,支持创建、编辑、查看和加解密操作。最佳实践包括:分离敏感与非敏感变量、使用密码文件代替交互输入、设置严格的文件权限。Vault支持多密码管理,可通过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
这个命令会:
-
提示输入新的 Vault 密码
-
使用默认编辑器(通常是 vi)打开文件
-
保存时会自动加密文件内容
如果你想使用其他编辑器,可以设置 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
这个命令会:
-
解密文件到临时文件
-
打开编辑器供你修改
-
保存后重新加密并删除临时文件
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/
└── ...
分离敏感和非敏感变量
最佳做法是将敏感变量和非敏感变量保存在不同的文件中:
-
非敏感变量:保存在纯文本文件中(如
vars) -
敏感变量:保存在 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
这样做的好处是:
-
Ansible 会首先尝试匹配 ID 的密码,提高解密速度
-
提高安全性,不同环境的密码可以不同
-
简化管理,明确知道哪个文件使用哪个密码
安全注意事项
-
密码文件保护:Vault 密码文件必须设置严格的权限(如 600),并考虑额外的安全措施
-
加密算法:Ansible Vault 使用 AES256 加密,但请注意它尚未经过正式的第三方安全审计
-
密码强度:使用强密码保护你的 Vault
-
备份:定期备份加密文件和密码,但确保备份位置的安全
-
团队协作:在团队中安全地共享 Vault 密码,考虑使用密码管理器
总结
Ansible Vault 是保护敏感数据的必备工具,它提供了完整的加密解决方案,从创建、编辑到解密都有相应的命令支持。通过合理组织变量文件结构,结合 Vault ID 功能,你可以在确保安全的同时,保持 Ansible 配置的可管理性和可维护性。
记住以下关键点:
-
始终分离敏感和非敏感变量
-
为自动化环境使用密码文件而非交互式输入
-
考虑使用多个 Vault ID 管理不同环境或用途的加密文件
-
定期轮换(rekey)你的 Vault 密码以提高安全性
更多推荐
所有评论(0)