我弃用了 dotenv 转向 Varlock(这就是原因)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00这是 Valor,一款用于管理环境变量的开源工具,它能让你
00:00:04再也不用在磁盘上存储明文机密信息。它的工作原理是
00:00:10在本地或通过 1Password、Bitwarden、AWS 等密码管理器解析环境变量。
00:00:16通过使用类型安全架构,它会在运行时将机密注入你的应用程序,
00:00:21使你的 .env 文件对于 AI 甚至是公开提交到 GitHub 都是安全的。但它究竟是如何运作的,
00:00:27这种奇怪的语法又是怎么回事?点击订阅,让我们开始深入了解。
00:00:31有多少次当你开始一份新的开发工作,拿到了代码并尝试在本地运行,
00:00:39却发现因为它无法运行,仅仅是因为你缺少了需要从另一位开发者
00:00:45或某种加密存储中获取的 .env 文件?而且每次 .env 文件更新时,
00:00:50你都得一遍又一遍地重复这个过程。这正是 Valor 致力于解决的问题,同时也为了解决
00:00:56提示词注入的 AI 代理获取了它们本不该访问的机密信息的问题。让我们来看看它是如何运作的。
00:01:02这里有一个我一直在开发的小项目,它能通过 Twitter 视频生成文章,
00:01:06使用 OpenAI 的 Whisper 来转录视频,并使用 Claude 来撰写文章。
00:01:12但我们要先从简单的开始,使用 Valor 来更改端口号。安装好 Valor 后,
00:01:17我们应该有一个目前为空的 .env 架构文件。这将是
00:01:23我们所有环境变量的唯一事实来源,并且可以提交到 GitHub 的公共仓库中。
00:01:28我们首先添加一个简单的 appenv 环境变量,并将其值设为 “testing”。
00:01:33现在我可以新建一个标签页来运行 varlock load,这将验证我们的架构。现在
00:01:39我们可以看到它读取了我们的环境变量,并将其设为 “sensitive”(敏感)。
00:01:43这是因为 varlock 中所有的环境变量默认都被设为敏感,但我们可以更改这一点。
00:01:48在这个文件中,我要添加第一个装饰器,它将是一个 root(根)装饰器,
00:01:52因为它会影响文件中所有的环境变量,我们将 default sensitive 设置为 false。
00:01:56注意这里的语法前面有一个井号,通常根变量会用分隔符隔开。
00:02:02现在整个文件使用一种名为 mspec 的特定领域语言,
00:02:08这是 varlock 团队编写的开放规范。现在如果我再次验证架构,我们就能看到
00:02:14环境变量的具体数值了,因为它不再被标记为敏感。但我们还可以
00:02:19在架构文件中做其他很酷的事情,比如给环境变量指定类型。所以
00:02:24我会给它一个 string 类型,这意味着一切仍然正常;但如果我把它改成
00:02:29number 类型,我们可以看到报错了,因为它期望得到的是字符串。我还可以
00:02:33给它添加 required(必填)装饰器,然后删除这些文本,这意味着如果我们检查文件,就会报错,
00:02:39因为它需要一个值。这些被称为项装饰器,你可以在
00:02:44varlock 文档中找到它们的完整列表以及所有可用类型。现在让我们添加另一个
00:02:50环境变量,这次我们叫它 port,值为 3002。我可以给它
00:02:55一个 port 类型。我还要在上面把这个设为敏感,并将这个改回
00:03:01string 类型。现在它识别出了我们的两个环境变量,并因为敏感设置隐藏了这一个。
00:03:05那么,我们该如何将这些值注入到应用程序中呢?我们只需要运行
00:03:10varlock run,后面跟上运行应用程序所需的脚本。如果我们查看 package.json 文件,
00:03:15可以看到我们需要运行 vite 命令来启动前端。所以现在如果我运行 varlock run
00:03:21加上 vite 命令,它就会加载配置、进行解析,然后将其注入到我们的
00:03:27环境变量中,这正是它所做的。因为现在端口是 3002,这在我们的代码中是可行的,
00:03:33因为它会首先检查目前由 varlock 注入的 port 环境变量。
00:03:38这个脚本不一定非得是 JavaScript 文件,因为 varlock 适用于任何项目,
00:03:43Python、Go、Rust,随你挑,一切都会如预期般运作。如果你不想
00:03:48通过 npm 安装,还有一个 varlock CLI,用法完全一样。这些对于
00:03:54本地环境变量来说都很棒,但现在让我们来看看从 1Password 获取变量的过程,
00:03:59而不是使用我 shell 里的本地变量来存放像 OpenAI 和 Anthropic API 密钥这样的东西。
00:04:05我个人并不使用 1Password,我只是为了制作这个视频注册了一个试用版。但如你
00:04:11所见,我创建了一个新保险库(Vault),这非常重要,我稍后会解释原因。在这个
00:04:16保险库里,我们有两个项目:一个是 OpenAI API 密钥,一个是 Anthropic API 密钥。
00:04:24我不介意展示它们,因为它们完全是编造的;如果我揭示它,你会看到这并不是真实的 API 密钥。
00:04:30为了在 varlock 架构中获取这些值,我们首先需要安装 1Password 插件。
00:04:36请注意,varlock 的插件可以添加它们自己的根装饰器和项装饰器,所以你可能会在这里看到
00:04:42一些文档中没有的新装饰器,例如这个 init one password 装饰器。所以在
00:04:49安装完 varlock 1Password 之后,我们可以加载包含刚刚安装的插件的根装饰器,
00:04:55并运行 init one password 装饰器。我现在需要的只是这个令牌,
00:05:01我可以从这里加载。为了获取这个令牌,你确实需要将其连接到一个新保险库,
00:05:06而不是你的个人保险库。你可以在开发者服务账号中找到它,然后按照步骤
00:05:11创建一个令牌。由于我会在这个视频之后删除我的令牌和 1Password 账号,
00:05:15所以我不介意展示它。我将给它一个 one password service token 类型,它被设置为
00:05:21敏感,并且是来自该插件的一种类型。你可能还注意到这个文件
00:05:26没有任何语法高亮,这是因为 varlock 团队虽然创建了一个支持它的 VS Code 插件,
00:05:32但目前还没有针对 Neovim 的插件,这意味着我将来可能会创建一个,或者直接让 Claude 来做。
00:05:37现在我要创建一个名为 openai api key id 的新环境变量,
00:05:43为了从 1Password 获取它,我必须运行 one password 函数,
00:05:49后面跟着这个协议,然后我需要添加我的保险库名称(test),
00:05:55项目名称(openai),然后是字段名称。如果我们再次核对,可以看到这里是
00:06:02credential。我也可以将其设置为敏感。现在如果我们运行 varlock load,它需要几秒钟
00:06:08从 1Password 获取我的 OpenAI API 密钥。我们可以通过更改这里的
00:06:14值(比如 1234)来检查它是否在工作。如果我们再次运行 varlock load,它会获取正确的
00:06:20数值。大功告成,我们的 env 架构文件现在可以放心提交了。但我知道你在
00:06:25想什么:这个 1Password 令牌安全吗?说实话,如果你是在
00:06:31本地开发并且安装了 1Password,你可能已经安装了桌面版应用或者正在使用命令行。
00:06:38在这种情况下,你可以使用这种配置来通过指纹解锁 1Password,而不是使用
00:06:431Password 令牌。但 varlock 还支持其他插件,比如 AWS、GCP 甚至是 Bitwarden,
00:06:52以及许多其他集成,包括 Vite、Next.js 和 Cloudflare Workers。还有
00:06:57很多其他功能我还没来得及介绍,比如根据你的架构生成 TypeScript 类型,
00:07:03从其他文件导入环境变量,甚至可以从日志和传出的 HTTP 响应中
00:07:08脱敏敏感输出,这是一个非常贴心的设计。甚至还有一个 MCP 服务器来
00:07:15帮助你的编程代理自动为你设置 env 架构,还有一个 GitHub Action
00:07:21在 CI/CD 流程中加载并验证你的环境变量。但尽管 varlock 很酷,
00:07:27它还是有一些问题的。例如,你无法离线使用它;如果你在机场写代码,
00:07:32你就必须使用硬编码的环境变量。但老实说,现在谁写代码不联网呢?
00:07:37另外说到网络,从不同的供应商获取密码时会有一定的延迟,
00:07:41所以启动脚本会稍微慢一点。此外,
00:07:46它还缺乏对 Dashlane 等其他供应商的支持。而且我确实遇到了一个奇怪的 bug:如果我在
00:07:53架构文件中使用了与本地 shell 环境变量相同的名称,它就会优先使用本地的环境变量,
00:07:59而不是 1Password 中的那个。但 varlock 正在积极开发中,
00:08:05我相信很多这类问题将来都会得到解决。尽管如此,
00:08:10目前这个产品对我来说仍然非常有用,我想我之后所有的
00:08:16个人项目都会使用它,甚至如果以后有办法的话,用 varlock 架构文件
00:08:21取代我本地的 shell 文件。我真心希望能实现,因为我不想让任何 AI 代理
00:08:26搜刮到我的信息。

Key Takeaway

Varlock 通过类型安全的架构文件和第三方加密存储集成,为开发者提供了一种比传统 dotenv 更安全、更高效且可提交至版本控制系统的环境变量管理方案。

Highlights

Varlock 是一款开源的环境变量管理工具,旨在取代传统的 .env 明文存储方式。

采用类型安全架构,支持从 1Password、AWS、Bitwarden 等密码管理器动态注入机密信息。

使用名为 mspec 的领域专用语言(DSL)来定义环境变量的架构、类型和敏感性。

提供运行时注入功能,兼容 Node.js、Python、Go、Rust 等多种编程语言和框架。

具备自动脱敏日志、生成 TypeScript 类型以及 GitHub Action 集成等高级开发者特性。

解决了团队协作中 .env 文件缺失和 AI 代理可能导致机密泄露的安全性问题。

Timeline

Varlock 核心概念与痛点解决

视频开头介绍了 Varlock 作为一款开源工具,其核心价值在于消除磁盘上的明文机密存储。它通过在运行时从 1Password 或 AWS 等管理器注入变量,解决了开发者在交接项目时经常遇到的 .env 文件缺失问题。这种机制不仅提高了开发效率,还能有效防止 AI 代理通过提示词注入获取敏感信息。作者强调了 Varlock 的类型安全架构是其区别于传统方式的关键。通过这种方式,原本敏感的 .env 架构文件现在可以安全地提交到 GitHub 等公共仓库中。

基础配置与 mspec 语法入门

作者通过一个简单的 Web 项目演示了如何安装和初始化 Varlock,并引入了名为 mspec 的特定领域语言。在架构文件中,开发者可以使用装饰器来控制变量的行为,例如使用 root 装饰器将全局默认敏感度设为 false。通过 varlock load 命令,用户可以验证架构并查看解析后的变量值。如果变量被标记为敏感,其具体数值将在终端输出中被隐藏。这一小节展示了 Varlock 如何通过简洁的语法实现对环境变量的精细化访问控制。

类型安全与应用注入实战

这一部分重点展示了 Varlock 的类型校验功能,支持将变量定义为 string、number 或特定的 port 类型。如果输入值与定义的类型不匹配,工具会立即报错,这种强制校验极大地减少了运行时的配置错误。作者随后演示了使用 varlock run 命令启动 Vite 开发服务器,将变量动态注入到应用程序中。值得注意的是,Varlock 并不局限于 JavaScript 环境,它同样适用于 Python、Go 和 Rust 等任何开发语言。这种跨平台和强类型的特性使其成为现代后端和前端开发的理想选择。

集成 1Password 远程机密管理

作者深入讲解了如何通过插件系统从 1Password 获取真实的 API 密钥,如 OpenAI 和 Anthropic 的凭据。演示过程中展示了如何配置服务令牌以及使用特定的函数语法来引用保险库(Vault)中的字段。虽然目前某些编辑器如 Neovim 尚缺少语法高亮支持,但 VS Code 用户已有现成的插件可用。通过 varlock load 实时获取云端数据,确保了本地开发环境不需要存储任何真实密钥。这种集成方式证明了 Varlock 在处理生产级敏感数据时的强大灵活性和安全性。

高级特性、局限性与未来展望

在视频的最后,作者讨论了 Varlock 的高级功能,包括日志脱敏、自动生成 TS 类型以及 MCP 服务器支持。同时也坦诚地指出了目前的局限性,例如对离线环境的不友好、网络延迟导致的启动稍慢以及某些供应商支持的缺失。作者还分享了一个关于本地 shell 变量优先级高于架构文件的奇怪 bug,但对其积极的开发进度表示乐观。尽管存在小瑕疵,作者仍决定在未来的所有个人项目中使用 Varlock,以保护隐私并提升工作流。他认为这种全新的变量管理范式代表了未来开发工具的发展方向。

Community Posts

View all posts