如何使用Vault保护Ansible机密
我们通过Ansible设置的几乎每个Web应用程序或者服务器配置都将具有某种形式的敏感信息。它可能是数据库服务器的凭据,用户帐户信息,也可能是安全系统的私钥。我们如何保护数据免遭窥视?我们使用保管库。
在本教程中,我将首先向我们展示如何使用Ansible Vault通过AES256加密技术对数据进行加密。这是一种保护敏感数据免遭窥视的相对安全的方法,对于任何向Ansible介绍自己的人来说,这都是一个好的开始。
学习了Ansible Vault后,我们将深入研究Hashicorp Vault,这是一种更安全的秘密存储方法。
Ansible Vault
处理加密文件
创建一个加密的文件
Ansible Vault的create命令允许我们创建一个新的空白文件,该文件将受到保护
ansible-vault create my-secrets
加密现有文件
ansible-vault encrypt my-secrets
编辑加密文件
ansible-vault edit my-secrets
在Ansible Playbook中使用加密文件
在某个时候,我们的安全信息将需要从加密文件中提取。让我们看一下如何从保管库中提取信息并将其用于我们的剧本。
HashicorpVault库
使用Ansible Vault的问题在于,加密的数据可能会与剧本一起存储在版本控制系统中。这会带来很大的风险,因为它可能使那些本不应该访问敏感数据的人能够下载文件。
现在,按照当今的标准,AES256是一种非常强大的加密技术。在宇宙的尽头之前,有人可能会强行使用AES256加密文件的可能性是极不可能的。但是,AES256的较差实现可能会在加密中引入错误,从而使其在发现时易于解密。在本地存储加密数据时,应牢记这一点。
一种更安全的解决方案是使用外部保管库来保护敏感数据。尽管它仍使用AES256,但数据驻留在主机之外,这对安全性有巨大的改进。 Hashicorp Vault是一项服务,使我们可以安全地将密钥对数据存储在游戏簿之外。然后,当我们进行供应或者部署时,我们可以从金库中提取秘密。
需求
Ansible无法开箱即用访问Hashicorp Vault。我们将需要安装以下Python模块才能与保管库进行交互。
- hvac
- hvac [解析器]
向剧本添加Vault查询
我们将通过调试模块对库进行查找。然后,输出将被注册为变量,我们可以在整个游戏手册中使用该变量。
--- - hosts: all become: true vars: db_user: "{{ lookup('hashi_vault', 'secret=theitroad/db_user:value token=c30aa90a-06a8-680d-8bd1-a43181c3b77c url=https://vault.server:8200')}}" db_pass: "{{ lookup('hashi_vault', 'secret=theitroad/db_user:value token=c30aa90a-06a8-680d-8bd1-a43181c3b77c url=https://vault.server:8200')}}" tasks: - name: Deploy application git: repo: github.com/example/my-application.git - name: Configure webapp copy: dest: "/srv/my-application/configuration content: "db_user: {{db_user}}\ndb_pass: {{db_pass}}" owner: appuser group: appuser mode: 0600
在上面的示例剧本中,我们使用查找来注册两个变量db_user和db_pass。这些查询查询我们的Hashicorp Vault服务器,并检索我们存储的机密值。
Ansible Vault与Hashicrop Vault
我们向我们展示了两种保护秘密的方法,但是我们应该使用哪种方法呢?这在很大程度上取决于环境以及数据的安全性。