开发Web应用程序时,并尝试遵循通常认为的最佳做法,例如12个因素的应用程序方法论等。一个关键概念是将配置和敏感数据保留在源代码之外-访问密钥,连接字符串等。使用类似.env的文件为开发,测试和生产环境设置不同的连接字符串。 br />
但是,另一个关键点(不确定在12因子应用程序中是否提到过)似乎是“基础结构即代码”。我完全看到了这样做的好处,但是,我看不到如何与不存储/硬编码敏感数据相协调。为了完全自动化新环境的供应,必须指定一系列env变量-在代码中...

如何协调这两个看似矛盾的标准实践?

我当前的做法是这样的:


托管Git Repo,但有许多dev分支和一个master分支
当dev分支与在master分支中,CI生成被触发,这将生成项目并运行单元测试和集成测试。
git repo也有一个生产分支,当将master合并到生产中时,将运行相同的构建,但是如果成功,则会创建CD发行版。 (在我的情况下,这是对Azure App Service的部署)生产应用程序服务。目前,在本地我们有一个.env文件,该文件未检入git repo。在CI服务器上,将NODE_ENV值设置为test,因此代码使用硬编码的单元测试值(不敏感)。然后在生产中,我们在应用程序服务设置中手动设置连接字符串等。我觉得这可能是个问题。

因此,可能我可以在仓库中添加一个包含Terraform代码的基础结构文件夹,然后作为发布过程的一部分,terraform计划可以查看是否需要在代码的基础结构和实际基础结构之间进行任何更改(如果是, ,执行它)。但是我应该在哪里存储生产环境变量?

评论

通常的解决方法是使用领事,金库等秘密存储之王。这样,您的机密不会与代码一起存储,而是在单独的系统上处理(当然需要备份)

#1 楼

与往常一样,有几种方法可以解决此问题。

您可以使用中央源来保存每台服务器从ala Hashicorp Vault读取的机密。尽管很流行,但由于它相当复杂,因此不是我首选的方法。有很多键值存储区可以提供类似的功能,例如AWS Parameter Store。

您可以手动将数据放入这些存储区和/或将其加密存储在git中。使用kops(仅适用于AWS)或ejson(与提供商无关)之类的工具,您可以在与该应用程序相同的存储库中拥有秘密。然后让该应用程序在部署时获取所有机密,或者仅获取解密密钥,以便它可以加载加密的文件。

评论


旁注-kops从其链接不再仅限于AWS:计划在alpha和其他平台中使用GCE和VMware vSphere

–丹·科尼莱斯库(Dan Cornilescu)
17年9月2日,下午2:38

好的,是否有可能在我的terraform配置中创建一个Azure密钥库,然后将我的应用程序服务配置为被批准可以访问sql凭据? (我目前在terraform配置中的资源组中创建了sql服务器,数据库和应用程序服务)。这样,我可以安全地只调用代码中的密钥库,但是它仅在生产环境中有效吗?

–乔治·爱德华兹
17年9月16日在12:26

换句话说,如果我有一个以terraform指定的SQL Server,则必须输入其用户名和密码,以创建密钥库密钥,还必须指定密钥(SQL密码)。我该如何解决

–乔治·爱德华兹
17年9月16日在13:20

不要使用Terraform对其进行管理。管理机密需要通常专用于该任务的工具,而Terraform则不是。我没有使用过Azure的任何建议

–机器人
17年9月16日在22:23

#2 楼

这是配置管理中的一个常见问题,尽管我不能像Chef那样为Chef发言,但我可以告诉您Puppet和SaltStack如何解决这个问题。 ,这种区别在解释型语言中变得不那么重要了,因为在配置文件中包含此敏感数据与在解释后的文本文件中包含(并且我不知道任何编译的配置管理系统)之间没有太大区别)

但是第二,Puppet和SaltStack都可以,因此您可以简单地使.env文件等效,并像处理应用程序一样包含它。但是不推荐使用此方法。相反,SaltStack建议您使用支柱来管理此数据,这些数据与代码分开存储(称为“状态”)。此支柱数据是针对每个小兵唯一计算的,并且仅使用标准SSL加密仅从服务器直接发送到小兵-因此一个小兵无法看到其他人的支柱数据。实际上,奴才无法编辑支柱数据,并且绝对不能在服务器上重写支柱数据-此数据仅是单播。这使您可以分别存储代码和元数据。然后,您将使用变量/函数调用在盐状态下的支柱或清单中的heira值,从而允许您的代码在运行时填充这些值。

评论


问题是关于webapp的,没有提到配置管理工具。虽然可以使用配置管理,但您根本没有提到加密实现,例如hiera-gpg

–机器人
17 Sep 2 '17 2:41



@Robo-甚至必须配置基础结构-并且可以使用配置管理工具进行配置。例如,Puppet和Salt具有用于管理负载均衡器的插件。思科的ACI架构有一个人偶代理,并且有一个用于VMWare NSX的人偶模块,或者您可以使用Cisco NSO来管理一系列设备。

–詹姆斯·谢威(James Shewey)
17年9月2日,下午2:58

您可以使用这些,AWS等来管理Open Stack。而且,即使没有模块,也可以通过使用ruby或python分别创建并创建模块来配置任何具有API的模块。构建配置管理工具是为了配置基础结构,而不仅仅是服务器。是的,我没有提到hiera gpg,因为OP要求分离数据而不是加密数据。但这仍然是一个值得注意的重点。您还可以加密元数据,而不仅仅是将其单独存储。

–詹姆斯·谢威(James Shewey)
17年9月2日,下午3:02