← 返回博客 Mot

Mot

什么是 .env.vault 文件

它是一个 .env 文件的加密副本。

如果你生成一个,就最容易理解了。所以我们来做一下。然后我会告诉你如何在生产中使用它。最后,我们将讨论它的安全优势。

在本博文中的完整 代码示例在 GitHub 上

生成

我们将使用命令 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"

太棒了!它正在成功解密。接下来,让我们在生产中使用它。

生产

  1. 提交 .env.vault 到代码
  2. 在服务器上设置 DOTENV_KEY
  3. 部署你的代码

在运行时,你的加密密钥将在恰当的时候被注入到你的代码中。

用这个简单的例子在你自己的机器上试试。

$ 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 账户。它是免费的,并提供高级功能。

https://dotenv.org/signup

通过 RSS 订阅 或关注我们 @dotenvx 𝕏