将Hashicorp Vault与Ansible Jinja2模板一起使用
在本教程中,我们将学习如何将Hashicorp Vault集成到我们的Ansible模板中,以实现更好,更安全的秘密管理。虽然我们可以使用内置的本机保管库工具来保护使用AES256加密的本地文件中的机密,但将机密保存在主机以外的安全库中是更好的解决方案。
将加密文件保存在本地的问题需要一种共享这些机密的机制。将数据存储在Git存储库中以更轻松地共享它可能意味着使攻击者可以访问该文件。有权访问该文件意味着它可以被强行使用。
现在,根据AES256加密文件的加密规范,将需要数以千计的硬件才能对当今的硬件进行暴力破解。那么,为什么公开存储这些文件不安全呢?所述加密技术实施中的漏洞可能意味着(而不是立即破解)它,它可能在数小时内被强制打开。
将我们的秘密存储在与代码和脚本完全分离的脱离主机的保管库中,可以更好地保护我们的敏感数据不被泄漏。 Hashicorp保险库是一个免费的开源项目,它提供了一种安全存储我们的秘密的方法。
我们不必记住URI即可请求秘密,就像Ansible所做的那样,有些支持是如何建立的。但是,我们将需要在运行剧本的计算机上安装两个Python依赖关系-而不是要针对其执行任务的目标主机。
依存关系
在开始之前,我们需要在本地桌面上安装以下组件。如果我们正在运行OSX或者Linux,则可以pip安装它们。
- hvac
- hvac [解析器]
注册秘密
对于本教程,我们将在Hashicorp Vault中注册三个秘密-用户名,密码和主机。这些将是我们应用程序生产数据库的凭据和主机。
vault write secret/theitroad/production_db username=appuser password=password123 host=my.database.server
创建Ansible剧本
我们将创建一个新的剧本,以从Vault访问我们的秘密。通过使用Ansible的查找模块,我们向Vault查询我们的机密,并将其存储在作为字典的变量中。
然后,Jinja2模板可以使用该词典来填充必要的设置。
—— - hosts: all vars: prod_db: “{{ lookup(‘hashi_vault’, ‘secret=theitroad/production/db token={{ vault_token }} url={{ vault_url }}” tasks: - name: Configure app template: src: config.json.j2 dest: /srv/myapp/config.json owner: appuser group: appuser mode: 0644 with_dict: - "{{ prod_db }}" tags: - app_config - app_deploy
Jinja2保险柜模板
我们的配置文件将基于JSON。由于我们正在使用字典,因此我们可以指定想要其值的键。在下面的示例中,我们使用数据库主机和凭据填充配置文件。
{ “database”: { “host”: “{{ prod_db.host }}”, “username”: “{{ prod_db.username }}”, “password”: “{{ prod_db.password }}” } }
现在,针对应用程序服务器运行该剧本。我们正在运行剧本的主机将与Vault服务器联系以获取指定的机密。然后,该信息将被注册为变量,可供我们配置的远程主机上的模板访问。
PLAY [all] ****************************************************************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************************************** ok: [192.168.57.102] TASK [Expose the secrets!] ************************************************************************************************************************************************************************** changed: [192.168.57.102] => (item={'value': u'appuser', 'key': u'username'}) ok: [192.168.57.102] => (item={'value': u'prod-db.server.intra', 'key': u'host'}) ok: [192.168.57.102] => (item={'value': u'password123', 'key': u'password'}) PLAY RECAP ****************************************************************************************************************************************************************************************** 192.168.57.102 : ok=2 changed=1 unreachable=0 failed=0
这就是全部。现在,我们可以从Hashicorp保险库中检索秘密并填充敏感信息。我们刚刚改善了我们存储敏感信息的方式,从而更好地保护我们免受意外数据共享和泄漏的影响。