将Hashicorp Vault与Ansible Jinja2模板一起使用

时间:2020-01-09 10:34:23  来源:igfitidea点击:

在本教程中,我们将学习如何将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保险库中检索秘密并填充敏感信息。我们刚刚改善了我们存储敏感信息的方式,从而更好地保护我们免受意外数据共享和泄漏的影响。