Ansible – 私有 Git 仓库 – 使用 SSH 代理转发还是复制私有 SSH 密钥

47次阅读
没有评论

问题描述

一个用户刚开始接触 Ansible,觉得它非常不错。虽然对 DevOps 方面的知识了解有限,但从未处理过复杂的场景。他正在创建 Ansible playbook,用来替代当前的部署工具 – Deployer PHP。目前他卡在了克隆 Git 仓库的问题上。他知道需要添加公钥以启用对 Git 仓库的访问,所以他的问题是,他应该使用 SSH 代理转发(这样可以使用本地 SSH 密钥)还是应该将私有 SSH 密钥(加密的,添加到源代码控制)存储在 Ansible 项目中,并使用 Ansible 将其复制到目标节点上。他认识到这个问题可能很宽泛,所以他关心的是这两种方法的安全性影响。

解决方案

请注意以下操作可能有版本差异,确保操作前做好备份。

方案1

你也可以考虑使用 Ansible Vault 来加密包含私有 SSH 密钥的文件。这样可以增加安全性。以下是一些相关链接:
Ansible Vault 文档
Ansible Vault 文件处理
使用 Ansible 和 OpenSSL 部署加密的 SSL 密钥和其他文件

方案2

如果你的 Git 仓库是私有的 GitHub 仓库,你可以考虑使用 GitHub 的 deploy keys(部署密钥),这是一个很强大的功能,可以实现只读访问。如果你的仓库不是托管在 GitHub 上,或者不支持只读部署密钥,那么你提到的两种方法都是有价值的。

单人 DevOps

如果你是唯一在项目上工作的人,并且你的机器/机器是唯一可以运行 Ansible 的机器(没有像 Jenkins 这样的持续集成工具),那么你可以选择使用 SSH 代理转发选项。这样你不太可能在不安全的地方留下未加密的私钥。

小团队

如果你是一个团队中的一员,一起工作在同一个 Ansible playbook 上,或者有多个人运行 playbook,那么你有两种选择:
1. 保持 SSH 代理转发选项;每个团队成员都从自己的机器运行脚本。
2. 创建一个部署密钥对,上传公钥,并像 Berlin 建议的那样,使用 Vault 对私钥进行加密。这个密钥被加密,私钥的范围仅限于 1 个或少数几个仓库。这种方法的问题是,每当团队成员离开团队时,你都需要轮换 Vault 密码。

我个人不会将个人的广泛使用的私钥放在任何可能不安全的地方。Vault 的加密取决于使用者,而且有很多明文的密钥/密码存在,所以使用时需要谨慎。

方案3

另外一个可能的解决方案是,如果你可以配置你的仓库,使其仅允许该特定密钥的只读访问,并且你不介意仓库可以公开读取,那么你可以存储私钥,但需要确保私钥没有密码。不过这不是理想的做法,因为 root 用户可以拿到 socket,但如果你的环境比较良好(即没有容易受到攻击的 Web 服务器附近),那么应该没问题。

请根据你的具体情况和安全要求选择合适的方法。

正文完