文档 / 安全
凭据保险库
Yuli 会找出项目中散落的 .env、密钥和令牌,并建议把它们加密保存到仓库之外,同时不影响运行。
Yuli 会检测项目中散落的凭据(根目录下的 .env、私钥、.npmrc 中的令牌、服务账号、直接写在代码里的机密……),并建议把它们保存到 仓库之外的加密保险库 中。未经你确认,任何东西都不会被移动。
检测哪些内容
| 类型 | 示例 |
|---|---|
| 环境 | .env、.env.local、.env.production……模板 .env.example、.env.sample 和 .env.template 不计入。 |
| 密钥和密钥库 | *.pem、*.key、*.p12、*.pfx、*.jks、id_rsa、id_ed25519 |
| 工具凭据 | JSON 服务账号、credentials.json、带令牌的 .npmrc、.yarnrc 或 .pypirc、.aws/credentials、kubeconfig、Docker 的 config.json、*.tfvars、.netrc、.git-credentials、.pgpass |
| 代码 | 直接写在源代码中的机密 |
每个发现都会标明它在 git 中的状态。以下情况会被标记为更严重:
| 徽章 | 含义 |
|---|---|
| Git 正在跟踪 | 该文件已纳入版本控制。 |
| 未在 .gitignore 中 | 该文件没有被忽略:下一次 commit 可能会把它提交上去。 |
| 在 git 历史中 | 它曾经被提交到仓库。 |
“凭据暴露”卡片
当 Yuli 发现问题时,会出现 凭据暴露 卡片。对每个发现,你可以选择:
- 移到保险库(推荐):Yuli 把它加密复制到保险库,校验副本,确认无误后才删除原文件。它会创建一个键值为空的
.env.example,并把相应模式添加到.gitignore。 - 保持现状:留在原处。填写 原因 并点击 记住,之后就不会再询问。
- 打开:在编辑器中打开它。
被移动的文件随时都可以 恢复。
逐步移动 .env
如果文件 曾被提交到 git,仅仅移动它是不够的:机密仍然留在历史中。Yuli 会提醒你必须 轮换 它(更换密码或令牌),并告诉你如何用 git filter-repo 清理历史。Yuli 绝不会 自行改写历史。
存放位置与加密方式
| 默认位置 | <configuración>/yuli-ide/vault/<id-del-proyecto>/,位于你用户的配置文件夹中,不在任何项目内 |
| 权限 | 仅限你本人:macOS 和 Linux 上为 0700/0600,Windows 上为针对你用户的 ACL |
| Windows 上的加密 | DPAPI |
| macOS 和 Linux 上的加密 | AES-256-GCM,主密钥保存在系统钥匙串中 |
如果系统无法提供这种保护,Yuli 不会移动任何东西。
你可以通过 更改位置… 选择其他文件夹(例如外部磁盘),只要它位于项目和任何 git 仓库之外即可。
选项
在 全局选项 › 安全 › 凭据保险库 中:
| 选项 | 作用 |
|---|---|
| 更改位置… | 为保险库选择其他文件夹。 |
| 注入 | 把保险库中的变量传给运行进程。默认注入 .env、.env.local 和 .env.development。 |
| 运行时生成文件 | 在运行期间写入一个临时 .env。 |
| 添加变量 | 直接向保险库添加一个新变量。 |
| 在项目中创建 .env.example | 生成键值为空的模板。 |
| 显示 | 将某个值显示 20 秒。 |
你的项目照常运行
运行时(运行配置、任务和集成终端),Yuli 会把保险库中的变量作为环境变量注入。dotenv 库会遵从它们,因为真实的环境变量优先。
如果你的工具需要磁盘上的文件,请开启 运行时生成文件:Yuli 只在运行期间写入一个临时 .env(权限 0600,被 git 忽略),并在运行结束时删除。
至于 AI 智能体
智能体(Claude Code、Kiro、Codex、Antigravity、Copilot 和 Yuli 聊天)永远看不到这些值。智能体的 hooks 会拒绝访问保险库文件夹;如果某个值出现在终端输出中,也会被遮蔽。
不过,智能体可以借助两个不返回任何值的工具帮你找到问题:
| 工具 | 作用 |
|---|---|
yuli_vault_findings |
只读:路径、类型、严重程度、git 状态、变量的 名称,以及保险库中已保存的内容。绝不返回值。 |
yuli_vault_propose_move |
向你显示 Yuli 的卡片,列出它建议移动的文件及原因。它不会移动任何东西:由你在卡片上决定。 |
这样,智能体可以说“根目录下有一个 .env,要把它移到保险库吗?”,但永远无法读取它。另请参阅机密与隐私。