目前我正在编写一个Playbook来部署我的Django应用程序。关于它没有特别的革命性或秘密性,所以我决定开源。我唯一想保密的当然是我用于部署的ssh密钥。
非常感谢一些提示。
答案 0 :(得分:2)
我最近开始使用加密机密和Travis CI测试(GitHub link)的开源安全基础设施方法。
我使用ansible-vault来加密秘密。对于每个项目Travis creates a key pair,在travis-client的帮助下,您可以使用它在Travis构建环境中安全地设置保管库密码。
在您的特定情况下(您只想部署一个密钥),有两种简单的方法可以使用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
旨在加密/解密.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链接中有很好的记录。在上一节中,我提供了一篇文章,其中也解释了如何做到这一点。
尽管对于您手头的问题可能有点超出范围,但我想就此主题分享更多想法。
安全问题
虽然使用Travis进行测试非常舒服,但一个主要问题是你仍然将你的秘密交给Travis环境(显然如果Travis受到了损害,你的秘密就消失了) - 所以我建议也许它更安全在Travis部署测试中部署/部署虚假数据。我上面提供的项目仍然处于早期阶段,并且不包含任何真实的生产秘密(但是),但我将以一种我可以在Travis部署中轻松部署虚假数据的方式设计我的配置。另外,请确保您不要在Travis中记录太多(因为对于开源repos,travis构建日志也是开源的)。您可以避免在剧本中使用no_log: yes
变量进行日志记录。
HashiCorp Vault
另一个处理秘密的非常有趣的项目来自HashiCorp:Vault(不要误以为ansible-vault
!)我还没有时间仔细研究它,但它看起来很有前途,对于更大的设置似乎是一个好主意。
外部文章
以下是more detailed article关于将ansible-vault
与Travis CI一起使用的情况(也适用于您希望加密敏感模板或其他静态文件的情况,这需要一些小的解决方法,因为ansible-vault
是仅用于加密包含变量的.yml
个文件。它还简要讨论了与外部服务共享秘密的问题。 (秘密管理是一个非常有趣的话题,我仍在调整我的方法,所以这篇文章仍在制作中,但大部分的想法已经在那里提供了)