Ansible Vault 加密您的秘密

Posted AnsibleOps

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible Vault 加密您的秘密相关的知识,希望对你有一定的参考价值。


您可能已经确定了您的 DevOps 工作流程,但您应该继续努力改进此类实施的运营成熟度。我使用的一个工具是 RedHat 的 Ansible,这对于编排和配置管理来说非常棒。Ansible的低进入门槛和简单性就是为什么很多开始使用它的人学会去爱它。

Ansible 中的一个特性是开发人员应该更经常使用Ansible Vault。

一、 了解 Ansible Vault 如何保护数据

从 Ansible 1.5 版本开始, Ansible 提供了 vault 数据安全解决方案,允许保存“加密文件中的密码或密钥等敏感数据,而不是作为剧本或角色中的纯文本,这些文件可以分散存放或放在源代码管理”。

私人 SSL 证书,API 密钥和其他敏感数据通常在 GitHub 上公布,或者通过其他一些非预期的手段。 Ansible Vault 通过 AES256 加密您的秘密,以便您可以安全地将它们存储在 Ansible Playbooks 和库存中。

二、 如何使用 ansible-vault

创建一个 vault 文件是很简单的:

ansible-vault create vault.yml

您将被提示输入密码,这个文件将会被共享给那些需要访问这个 vault 文件的人。你输入你的变量,保密内容等,并保存文件。 如果您尝试在文本编辑器中编辑 vault.yml,您将看到如下所示的内容:

more  vault.yml
$ANSIBLE_VAULT;1.1;AES256
33643630303032313239633430383937383333363739356266653866376533313364323339313066
3431366162613731333363326339306432623130356433650a373335303934353934616330316262
37306431643066333937326339306432346235333739663031633066326361363332323166316265
3437633363643665360a303631313630616533356330626531356437616566383761313362616539
65623839616338313136306233306639366634393038333962636331323434353765

编辑 vault 文件与创建文件一样简单:

ansible-vault edit vault.yml

变更加密数据秘钥:

$ ansible-vault rekey vault.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful

对于已经存在的文档加密

ansible-vault encrypt vault.yml

三、使用Vault加密的文件运行Ansible

3.1 实践场景1: 加密主机清单

主机清单文件:

$ cat hosts 
[svrs] 
app1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=30022 
app2 ansible_ssh_host=127.0.0.1 ansible_ssh_port=30023 
app3 ansible_ssh_host=127.0.0.1 ansible_ssh_port=30024 
[svrs:vars] 
ansible_ssh_user=root 
ansible_ssh_pass=shroot

使用密码加密主机清单:

ansible-vault encrypt hosts 
New Vault password: 
Confirm New Vault
password: Encryption successful

查看加密文件内容:

cat hosts
$ANSIBLE_VAULT;1.1;AES256
35306634313362653239363033373637323966383639313536633438323864303464313664643132
3662393535643830653335656137653433616235646462630a333333353563363961373362613866
35636138626563393031653031366363613932356264643230663066356562343933343162303262
3733396435616466340a313033336461363361326166373334656339373662656636336636383132
32393163653866343632363661396230393961386639663563303765626134346162326132343333

使用加密的主机清单文件运行 ansible, 这时会提示错误

ansible svrs -i hosts -m ping
ERROR! ERROR! Decryption failed

加入参数—ask-vault-pass 才可以运行

ansible svrs -i hosts -m ping --ask-vault-pass
Vault password:

app2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
app3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
app1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

3.2 实践场景2: 使用 Vault 创建用户

1) 建立 playbook

cat create_user.yml
---

- name: create user account
  hosts: all
  become: yes
  vars_files:
   - secret.yml
  tasks:
   - name: create users from secret.yml
     user:
       name: "{{ item.name }}"
       password: "{{ item.pw | password_hash('sha512') }}"
     with_items: "{{ newusers }}"

2) 创建用户变量文件

ansible-vault create secret.yml
newusers:
  - name: user1
    pw: user001
  - name: user2
    pw: user002

3) 运行 playbook

ansible-playbook create_user.yml --ask-vault-pass

四、Ansible Vault 小技巧

您可以将 Ansible 的配置(ansible.cfg)指向存储库外部的 vault 密码文件。所有进入这个文件的是你的 Ansible vault 密码。 这样您不需要每次编辑 Ansible vault 文件时都要输入密码:

vault_password_file = ~/.ansible_vault

当使用多个Vault文件,如 host_vars 和 group_vars,Ansible Vault 也有很好的技巧。如果你有一个包含你的 vault 文件的目录,你可以从所有 vault 文件中通过 grep 找出某个变量。

ls -1 | while read N ; 
do 
echo -n $N: ; 
ansible-vault --vault-password-file ~/.ansible_vault view $N | grep STRING ; 
done

另一个漂亮的窍门是用 Ansible Vault 加密 SSL / TLS 密钥。 这样你可以让它们和他们的配置处于版本控制中。你可以用一个简单的命令加密你的密钥:

ansible-vault encrypt private.pem

然后,您可以通过查找将您的密钥作为变量调用,并将其部署到远程系统上的文件中:

- hosts: host.domain.tld
      vars:
        - private_key: "{{ lookup('file', 'files/private.pem') }}"
      tasks:
        - name: Place certs on systems
          copy:
            content: {{ item.content }}
            dest: /etc/pki/tls/certs/{{ item.dest }}
            owner: root
            group: root
            mode: {{ item.mode }}
          with_items:
            - { content: "{{ private_key }}", dest: 'private.pem', mode: '0600' }

您的解密私钥将登陆系统,以备即时使用。

正如你所看到的,Ansible Vault 的可能性是无止境的,你的开发和运营可以从它的使用中受益。


以上是关于Ansible Vault 加密您的秘密的主要内容,如果未能解决你的问题,请参考以下文章

如何在库存文件中使用ansible-vault加密密码?

Ansible Vault 加密

ansible 配置 vault 加密

Ansible 加密模块 Vault

使用ansible vault加密

Ansible 安全 之加密主机清单