使用 Ansible Vault 加密内容
在您制定了管理和存储 Vault 密码的策略后,就可以开始加密内容。可以使用 Ansible Vault 加密两种类型的内容:变量和文件。加密的内容始终包含 !vault
标记,该标记告诉 Ansible 和 YAML 内容需要解密,以及一个 |
字符,它允许使用多行字符串。使用 --vault-id
创建的加密内容还包含 Vault ID 标签。有关加密过程以及使用 Ansible Vault 加密的內容格式的更多详细信息,请参阅 使用 Ansible Vault 加密的文件格式。下表显示了加密变量和加密文件之间的主要区别
加密变量 |
加密文件 |
|
---|---|---|
加密了多少内容? |
纯文本文件中的变量 |
整个文件 |
何时解密? |
按需,仅在需要时解密 |
加载或引用时始终解密 [1] |
可以加密什么? |
仅加密变量 |
任何结构化数据文件 |
使用 Ansible Vault 加密单个变量
可以使用 ansible-vault encrypt_string 命令加密 YAML 文件中的单个值。有关将加密的变量安全地显示的一种方法,请参阅 使加密的变量安全地显示。
加密变量的优点和缺点
使用变量级加密,文件仍然很容易阅读。您可以混合使用纯文本变量和加密变量,甚至可以在剧本或角色中内联。但是,密码轮换不像文件级加密那样简单。您无法 重新加密 加密的变量。此外,变量级加密仅适用于变量。如果您要加密任务或其他内容,则必须加密整个文件。
创建加密变量
ansible-vault encrypt_string 命令将您键入(或复制或生成)的任何字符串加密并格式化为可以包含在剧本、角色或变量文件中的格式。要创建一个基本的加密变量,请将三个选项传递给 ansible-vault encrypt_string 命令
Vault 密码的来源(提示、文件或脚本,带或不带 Vault ID)
要加密的字符串
字符串名称(变量的名称)
模式如下所示
ansible-vault encrypt_string <password_source> '<string_to_encrypt>' --name '<string_name_of_variable>'
例如,要使用存储在“a_password_file”中的唯一密码加密字符串“foobar”,并将变量命名为“the_secret”
ansible-vault encrypt_string --vault-password-file a_password_file 'foobar' --name 'the_secret'
上面的命令创建以下内容
the_secret: !vault | $ANSIBLE_VAULT;1.1;AES256 62313365396662343061393464336163383764373764613633653634306231386433626436623361 6134333665353966363534333632666535333761666131620a663537646436643839616531643561 63396265333966386166373632626539326166353965363262633030333630313338646335303630 3438626666666137650a353638643435666633633964366338633066623234616432373231333331 6564
要加密字符串“foooodev”,请使用存储在“a_password_file”中的“dev” Vault 密码添加 Vault ID 标签“dev”,并将加密的变量称为“the_dev_secret”
ansible-vault encrypt_string --vault-id dev@a_password_file 'foooodev' --name 'the_dev_secret'
上面的命令创建以下内容
the_dev_secret: !vault | $ANSIBLE_VAULT;1.2;AES256;dev 30613233633461343837653833666333643061636561303338373661313838333565653635353162 3263363434623733343538653462613064333634333464660a663633623939393439316636633863 61636237636537333938306331383339353265363239643939666639386530626330633337633833 6664656334373166630a363736393262666465663432613932613036303963343263623137386239 6330
要加密从标准输入读取的字符串“letmein”,请使用存储在 a_password_file 中的“dev” Vault 密码添加 Vault ID“dev”,并将变量命名为“db_password”
echo -n 'letmein' | ansible-vault encrypt_string --vault-id dev@a_password_file --stdin-name 'db_password'
警告
在命令行直接键入秘密内容(不使用提示)会将秘密字符串留在您的 shell 历史记录中。在测试之外不要这样做。
上面的命令创建以下输出
Reading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a new line) db_password: !vault | $ANSIBLE_VAULT;1.2;AES256;dev 61323931353866666336306139373937316366366138656131323863373866376666353364373761 3539633234313836346435323766306164626134376564330a373530313635343535343133316133 36643666306434616266376434363239346433643238336464643566386135356334303736353136 6565633133366366360a326566323363363936613664616364623437336130623133343530333739 3039
要提示您输入要加密的字符串,请使用来自“a_password_file”的“dev” Vault 密码对其进行加密,将变量命名为“new_user_password”并为其提供 Vault ID 标签“dev”
ansible-vault encrypt_string --vault-id dev@a_password_file --stdin-name 'new_user_password'
上面的命令触发以下提示
Reading plaintext input from stdin. (ctrl-d to end input, twice if your content does not already have a new line)
键入要加密的字符串(例如,“hunter2”),按 Ctrl+D,然后等待。
警告
在提供要加密的字符串后,不要按 Enter
。这会将换行符添加到加密的值中。
上面的序列创建以下输出
new_user_password: !vault | $ANSIBLE_VAULT;1.2;AES256;dev 37636561366636643464376336303466613062633537323632306566653533383833366462366662 6565353063303065303831323539656138653863353230620a653638643639333133306331336365 62373737623337616130386137373461306535383538373162316263386165376131623631323434 3866363862363335620a376466656164383032633338306162326639643635663936623939666238 3161
您可以将上述任何示例中的输出添加到任何剧本、变量文件或角色中以备将来使用。加密的变量比纯文本变量更大,但它们可以在保护敏感内容的同时,使剧本、变量文件或角色的其余部分保持纯文本,以便您可以轻松地阅读。
查看加密变量
可以使用 debug 模块查看加密变量的原始值。您必须传递用于加密变量的密码。例如,如果您将上一个示例中创建的变量存储在一个名为“vars.yml”的文件中,则可以使用以下方法查看该变量的未加密值
ansible localhost -m ansible.builtin.debug -a var="new_user_password" -e "@vars.yml" --vault-id dev@a_password_file
localhost | SUCCESS => {
"new_user_password": "hunter2"
}
使用 Ansible Vault 加密文件
Ansible Vault 可以加密 Ansible 使用的任何结构化数据文件,包括
来自库存的组变量文件
来自库存的主机变量文件
使用
-e @file.yml
或-e @file.json
传递给 ansible-playbook 的变量文件由
include_vars
或vars_files
加载的变量文件角色中的变量文件
角色中的默认文件
任务文件
处理程序文件
二进制文件或其他任意文件
整个文件将在 Vault 中加密。
注意
Ansible Vault 使用编辑器创建或修改加密文件。有关保护编辑器的一些指导,请参阅 保护编辑器的步骤。
加密文件的优点和缺点
文件级加密使用起来很简单。使用rekey命令,对加密文件的密码轮换非常直观。加密文件不仅可以隐藏敏感值,还可以隐藏您使用的变量名称。但是,使用文件级加密,文件的内容不再易于访问和读取。这可能是加密的任务文件的问题。在加密变量文件时,请参阅保持加密的变量安全可见了解如何将对这些变量的引用保存在非加密的文件中。由于 Ansible 无法知道是否需要内容,除非它解密,因此 Ansible 会在加载或引用时始终解密整个加密文件。
创建加密文件
要使用 ‘multi_password_file’ 中的 ‘test’ 密码库密码创建一个名为 ‘foo.yml’ 的新加密数据文件
ansible-vault create --vault-id test@multi_password_file foo.yml
该工具会启动一个编辑器(无论您使用 $EDITOR 定义了哪个编辑器,默认编辑器是 vi)。添加内容。当您关闭编辑器会话时,该文件将保存为加密数据。文件头反映了用于创建它的密码库 ID。
``$ANSIBLE_VAULT;1.2;AES256;test``
要创建一个新的加密数据文件,并为其分配密码库 ID ‘my_new_password’,并提示您输入密码
ansible-vault create --vault-id my_new_password@prompt foo.yml
同样,在编辑器中添加文件内容并保存。请务必存储在提示符处创建的新密码,以便您在需要解密该文件时能够找到它。
加密现有文件
要加密现有文件,请使用ansible-vault encrypt命令。此命令可以同时对多个文件进行操作。例如
ansible-vault encrypt foo.yml bar.yml baz.yml
要使用 ‘project’ ID 加密现有文件,并提示您输入密码
ansible-vault encrypt --vault-id project@prompt foo.yml bar.yml baz.yml
查看加密文件
要查看加密文件的内容,而无需对其进行编辑,您可以使用ansible-vault view命令
ansible-vault view foo.yml bar.yml baz.yml
编辑加密文件
要就地编辑加密文件,请使用ansible-vault edit命令。此命令会将文件解密到一个临时文件,允许您编辑内容,然后保存和重新加密内容,并在您关闭编辑器时删除临时文件。例如
ansible-vault edit foo.yml
要编辑使用 vault2
密码文件加密并分配了密码库 ID pass2
的文件
ansible-vault edit --vault-id pass2@vault2 foo.yml
更改加密文件上的密码和/或密码库 ID
要更改加密文件上的密码,请使用rekey命令
ansible-vault rekey foo.yml bar.yml baz.yml
此命令可以一次重新加密多个数据文件,并将询问原始密码以及新密码。要为重新加密的文件设置不同的 ID,请将新 ID 传递给 --new-vault-id
。例如,要将使用 ‘preprod1’ 密码库 ID 加密的文件列表从 ‘ppold’ 文件重新加密到 ‘preprod2’ 密码库 ID,并提示您输入新密码
ansible-vault rekey --vault-id preprod1@ppold --new-vault-id preprod2@prompt foo.yml bar.yml baz.yml
解密加密文件
如果您有一个不想再保持加密状态的加密文件,可以通过运行ansible-vault decrypt命令永久解密它。此命令会将文件未加密地保存到磁盘,因此请确保您不想edit它。
ansible-vault decrypt foo.yml bar.yml baz.yml
保护您的编辑器步骤
Ansible Vault 依赖于您配置的编辑器,这可能是信息泄露的来源。大多数编辑器都有防止数据丢失的方法,但这些方法通常依赖于额外的纯文本文件,这些文件可能包含您秘密的明文副本。请参阅您的编辑器文档以配置编辑器,避免泄露安全数据。以下部分提供了一些关于常见编辑器的指导,但不应视为保护编辑器的完整指南。
vim
您可以在命令模式下设置以下 vim
选项,以避免信息泄露的情况。您可能需要修改更多设置才能确保安全性,尤其是在使用插件时,因此请参阅 vim
文档。
禁用充当崩溃或中断时自动保存功能的交换文件。
set noswapfile
禁用备份文件的创建。
set nobackup
set nowritebackup
禁用 viminfo 文件从当前会话复制数据。
set viminfo=
禁用复制到系统剪贴板。
set clipboard=
您可以选择在 .vimrc
中添加这些设置,以适用于所有文件,或仅适用于特定路径或扩展名。有关详细信息,请参阅 vim
手册。
Emacs
您可以设置以下 Emacs 选项,以避免信息泄露的情况。您可能需要修改更多设置才能确保安全性,尤其是在使用插件时,因此请参阅 Emacs 文档。
不要将数据复制到系统剪贴板。
(setq x-select-enable-clipboard nil)
禁用备份文件的创建。
(setq make-backup-files nil)
禁用自动保存文件。
(setq auto-save-default nil)