与管理 git ansible 结帐中使用的密钥相关的最佳实践是什么?

What are the best practices related to managing keys used in git checkout for ansible?

目前我正在编写一个剧本来部署我的 Django 应用程序。它没有什么特别的革命性或秘诀,所以我决定将其开源。我唯一想保密的当然是我用于部署的 ssh 密钥。

  1. 有哪些应对策略?
  2. 我也想用Travis-CI做测试。使用 Travis 测试整个部署时,处理密钥的最佳方式是什么?

非常感谢一些提示。

我最近开始了一种开源的 ansible 基础架构方法,其中包含加密的秘密和 Travis CI 测试 (GitHub link)。

我用过 ansible-vault to encrypt the secrets. For each project Travis creates a key pair and with the help of the travis-client 您可以使用它在 Travis 构建环境中安全地设置保管库密码。

您使用 ansible-vault 方法的案例

在您的特定情况下(您只想部署一个密钥),有两种简单的方法可以使用 ansible-vault.

加密密钥

第一种方法:加密静态密钥文件

ANSIBLE_VAULT_PASSWORD_FILE=vault_pass ansible-vault encrypt <key_file>

然后通过以下任务将其复制到节点:

- copy: 
    content={{ lookup('pipe', 'ansible-vault --vault-password-file vault_pass view <key_file>') }}
    dest=/<deploy_user>/.ssh/id_rsa

lookup 解决方法是必要的,因为 ansible-vault 是为 encrypt/decrypt .yml 可变文件设计的,并且它不会在推出期间自动解密静态文件或模板。

第二种方法:将密钥放在变量中并加密var文件

另一种方法是将您的私钥添加到 .yml 文件(并像上面一样加密),然后可以通过 ansible 即时解密:

secrets.yml

private_key: |
  <copy-key-here>

然后您可以在任务中引用该变量。

最后,两种方法都可以通过以下方式推出:

ANSIBLE_VAULT_PASSWORD_FILE=vault_pass ansible-playbook -i <inventory-file> <playbook-file>

现在您需要与 Travis 分享您的 vault_pass(或解密 vault_pass 文件的密码)。这在上面的 Travis link 中有很好的记录。在上一节中,我提供了一篇文章,其中还解释了如何做到这一点。

深入挖掘

虽然这可能有点超出您手头问题的范围,但我想分享一些关于这个主题的更多想法。

安全问题

虽然使用 Travis 进行测试非常舒服,但一个主要问题是您仍在将您的秘密交给 Travis 环境(很明显,如果 Travis 受到威胁,您的秘密就会消失)——所以我建议也许可以在您的 Travis 推出测试中 deploy/rollout 伪造数据更安全。我上面提供的项目仍处于早期阶段,(目前)还不包含任何真正的生产秘密,但我将以一种可以轻松地在我的 Travis 部署中部署假数据的方式来设计我的配置。另外,请确保您不要在 Travis 中记录太多(因为对于开源存储库,travis 构建日志也是开源的)。您可以避免在剧本中使用 no_log: yes 变量进行记录。

HashiCorp 保险库

另一个非常有趣的处理机密的项目来自 HashiCorp:Vault(不要误认为 ansible-vault!)我还没有时间仔细研究它,但它看起来很有前途,对于更大的设置来说似乎是个好主意。

外部文章

这里有一个 more detailed article 关于使用 ansible-vault 和 Travis CI(也适用于您希望加密敏感模板或其他静态文件的情况,这需要一些小的解决方法,因为ansible-vault 仅用于加密 .yml 包含变量的文件)。它还简要讨论了与外部服务共享秘密的问题。 (秘密管理是一个很有趣的话题,我还在调整我的方法,所以这篇文章还在制作中,但大部分想法已经在那里提供)