英文原文:Environment Variables Considered Harmful for Your Secrets
为了轻松访问运行在生产环境里的代码,存储你的密钥是一项有挑战的任务。对于这些密钥,我意思是,例如用于访问第三方 API 的 keys、用于加密/签名 cookie 的 keys、哈希用户密码等等。如果你的生产密钥落入了坏人之手,将产生可怕的影响。你想牢牢地控制访问密钥的方式和时间。
我们很可能对怎样不去存储密钥持相同意见,那就是:在你的代码,或与你代码相同的源代码库里。通常,有太多人或第三方服务可以(潜在地)访问你的代码库,他们不需要(也不应该)知道你的生产环境密钥。
关于如何架构现代 web 应用程序的一个优秀文档是 The Twelve Factor App。它列举了每个 web 开发人员应该了解的 12 项原则(他们称之为要素)。“Config”一章提到了:“在环境里存储 config”。虽然我同意操作系统环境是总体配置的好场所,但是,我还是不能推荐它用于保存隐私。
当你在环境里存储密钥时,你仍然有可能偶然地暴露它们——这恰恰是我们想避免的。
让我们仔细看一下环境和环境变量。这是任何操作系统都有的一个特性,你可以用来托管 web 应用,包括 Linux、Mac OS 和 Windows。环境变量已经被用于系统配置了,被设计成从父进程向其子进程传递配置。一个子进程默认继承了来自于其父进程的、所有环境变量(被叫做环境)的拷贝。
根据环境的这些属性,问题就在于它在什么时候存储密钥:
这样我们的解决方案一直是使用一个配置文件,有服务器配置管理软件(我们的例子中是个大厨)管理。这样,我们就能在代码库外面存储密钥,通过使用配置服务器的相同软件来管理它们。这种解决方案虽然不是最好的,但是不会把密钥暴露给子进程,这种方案需要显式地访问,也表达了开发人员应该如何与之协作。
但是不管你选择哪种方案,要当心就你如何使用密钥的不同警告。
— END —
译文: 《对隐私有害的环境变量 》 腊八粥