如何避免在版本控制中存储密码?
Posted
技术标签:
【中文标题】如何避免在版本控制中存储密码?【英文标题】:How do you avoid storing passwords in version control? 【发布时间】:2010-11-29 00:14:41 【问题描述】:您使用什么策略来避免在版本控制中存储密码?
目前,我将开发/测试/生产密码保存在三个不同的文件中,并在部署期间使用相应的文件。所有这一切都致力于版本控制,但我对此不太满意,因为并非所有开发人员都需要知道这些密码(尤其是外包的,他们只有在项目持续时才能访问,可能只有一个月)。
在数据库中存储密码不是一个好的选择:
我在 Spring 上下文(Java 应用程序)初始化期间需要大部分数据,我不想为连接单个数据库构建脚手架,然后连接到其余数据库并初始化应用程序的其余部分 有些密码仅与部署相关;访问不同服务器、密钥库等的密码;这些是应用程序启动后无法加载的内容,因为它根本不加载它我正在考虑将部署配置从开发人员机器转移到专用计算机,该计算机从版本控制中检查代码并运行构建/部署脚本,但我不确定什么是最好的方法。
我还需要说,我不想要最终的安全性:我只想避免在每个开发人员的磁盘上都设置密码并使其过于简单。
所以我想请教您的经验/最佳做法。你是怎么做到的?
【问题讨论】:
This Hacker News thread 非常适合这个话题。 【参考方案1】:我倾向于将特定于环境的配置属性放入一个属性文件中,该文件不在源代码管理中,也不属于构建过程的一部分。在设置新环境时,该设置的一部分是创建包含数据库地址、凭据和名称、相关远程主机名称等内容的属性文件。
在 Spring 中,您使用 PropertyPlaceholderConfigurer
来加载属性文件。它只需要 Spring 可以找到,这通常意味着将它放在应用程序服务器下的适当目录中。
或者,您可以使用wrapper 运行应用程序服务器,JVM 启动选项包括将这些属性文件添加到类路径中,以便 Spring 可以找到它们。
【讨论】:
【参考方案2】:我已经看到了两种方法:
将密码移到另一个开发人员无权访问的源代码管理树中。 不要将任何密码放入源代码控制中,并且每次部署完成时,专门的构建管理员都需要输入密码。这是在一家银行,那里有一个全职员工负责构建流程/合并/发布。【讨论】:
在另一个分支上保存密码似乎是要走的路。像 git 这样的分布式 SCM 使这变得非常容易。【参考方案3】:这并非在所有情况下都有效,但这就是使用 NT AUTHORITY\NETWORK SERVICE 作为服务身份的光荣之处。如果使用此身份,则无需维护密码它——您可以使用计算机的 AD 凭据以 DOMAINNAME\MACHINENAME$ 的形式进行受保护的网络和数据库访问。
当然,有一些关键的事情需要注意——其中最重要的是没有两个共享安全边界的应用程序像这样托管在同一台服务器上。
【讨论】:
【参考方案4】:将密码放在 o/s 用户环境变量中。
只有该用户或 root 可以读取该值,与文件相同,但将其签入源代码控制的可能性为零。
【讨论】:
【参考方案5】:我认为在存储库之外有一个 local_settings 很好。
https://***.com/a/21570849/1675586
【讨论】:
【参考方案6】:您可以以加密形式存储它们,而不是不存储它们。因此,您不必在新开发人员开始时一直通过 IM 或电子邮件发送凭据文件的痛苦......您只需告诉他们一次项目特定的主密码,以便他们可以加密凭据。
【讨论】:
这个问题以及其他一些建议是,我认为密钥仍将存储在应用程序代码中。您如何建议解密密码?如果手动输入主密钥,它可以工作,但这只是第二好的选择。最好不要将密码存储在版本控制中,即使是加密的。但是,拥有主密钥可能是第二好的选择,只要凭据以仅允许帐户需要访问的方式完成(例如,如果不需要更新或删除,则选择,并且仅在需要的表上)以上是关于如何避免在版本控制中存储密码?的主要内容,如果未能解决你的问题,请参考以下文章