codecamp

Ansible 用 Vault 管理敏感资料

导入 Ansible 组态工具,多少会使用明文 (Plain text) 在 Playbooks 里存放敏感资料 (sensitive data) 1,更别说我们还会搭配 Git 版本系统使用,这很可能会造成潜在的资安风险!接下来冻仁将通过 Vault 这个保险库系统强化资料安全

automate_with_ansible_practice-33.jpg

图片来源:http://kingofwallpapers.com/vault.html

Vault 是什么?

Vault 就字面上的意义有地窖、保险库的意思。在 Ansible 里是指加密、解密档案的技术。

Ansible 从 v1.5 开始支持此功能,预设使用 AES 加密技术,其详细说明可参考 Vault | Ansible Documentation 官方文件。

2016-12-30-ansible-vault-1.png

怎么使用 Vault?

在进入实作之前,先来看看 Vault 的使用方法。

  1. 建立加密 (Encrypted) 档案。

    $ ansible-vault create foo.yml
    
  2. 编辑加密档案内容。

    $ ansible-vault edit foo.yml
    
  3. 更换加密金钥 (密码)。

    $ ansible-vault rekey foo.yml
    
  4. 对已存在的明文档案进行加密

    $ ansible-vault encrypt foo.yml
    
  5. 解开 (Decrypt) 已加密档案。

    $ ansible-vault decrypt foo.yml
    
  6. 检视已加密的档案内容。

    $ ansible-vault view foo.yml
    

怎么在 Playbooks 里使用 Vault?

以下将借由简单的实作来展示 Playbook 搭配 Vault 的使用方法。

  1. 建立 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 :
    
  2. 建立变数档案。

    $ vi defaults/main.yml
    world: 'ironman'
    
  3. 将变数档案进行加密:过程中需输入两次密码。

    $ ansible-vault encrypt defaults/main.yml
    New Vault password:
    Confirm New Vault password:
    Encryption successful
    
  4. 检视已加密的档案内容:使用刚刚输入的密码进行检视。

    $ ansible-vault view defaults/main.yml
    Vault password:
    world: 'ironman'
    

手动输入金钥 (密码) 解密

  1. 执行 Playbook 并搭配 --ask-vault-pass 参数手动输入密码。

    $ ansible-playbook hello_world.yml --ask-vault-pass
    
  2. 或通过 ansible.cfg 启用 ask_vault_pass,其预设值为 false。

    1. 设定 ansible.cfg

      $ vi ansible.cfg
      [defaults]
      ask_vault_pass = true
      
    2. 执行 Playbook。

      $ ansible-playbook hello_world.yml
      

透过金钥 (密码) 档解密

  1. 建立密码档:此例用的密码为 bGpvxx

    $ echo 'bGpvxx' > secret.txt
    
  2. 执行 Playbook 并搭配 --vault-password-file 参数指定金钥路径。

    $ ansible-playbook hello_world.yml --vault-password-file secret.txt
    
  3. 或于 ansible.cfg 里新增 vault_password_file 参数,并指定金钥路径。

    $ vi ansible.cfg
    [defaults]
    vault_password_file = secret.txt
    

最后附上冻仁的实作画面。

2016-12-30-ansible-vault-2.gif

  • 当 include 到 defaults/main.yml 密文 (Cipher text) 档后,需先用 Vault 解开才可继续执行。

后话

或许大家觉得在本机储存敏感资料很安全,谁又能保证传输过程中能不被窃取呢?

越方便的工具往往伴随著越大的资安风险,但至少我们可以先从档案加密著手。

相关连结

1. 资料库伺服器 (database server) 的连线资讯、第三方服务的 Access Key 和 Secret 等都算是敏感资料的一种。 ↩


Ansible 在 Docker Hub 混用 Ansible 自动建置 Docker image
Ansible 总结
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }