Ansible 用 Vault 管理敏感资料
导入 Ansible 组态工具,多少会使用明文 (Plain text) 在 Playbooks 里存放敏感资料 (sensitive data) 1,更别说我们还会搭配 Git 版本系统使用,这很可能会造成潜在的资安风险!接下来冻仁将通过 Vault 这个保险库系统强化资料安全。
图片来源:http://kingofwallpapers.com/vault.html
Vault 是什么?
Vault 就字面上的意义有地窖、保险库的意思。在 Ansible 里是指加密、解密档案的技术。
Ansible 从 v1.5 开始支持此功能,预设使用 AES 加密技术,其详细说明可参考 Vault | Ansible Documentation 官方文件。
怎么使用 Vault?
在进入实作之前,先来看看 Vault 的使用方法。
建立加密 (Encrypted) 档案。
$ ansible-vault create foo.yml
编辑加密档案内容。
$ ansible-vault edit foo.yml
更换加密金钥 (密码)。
$ ansible-vault rekey foo.yml
对已存在的明文档案进行加密
$ ansible-vault encrypt foo.yml
解开 (Decrypt) 已加密档案。
$ ansible-vault decrypt foo.yml
检视已加密的档案内容。
$ ansible-vault view foo.yml
怎么在 Playbooks 里使用 Vault?
以下将借由简单的实作来展示 Playbook 搭配 Vault 的使用方法。
建立 Playbook。
$ vi hello_world.yml --- - name: say 'hello world' hosts: all vars_files: - defaults/main.yml tasks: - name: echo 'hello world' command: echo 'hello ' register: result - name: print stdout debug: msg: "" # vim: ft=ansible :
建立变数档案。
$ vi defaults/main.yml world: 'ironman'
将变数档案进行加密:过程中需输入两次密码。
$ ansible-vault encrypt defaults/main.yml New Vault password: Confirm New Vault password: Encryption successful
检视已加密的档案内容:使用刚刚输入的密码进行检视。
$ ansible-vault view defaults/main.yml Vault password: world: 'ironman'
手动输入金钥 (密码) 解密
执行 Playbook 并搭配
--ask-vault-pass
参数手动输入密码。$ ansible-playbook hello_world.yml --ask-vault-pass
或通过
ansible.cfg
启用ask_vault_pass
,其预设值为 false。设定
ansible.cfg
。$ vi ansible.cfg [defaults] ask_vault_pass = true
执行 Playbook。
$ ansible-playbook hello_world.yml
透过金钥 (密码) 档解密
建立密码档:此例用的密码为
bGpvxx
。$ echo 'bGpvxx' > secret.txt
执行 Playbook 并搭配
--vault-password-file
参数指定金钥路径。$ ansible-playbook hello_world.yml --vault-password-file secret.txt
或于
ansible.cfg
里新增vault_password_file
参数,并指定金钥路径。$ vi ansible.cfg [defaults] vault_password_file = secret.txt
最后附上冻仁的实作画面。
- 当 include 到
defaults/main.yml
密文 (Cipher text) 档后,需先用 Vault 解开才可继续执行。
后话
或许大家觉得在本机储存敏感资料很安全,谁又能保证传输过程中能不被窃取呢?
越方便的工具往往伴随著越大的资安风险,但至少我们可以先从档案加密著手。
相关连结
1. 资料库伺服器 (database server) 的连线资讯、第三方服务的 Access Key 和 Secret 等都算是敏感资料的一种。 ↩
更多建议: