什么是 .env.vault 文件
它是一个 .env
文件的加密副本。
如果你生成一个,就最容易理解了。所以我们来做一下。然后我会告诉你如何在生产中使用它。最后,我们将讨论它的安全优势。
生成
我们将使用命令 npx dotenv-vault local build
。
先决条件
进入一个你已经拥有 .env.*
文件并已安装 dotenv 的项目。
例如,我有一个包含 3 个文件的项目。
- index.js
- .env
- .env.production
// index.js
require('dotenv').config()
console.log(`Hello ${process.env.HELLO}`)
# .env
HELLO="development"
# .env.production
HELLO="production"
当我运行 node index.js
时,我得到了预期的输出 Hello development
。
$ node index.js
Hello development
让我们构建 .env.vault
文件。
生成 .env.vault
运行 **local build** 命令。
$ npx dotenv-vault local build
你会看到一个 .env.vault
文件,它看起来像这样。
#/-------------------.env.vault---------------------/
#/ cloud-agnostic vaulting standard /
#/ [how it works](https://dotenv.org/env-vault) /
#/--------------------------------------------------/
# development
DOTENV_VAULT_DEVELOPMENT="AtEC33ZfFJQMSE6C+EBX8nzTyQzfC+xhsIfGjyWr47jiHsUi07PHzX2/RmCB0PIi"
# production
DOTENV_VAULT_PRODUCTION="t9van8HefnTIHVlK3vQ6WYLtWEOvPunEnOphV3Hw3aBTBDuwLq22yU0Tdl5fAnk="
它包含两个键。
DOTENV_VAULT_DEVELOPMENT
DOTENV_VAULT_PRODUCTION
这些包含了以下内容的加密副本:
- 你的
.env
文件 - 你的
.env.production
文件。
还生成了一个 .env.keys
文件。这些密钥用于解密 DOTENV_VAULT_${ENVIRONMENT}
的内容。
$ npx dotenv-vault local keys
#/!!!!!!!!!!!!!!!!!!!.env.keys!!!!!!!!!!!!!!!!!!!!!!/
#/ DOTENV_KEYs. DO NOT commit to source control /
#/ [how it works](https://dotenv.org/env-keys) /
#/--------------------------------------------------/
DOTENV_KEY_DEVELOPMENT="dotenv://:key_f4516b0077d9aefad9fa7b36cec570e05dcb7cd6d5de1dac2562b6421af7d185@dotenv.local/vault/.env.vault?environment=development"
DOTENV_KEY_PRODUCTION="dotenv://:key_18a137f844e3511022dbf1de2b1bd5e3bd6d1ef4c78988e2521ce9f05abc506a@dotenv.local/vault/.env.vault?environment=production"
**看到规律了吗?** 一个 .env.${ENVIRONMENT}
文件对应于一个 DOTENV_VAULT_${ENVIRONMENT}
密钥和一个 DOTENV_KEY_${ENVIRONMENT}
解密密钥。
尝试解密 DOTENV_VAULT_PRODUCTION
的内容。
$ npx dotenv-vault local decrypt 'dotenv://:key_18a137f844e3511022dbf1de2b1bd5e3bd6d1ef4c78988e2521ce9f05abc506a@dotenv.local/vault/.env.vault?environment=production'
HELLO="production"
太棒了!它正在成功解密。接下来,让我们在生产中使用它。
生产
- 提交
.env.vault
到代码 - 在服务器上设置 DOTENV_KEY
- 部署你的代码
在运行时,你的加密密钥将在恰当的时候被注入到你的代码中。
用这个简单的例子在你自己的机器上试试。
$ DOTENV_KEY='dotenv://:key_18a137f844e3511022dbf1de2b1bd5e3bd6d1ef4c78988e2521ce9f05abc506a@dotenv.local/vault/.env.vault?environment=production' node index.js
[[email protected]][INFO] Loading env from encrypted .env.vault
Hello production
如你所见,它从你加密的 .env.vault
文件加载你的环境变量,并成功输出 Hello production
。优雅!
(其他语言也支持。参见 dotenv.org/docs)
安全优势
你还记得 CircleCI 数据泄露事件 吗?攻击者获得了对所有人的环境变量的访问权限,使他们的软件产品面临重大风险。
但是,如果你使用的是 .env.vault
文件,你就不会有风险。为什么呢?
攻击者只能访问环境变量,而不是代码。他拥有你的 DOTENV_KEY
,但没有你的 .env.vault
文件。他需要两者才能访问你的密钥。
这将 十二要素应用程序 的“严格分离配置和代码”原则提升到一个新的水平——即使你的配置也是分离的。
这带来了一些很棒的二阶效应。
- 你不再将密钥散布到多个第三方和工具中
- 你的密钥更容易集中管理,靠近你的代码,这意味着更小的误操作或忘记设置密钥的几率
- 你增加了攻击者的难度,并减少了自己的操作难度——不再需要在多个服务器上辛苦地管理密钥
我鼓励你尝试使用 .env.vault
文件。我认为在最初的适应期之后,你会喜欢上它们。它们是简单的文件,不需要任何额外的秘密管理器进程来保持运行。
.env
文件简单、实用,并增加了额外的安全保障。.env.vault
文件保持了同样的精神,同时增加了更高的安全级别。你对此有什么想法,请在 @dotenvx 或 @motdotla 告诉我。
dotenv-vault — 一个用于 .env 和 .env.vault 文件的秘密管理器。
如果你想在更庞大的团队中管理 .env
和 .env.vault
文件,并具备权限、版本和历史记录,那么可以创建一个 Dotenv 账户。它是免费的,并提供高级功能。