问题描述
在开发Web应用程序时,遵循最佳实践通常意味着将配置和敏感数据与源代码分开 – 比如访问密钥、连接字符串等。可以使用像 .env
文件这样的方式为开发、测试和生产环境设置不同的连接字符串。然而,另一个关键点是基础设施即代码,而这似乎与不存储/硬编码敏感数据相冲突。自动化部署新环境时,必须指定一系列环境变量 – 这些变量似乎需要在代码中定义。
如何调和这两个看似相互矛盾的标准实践?
解决方案
在解决这个问题时,有几种方法可以选择。
方案1:使用密钥存储工具
可以使用集中式的密钥存储工具来管理敏感数据,这样每个服务器都可以从中读取。例如,Hashicorp Vault 是一个常用的选择。同时,还有一些键值存储可以提供类似的功能,比如 AWS Parameter Store。
在这种方法中,你可以手动将数据存储在这些工具中,或者将其加密后存储在Git中。使用像 kops(仅限AWS)或 ejson(供应商无关)这样的工具,可以将密钥存储在与应用程序相同的代码库中。然后,应用程序可以在部署时获取所有密钥,或者只获取解密密钥以加载加密文件。
方案2:使用Pillars或Hiera
对于基于配置管理的方法,可以使用Pillars(SaltStack)或Hiera(Puppet)来管理数据。这允许你将数据与代码分开存储,并在运行时将这些值填充到代码中。
在SaltStack中,可以使用Pillars来管理数据。Pillar数据将针对每个minion进行独特计算,并仅通过标准SSL加密从服务器直接发送到minion,以确保数据的安全性。
在Puppet中,Hiera可以用于类似的目的。这允许你将代码和元数据分开存储,然后在你的清单中引用Hiera值,从而允许代码在运行时填充这些值。
结论
解决将环境配置与基础设施即代码相协调的问题,可以使用密钥存储工具来保护敏感数据,并使用Pillars或Hiera等配置管理工具来将数据与代码分开管理。这样可以实现敏感数据的安全管理,并确保代码和元数据的分离。
请注意,根据实际情况,你可以选择适合你团队和项目的最佳实践。同时,确保对敏感数据的处理和传输采取适当的安全措施,以保护你的应用程序和基础设施免受风险。