我们正在编写脚本来自动重新部署我们的服务器。这些脚本存储在版本控制中。
某些服务器需要访问私有 Git 存储库,但访问权限受 SSH 限制。将私有 SSH 密钥与其余配置脚本一起存储在版本控制中是否愚蠢,或者是否存在明显的替代方案?
理想情况下,我们不需要每次重新安装服务器时都创建新的密钥对。
答案1
理想情况下,我会将您编写的脚本中的数据与代码分开。这意味着将所有资产存储在存储库之外,可能是存储在特定于您的发行版的软件包中(dpkg、RPM 等),并使用 GPG 签名。这将使您的脚本更抽象、更灵活且更易于维护,但您必须学习如何为您的发行版创建软件包。
如果你坚持使用所有服务器共享的密钥,至少要加密它并在安装时要求输入密码。这样密码就不会存储在存储库中,并且可以在必要时更改。
无论您的存储库有多安全,您都需要记住,如果您将私钥未加密地保存在 (D)VCS 中,它们也会分发给所有将要进行开发的人员。在我看来,这使得控制任何信息泄露变得更加困难。在这种情况下,考虑一下当您的团队成员离开时的情况,无论如何您都需要一种方法来撤销并发布一组新密钥。
我不会轻易放弃为每个新服务器生成新密钥对的可能性。我猜公钥的分发是困扰您的问题,但这并非无法解决的任务。根据您的安装脚本,生成的公钥可以在安装过程中显示并添加到存储库的访问列表中。
您是否计划使用某种配置管理或检测系统来引导和配置服务器?如果没有,我强烈建议您考虑使用一个而不是开发一组脚本。它们为服务器管理提供了许多其他附加好处,而不仅仅是针对这项任务。Puppet、chef、cfengine、salt、bcfg2(以及其他一些)甚至一些远程检测系统(如 Fabric 和 Ansible)使导出一组公钥的过程变得非常轻松和无痛。
答案2
你必须定义你的安全级别,你的存储库安全吗?它比你的期末服务器更安全吗?至少是同样的安全性?你必须记住,任何访问你的存储库的人都会访问你的期末服务器。
答案3
私钥可以与密码进行比较,如果你拥有私钥,你就可以访问该密钥所针对的系统。
当只有有权访问密钥的人才有权访问版本控制系统时,将密钥放入版本控制系统就没有问题了。