现代AI时代的安全保障。
没有安全层是完美的。airgap 仍处于实验阶段。欢迎贡献!
airgap 启动一个目标程序(例如 AI 编码助手)在其自己的挂载命名空间中,并透明地将秘密替换为经过处理(脱敏)的版本。在 airgap 下运行的程序仍然可以读取和修改受保护的文件,但它永远看不到实际的秘密。目前 airgap 保护以下内容:
.env 和 .env.*(例如 .env.local、.env.production)——通过文件名匹配。值被脱敏为 <redacted value>,而键保持可见;对文件的编辑、添加和删除操作会被持久化回真实文件。BEGIN/END 标记保留。.npmrc——通过文件名匹配。认证令牌和密码值(_authToken、_auth、_password,包括针对注册表的 //registry/:_authToken 形式)被脱敏为 <redacted value>,而注册表、作用域、email 和注释保持可见;对文件的编辑会被持久化回真实文件。未来会添加更多秘密类型。
这些脱敏操作会应用于工作目录或家目录($HOME)下的任何位置——因此项目的 .env 和 ~/.ssh 密钥都涵盖在内。匹配是动态的:在启动后创建的文件也能被捕获。
比较不使用和使用 airgap 时 .env 的内容:
$ cat .env
API_KEY=sk-live-9f8c2a1b4e7d
DB_PASSWORD=hunter2
$ airgap cat .env
API_KEY=<redacted value>
DB_PASSWORD=<redacted value>
与 AI 智能体配合使用:
$ airgap claude
show me ./test/fixtures/.env contents
Read 1 file
Here's the file:
DATABASE_URL="<redacted value>"
API_KEY="<redacted value>"
AWS_SECRET_ACCESS_KEY="<redacted value>"
DEBUG="<redacted value>"
...
另一层防御针对恶意包:airgap 在访问意外文件时请求你的许可——例如恶意 npm install 脚本进行的操作。
当门控激活时,airgap 会要求你允许或拒绝每个新文件的首次读取。批准一个文件只授予对该文件的访问权限;决定在本次运行期间有效。每个包管理器都有一个预批准的文件列表。
例如,安装一个恶意包,其 postinstall 脚本试图读取你的 SSH 密钥和 .env:
$ airgap npm install
...
airgap: npm wants to read the file /home/you/.ssh/id_rsa — allow? [y/N] n
airgap: npm wants to read the file /home/you/.env — allow? [y/N] n
回答 n 拒绝访问。
airgap 依赖挂载命名空间和 FUSE 覆盖层,这些是 Linux 的特性。cargo install airgap
airgap <program> [args...]
airgap 运行 <program> 并传递 [args...],原封不动地传递 argv、环境变量和工作目录。当 <program> 退出时,airgap 以相同的退出码退出。
要始终在 airgap 下运行你的 AI 智能体,请在 shell 配置(~/.bashrc、~/.zshrc 等)中设置别名:
alias claude="airgap claude"
alias opencode="airgap opencode"
现在 claude(或 opencode)透明地在 airgap 内运行。
在 airgap 下运行你的包管理器,以防范恶意安装脚本。或者在 shell 配置中设置别名:
alias npm="airgap npm"
如果你想报告安全问题或提出问题,请发送邮件至 [email protected]。