Version control 如何避免在版本控制中存储密码?

Version control 如何避免在版本控制中存储密码?,version-control,deployment,passwords,password-protection,Version Control,Deployment,Passwords,Password Protection,您使用什么策略来避免在版本控制中存储密码 目前,我将开发/测试/生产密码保存在三个不同的文件中,并在部署期间使用相应的文件。所有这些都致力于版本控制,但我对此不太满意,因为并非所有开发人员都需要知道这些密码(特别是外包的密码,它们只能在项目结束时访问,可能只有一个月) 在数据库中存储密码不是一个很好的选择: 在Spring上下文(javaapp)的初始化过程中,我需要大部分数据,我不想构建连接到单个数据库的支架,然后连接到其余的数据库并初始化其余的应用程序 某些密码仅与部署相关;访问不同服务器

您使用什么策略来避免在版本控制中存储密码

目前,我将开发/测试/生产密码保存在三个不同的文件中,并在部署期间使用相应的文件。所有这些都致力于版本控制,但我对此不太满意,因为并非所有开发人员都需要知道这些密码(特别是外包的密码,它们只能在项目结束时访问,可能只有一个月)

在数据库中存储密码不是一个很好的选择:

  • 在Spring上下文(javaapp)的初始化过程中,我需要大部分数据,我不想构建连接到单个数据库的支架,然后连接到其余的数据库并初始化其余的应用程序
  • 某些密码仅与部署相关;访问不同服务器、密钥库等的密码。;这些是应用程序启动后无法加载的内容,因为它根本不加载
我正在考虑将部署配置从开发人员机器移动到专用计算机,该计算机将从版本控制中检查代码并运行构建/部署脚本,但我不确定什么是最好的方法

我还需要说,我不想要终极安全性:我只是想避免在每个开发人员的磁盘上都有密码,让它变得太容易


因此,我想了解您的经验/最佳做法。如何做到这一点?

我倾向于将特定于环境的配置属性放入一个不在源代码管理中且不属于构建过程的属性文件中。在设置新环境时,该设置的一部分是创建属性文件,其中包括数据库地址、凭据和名称、相关远程主机的名称等

在Spring中,使用加载属性文件。它只需要由Spring查找,这通常意味着将它放在应用服务器下的适当目录中


或者,您可以使用运行应用程序服务器,JVM启动选项包括将这些属性文件添加到类路径中,以便Spring可以找到它们。

我看到了两种方法:

  • 将密码移到开发人员无权访问的另一个源代码管理树中
  • 不要在源代码管理中输入任何密码,每次部署完成时,专门的构建管理人员都需要输入密码。这是在一家银行里,有一个全职的家伙在做构建过程/合并/发布

这并非在所有情况下都有效,但这正是使用NT AUTHORITY\NETWORK SERVICE作为服务标识的好处所在。如果您使用此标识,则不需要为其维护密码——您只需使用计算机的AD凭据(格式为DOMAINNAME\MACHINENAME$)即可访问受保护的网络和数据库


当然,有一些关键的事情需要注意——其中最重要的一点是,没有两个共享安全边界的应用程序像这样托管在同一台服务器上。

将密码放在o/s用户环境变量中


只有该用户或root用户才能读取与文件相同的值,但将其签入源代码管理的可能性为零。

我认为最好在存储库之外有一个本地\u设置


您可以将它们以加密形式存储,而不是不存储它们。因此,你不必在新开发人员启动时一直通过IM或电子邮件发送凭据文件。。。您只需要告诉他们一次特定于项目的主密码,这样他们就可以加密凭据。

将密码保存在另一个分支上似乎是一种方法。像git这样的分布式SCM使这变得非常容易。我认为,这其中的一个问题以及其他一些建议是,密钥仍然会存储在应用程序代码中。你建议如何解密密码?如果手动输入主密钥,则主密钥可以工作,但这只是第二个最佳选项。最好不要将密码存储在版本控制中,即使是加密的。但是,拥有主密钥可能是第二个最好的选择,只要凭证的方式仅允许帐户需要访问的内容(如果不需要更新或删除,则选择,例如,仅在需要的表上选择),这一主题就非常好。