GuthL/KeyClaw

GitHub: GuthL/KeyClaw

本地 MITM 代理,在机密信息发送到 LLM API 之前实时检测并替换,防止凭证泄露。

Stars: 3 | Forks: 0

KeyClaw wordmark

一个本地 MITM 代理,可在机密信息离开你的设备之前将其从 LLM 流量中剥离。

在设备本地保留 API keys、云凭证和私有 token,同时让 Claude Code、Codex 以及兼容代理感知的 API 客户端继续正常工作。

CI Crate version License Rust version

快速入门 · 工作原理 · 为什么选择 KeyClaw? · 文档 · 贡献指南

KeyClaw 位于你的 AI 工具和上游 API 之间,检测出站 payload 中的机密信息,将其替换为确定性占位符,将映射关系存储在加密的本地 vault 中,并在响应返回时重新注入真实值。模型永远不会看到原始机密,但你的工作流表现依然如常。 ## 为什么它很重要 - AI 编码工具非常擅长读取那些你希望它们忽略的文件。 - 机密扫描器只能在事后捕获泄露;KeyClaw 则在实时请求穿越网络之前对其进行保护。 - 你不需要封装 SDK、提示词纪律或单独的托管服务即可将凭证排除在模型提示之外。 ## 架构 ``` +-----------------------------------+ | Claude Code / Codex / Client | +-----------------+-----------------+ | outbound request v +-----------------------------------+ | KeyClaw local proxy | | | | 1. Detect secrets in body | | 2. Replace with placeholders | | 3. Store mapping in vault --+ | | | | +-----------------+------------+----+ | sanitized | v request | +-----------------------------------+ | OpenAI / Anthropic / API | +-----------------+-----------------+ | response | v | +-----------------------------------+ | Resolve placeholders back <----+ | (HTTP, SSE, WebSocket) | +-----------------+-----------------+ | v +-----------------------------------+ | Claude Code / Codex / Client | +-----------------------------------+ ``` ## 适用工具

Claude Code ChatGPT OpenAI API Anthropic API

KeyClaw 首要构建用于与 OpenAI 或 Anthropic 风格的 HTTPS API 通信的本地开发者工具。目前验证通过的路径包括: | 工具 | 路径 | 备注 | |------|------|-------| | Claude Code | `keyclaw claude ...` 封装器或 `source ~/.keyclaw/env.sh` | 一流 CLI 路径 | | Codex | `keyclaw codex ...` 封装器或 `source ~/.keyclaw/env.sh` | 一流 CLI 路径 | | ChatGPT / OpenAI web 流量 | 本地代理 + 受信任 CA | 在主机层面对 `chatgpt.com` / `chat.openai.com` 在流量真正经过代理时纳入范围 | | 直接 API 客户端 | `HTTP_PROXY` / `HTTPS_PROXY` + KeyClaw CA | 已针对实际经过代理的支持主机进行验证 | 其他工具(如 Cursor、aider 和 Continue)如果通过 `HTTP_PROXY` / `HTTPS_PROXY` 路由流量并信任 KeyClaw CA,可能在通用代理模式下工作,但它们不是一流集成,目前不在测试套件覆盖范围内。 ## 60 秒快速入门 KeyClaw 尚未发布到 crates.io,因此目前最快的 `cargo install` 路径是通过 Git: ``` cargo install --git https://github.com/GuthL/KeyClaw keyclaw keyclaw init keyclaw proxy source ~/.keyclaw/env.sh ``` 这将安装 CLI,生成本地 CA 和 vault 密钥,启动分离代理,并配置当前 shell 信任并使用它。 ### Claude Code ``` keyclaw claude --resume latest ``` 或全局使用代理: ``` claude ``` ### 通用代理感知客户端 ``` source ~/.keyclaw/env.sh your-client-here ``` 对于内置 `claude` / `codex` 封装器之外的工具: 1. 运行一次 `keyclaw init` 以确保 `~/.keyclaw/ca.crt` 存在。 2. 在你的 OS 钥匙串或证书存储中信任 `~/.keyclaw/ca.crt`。 3. 通过 shell 环境变量或应用/OS 代理设置,将客户端路由至 `http://127.0.0.1:8877`。 4. 使用 `keyclaw doctor` 和真实请求验证流量确实被拦截。 ### 单终端: ``` keyclaw proxy source ~/.keyclaw/env.sh claude "scan this repo for AWS credentials" ``` ### 双终端: ``` # 终端 1 keyclaw proxy # 终端 2 source ~/.keyclaw/env.sh claude ``` `keyclaw proxy` 分离并在后台持续运行。它在 stdout 打印 `source ~/.keyclaw/env.sh`,该脚本导出 `HTTP_PROXY`、`HTTPS_PROXY`、`SSL_CERT_FILE` 及相关变量,使 CLI 工具通过 KeyClaw 路由并信任本地 CA。 启动 daemon 不会自动重新配置当前 shell。子进程无法改变其父 shell 环境,因此只有在 `source ~/.keyclaw/env.sh` 之后,当前 shell 才会通过 KeyClaw 路由。 使用以下命令管理代理生命周期: ``` keyclaw proxy status # check if the proxy is running keyclaw proxy stop # graceful shutdown ``` 在带有 `systemd --user` 的 Linux 上,你还可以让 daemon 在登录或重启后自动恢复: ``` keyclaw proxy autostart enable keyclaw proxy autostart status keyclaw proxy autostart disable ``` 自动启动仅保持 daemon 存活。Shell 仍需 `source ~/.keyclaw/env.sh` 才能将 CLI 流量路由通过它。 如果你希望代理附加到当前终端,请使用 `keyclaw proxy start --foreground`。 ## 工作原理 ### 之前:包含泄露 AWS key 的真实请求 ``` { "model": "claude-sonnet-4", "messages": [ { "role": "user", "content": "Deploy the staging stack with AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE and AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" } ] } ``` ### 之后:经 KeyClaw 处理后的同一请求 ``` { "model": "claude-sonnet-4", "messages": [ { "role": "developer", "content": "KeyClaw notice: 2 secrets were redacted before this request left the machine." }, { "role": "user", "content": "Deploy the staging stack with AWS_ACCESS_KEY_ID={{KEYCLAW_SECRET_AKIAI_77dc0005c514277d}} and AWS_SECRET_ACCESS_KEY={{KEYCLAW_SECRET_wJalr_8b4f0f2d14a8b2c1}}" } ], "x-keyclaw-contract": "placeholder:v1" } ``` 当模型在响应中回显或操作这些占位符时,KeyClaw 会在本地客户端看到最终 payload 之前将其解析回真实值。 ## 为什么选择 KeyClaw? | 方法 | 擅长 | KeyClaw 的不同之处 | |----------|----------|----------------------------| | `llm-interceptor` | 检查、分析和记录 AI 流量 | KeyClaw 旨在主动重写实时请求,通过占位符重新注入保持工作流,并在保护失效时“失败关闭” | | `gitleaks` / `trufflehog` | 扫描仓库、历史、镜像或已泄露材料以查找机密 | KeyClaw 在实时流量上内联操作,而不仅是审计文件或先前泄露的数据 | | 手动提示词卫生 | 减少明显的复制/粘贴错误 | KeyClaw 是自动化的,仍能捕获隐藏在 payload、配置或生成的请求体中的机密 | 如果你想检查 LLM 流量,`llm-interceptor` 是一个有用的邻居。如果你想从一开始就阻止原始凭证到达上游 API,KeyClaw 是更紧凑的方案。 ## 内置检测规则 KeyClaw 附带 [`gitleaks.toml`](gitleaks.toml) 中的**内置检测规则**,在启动时原生编译为 Rust 正则表达式。无需子进程或外部 `gitleaks` 二进制文件。 内置规则覆盖: - 提供商凭证,如 AWS、OpenAI、Anthropic、GitHub、GitLab、Slack、Stripe、GCP 等 - 通用赋值模式,如 `api_key=...`、`secret_key=...`、`access_token=...` - 私钥材料,如 RSA、EC、OpenSSH、PGP 和 age - 通过内置熵检测器的高熵 token 可以通过 `KEYCLAW_GITLEAKS_CONFIG` 从文件加载自定义规则。 KeyClaw 不使用或不需要 `KEYCLAW_GITLEAKS_BIN`。机密检测使用原生编译到二进制中的内置 gitleaks 规则;仅当想用你自己的 TOML 文件覆盖这些规则时才设置 `KEYCLAW_GITLEAKS_CONFIG`。 内置检测的事实来源是 `gitleaks.toml`;`src/gitleaks_rules.rs` 是这些规则的加载器/编译器。 ## 验证是否工作 ``` keyclaw doctor ``` `keyclaw doctor` 是在调试客户端本身之前,最快发现损坏的 CA 文件、代理绕过、无效的 `~/.keyclaw/config.toml`、损坏的允许列表条目、自定义规则集问题和缺失 vault 密钥材料的方法。 按以下方式解读输出: - `PASS` 表示检查已准备好正常使用 - `WARN` 表示 KeyClaw 仍可运行,但配置有风险或非标准 - `FAIL` 表示在依赖代理之前修复此项;`doctor` 以非零状态退出 - `hint:` 指向该特定检查的下一步操作者行动 ## 配置 KeyClaw 读取 `~/.keyclaw/config.toml`(如果存在),然后在其之上应用环境变量覆盖。优先级为: ``` env vars > ~/.keyclaw/config.toml > built-in defaults ``` 缺少 `~/.keyclaw/config.toml` 没问题;KeyClaw 会静默回退到环境变量和默认值。无效 TOML 被视为阻塞配置错误,`keyclaw doctor` 会明确报告。 完整配置参考请参阅 [docs/configuration.md](docs/configuration.md)。 ### 配置文件 示例 `~/.keyclaw/config.toml`: ``` [proxy] addr = "127.0.0.1:8877" [logging] level = "info" [notice] mode = "minimal" [detection] dry_run = false entropy_enabled = true entropy_threshold = 3.5 [audit] path = "~/.keyclaw/audit.log" [hosts] codex = ["api.openai.com", "chat.openai.com", "chatgpt.com"] claude = ["api.anthropic.com", "claude.ai"] [allowlist] rule_ids = ["generic-api-key"] patterns = ["^sk-test-"] secret_sha256 = ["0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"] ``` 目前支持的文件节包括 `proxy`、`vault`、`logging`、`notice`、`detection`、`audit`、`hosts` 和 `allowlist`。将文件用于稳定的本地设置,然后在需要一次性覆盖时使用环境变量。 允许列表条目让你有意跳过对已知安全匹配的修订: - `rule_ids`:跳过特定 gitleaks 规则 ID 产生的每个匹配 - `patterns`:跳过匹配值满足正则表达式的机密 - `secret_sha256`:通过 SHA-256 摘要跳过一个精确机密值,无需在配置中存储明文 在本地计算 `secret_sha256` 条目: ``` printf '%s' 'your-known-safe-secret' | sha256sum ``` 禁用持久审计日志: ``` [audit] path = "off" ``` ### 环境变量 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `KEYCLAW_PROXY_ADDR` | `127.0.0.1:8877` | 代理监听地址 | | `KEYCLAW_PROXY_URL` | `http://127.0.0.1:8877` | 导出给子进程的代理 URL | | `KEYCLAW_CA_CERT` | `~/.keyclaw/ca.crt` | 传递给客户端的覆盖 CA 证书路径 | | `KEYCLAW_VAULT_PATH` | `~/.keyclaw/vault.enc` | 加密 vault 位置 | | `KEYCLAW_VAULT_PASSPHRASE` | 未设置 | 显式 vault 口令覆盖 | | `KEYCLAW_CODEX_HOSTS` | `api.openai.com,chat.openai.com,chatgpt.com` | 要拦截的 Codex/OpenAI 主机 | | `KEYCLAW_CLAUDE_HOSTS` | `api.anthropic.com,claude.ai` | 要拦截的 Claude/Anthropic 主机 | | `KEYCLAW_MAX_BODY_BYTES` | `2097152` | 最大请求体大小 | | `KEYCLAW_DETECTOR_TIMEOUT` | `4s` | 请求体检查和流式 body 读取的超时时间 | | `KEYCLAW_GITLEAKS_CONFIG` | 内置规则 | 自定义 `gitleaks.toml` 路径 | | `KEYCLAW_AUDIT_LOG` | `~/.keyclaw/audit.log` | 仅追加 JSONL 审计日志路径,或 `off` 禁用 | | `KEYCLAW_LOG_LEVEL` | `info` | 运行时 stderr 详细程度:`error`、`warn`、`info`、`debug` | | `KEYCLAW_NOTICE_MODE` | `verbose` | 修订通知模式:`verbose`、`minimal`、`off` | | `KEYCLAW_DRY_RUN` | `false` | 扫描并记录将被修订的内容而不修改流量 | | `KEYCLAW_UNSAFE_LOG` | `false` | 仅用于调试,禁用正常日志清理 | | `KEYCLAW_FAIL_CLOSED` | `true` | 在重写或检测失败时阻止请求 | | `KEYCLAW_REQUIRE_MITM_EFFECTIVE` | `true` | 如果检测到代理绕过则失败 | | `KEYCLAW_ENTROPY_ENABLED` | `true` | 启用高熵机密检测 | | `KEYCLAW_ENTROPY_THRESHOLD` | `3.5` | 基于熵的匹配的最小熵分数 | | `KEYCLAW_ENTROPY_MIN_LEN` | `20` | 基于熵的匹配的最小 token 长度 | ### 设置变量 当配置文件和环境变量都设置时,环境变量优先。 单命令内联: ``` KEYCLAW_LOG_LEVEL=debug KEYCLAW_NOTICE_MODE=minimal keyclaw claude --resume latest KEYCLAW_GITLEAKS_CONFIG="$PWD/gitleaks.toml" keyclaw doctor ``` 当前 shell 会话持久: ``` export KEYCLAW_LOG_LEVEL=debug export KEYCLAW_NOTICE_MODE=minimal keyclaw codex exec --model gpt-5 ``` 跨新 shell 持久: ``` # ~/.bashrc 或 ~/.zshrc export KEYCLAW_LOG_LEVEL=debug export KEYCLAW_NOTICE_MODE=minimal export KEYCLAW_GITLEAKS_CONFIG="$HOME/.config/keyclaw/gitleaks.toml" ``` 如果你将 `keyclaw proxy` 用作分离 daemon,或启用 `keyclaw proxy autostart`,daemon 端设置在该代理进程启动时读取。在更改 `~/.keyclaw/config.toml` 或 `KEYCLAW_PROXY_ADDR`、`KEYCLAW_LOG_LEVEL`、`KEYCLAW_GITLEAKS_CONFIG`、`KEYCLAW_NOTICE_MODE`、`KEYCLAW_REQUIRE_MITM_EFFECTIVE` 等变量后,重启代理以便运行中的 daemon 采纳。 默认情况下,KeyClaw 在加密 vault 旁边创建一个机器本地 vault 密钥,并在后续运行中重用。仅在需要显式覆盖该密钥材料时设置 `KEYCLAW_VAULT_PASSPHRASE`。使用已移除内置默认值写入的现有 vault 将在下一次成功写入时迁移到生成的本地密钥。如果现有 vault 无法解密或其密钥材料缺失,KeyClaw 将失败关闭并告诉你如何恢复。 `KEYCLAW_NOTICE_MODE=verbose` 保持当前完整确认指引,`minimal` 注入较短通知,`off` 完全抑制通知注入,但仍正常修订和重新注入机密。 在不更改实时量的情况下调整检测时使用 dry-run:设置 `[detection] dry_run = true`,导出 `KEYCLAW_DRY_RUN=true`,或向 `keyclaw rewrite-json`、`keyclaw mitm ...`、`keyclaw codex ...`、`keyclaw claude ...` 或 `keyclaw proxy start` 传递 `--dry-run`。 唯一故意例外清理后运行时日志的是 `KEYCLAW_UNSAFE_LOG=true`。启用时,KeyClaw 可能将原始请求片段写入 stderr 或 `~/.keyclaw/mitm.log` 以帮助调试拦截问题。正常使用时请保持未设置。 ## 审计日志 默认情况下,KeyClaw 将每个修订机密的一行 JSON 追加到 `~/.keyclaw/audit.log`。每个条目包括 UTC 时间戳、`rule_id`、占位符、请求主机和操作,但绝不包含原始机密值本身。 设置 `KEYCLAW_AUDIT_LOG=off` 或 `[audit] path = "off"` 以禁用持久审计日志。设置 `KEYCLAW_AUDIT_LOG=/path/to/audit.log` 或 `[audit] path = "/path/to/audit.log"` 将其移动到其他位置。 KeyClaw 本身不轮换审计日志;它总是追加。对于大小管理,将其指向由 `logrotate`、`newsyslog` 或你平台的等效轮换工具管理的路径。 ## 日志 面向操作者的运行时消息使用分级 stderr 前缀: - `keyclaw info:` 启动、关闭、CA/规则集初始化和生命周期摘要 - `keyclaw debug:` 每请求代理活动,如拦截、重写和占位符解析 - `keyclaw warn:` 有风险但非致命的条件,如不安全日志或绕过风险 - `keyclaw error:` 退出前的致命 CLI 错误 设置 `KEYCLAW_LOG_LEVEL=error`、`warn`、`info` 或 `debug` 以减少或扩展 stderr 详细程度。默认值为 `info`,保持关注生命周期并避免为每个代理请求发出一行。在排查实时流量时使用 `debug`。`doctor` 子命令故意独立:它将其 `doctor: PASS|WARN|FAIL ...` 报告写入 stdout,以便干净地管道传输或解析。 ## 错误码 KeyClaw 使用确定性错误码进行程序化处理: | 代码 | 含义 | |------|---------| | `mitm_not_effective` | 检测到代理绕过 | | `body_too_large` | 请求体超过 `KEYCLAW_MAX_BODY_BYTES` | | `invalid_json` | 解析或重写请求 JSON 失败 | | `request_timeout` | 请求体读取在检查完成前超时 | | `strict_resolve_failed` | 在严格模式下占位符解析失败 | ## 安全模型 完整威胁模型请参阅 [docs/threat-model.md](docs/threat-model.md)。 ### KeyClaw 防范的内容 - 代码库中的机密被发送到 AI API - API keys、token 和凭证通过 CLI 或 IDE 流量泄露 - `.env` 文件、配置文件和硬编码凭证的意外暴露 ### 非目标与限制 - 被入侵的本地机器 - 从未使用 KeyClaw 代理或针对配置拦截列表之外主机的流量 - 跨每个提供商、凭证格式或提示措辞的完美机密检测 - 侧信道泄露,如精确机密长度保留 ### 信任边界 信任边界是你的机器。KeyClaw 仅保护受支持客户端实际通过本地代理路由的流量。CA 证书在本地生成,绝不离开你的机器。加密 vault 及其机器本地密钥保留在本地磁盘,除非你通过 `KEYCLAW_VAULT_PASSPHRASE` 显式覆盖密钥。机密检测、占位符生成和重新注入都在进程内发生。 ## 项目结构 ``` src/ ├── main.rs # Entry point ├── lib.rs # Module declarations ├── allowlist.rs # Operator-controlled allowlist logic ├── audit.rs # Persistent JSONL audit log writes ├── certgen.rs # Runtime CA certificate generation ├── config.rs # Env + TOML configuration ├── entropy.rs # High-entropy token detection ├── gitleaks_rules.rs # Bundled gitleaks rule loading + native regex compilation ├── pipeline.rs # Request rewrite pipeline ├── placeholder.rs # Placeholder parsing, generation, and resolution ├── redaction.rs # JSON walker + notice injection ├── vault.rs # AES-GCM encrypted secret storage ├── proxy.rs # Proxy server entrypoint + handler wiring ├── proxy/ │ ├── common.rs # Shared host checks, response helpers, and logging │ ├── http.rs # HTTP request/response interception │ ├── streaming.rs # SSE frame resolution and buffering │ └── websocket.rs # WebSocket message redaction and resolution ├── launcher.rs # CLI surface and subcommand dispatch ├── launcher/ │ ├── bootstrap.rs # Processor/bootstrap setup and launched-tool wiring │ └── doctor.rs # Operator health checks ├── logscrub.rs # Log sanitization └── errors.rs # Error types and codes gitleaks.toml # Bundled detection rules compiled by gitleaks_rules.rs ``` ## 更多文档 | 文档 | 目的 | |-----|---------| | [docs/README.md](docs/README.md) | 深入文档的入口 | | [docs/architecture.md](docs/architecture.md) | 请求/响应流、模块映射和设计决策 | | [docs/configuration.md](docs/configuration.md) | 完整配置文件和环境变量参考 | | [docs/secret-patterns.md](docs/secret-patterns.md) | 支持的机密类别和自定义规则指南 | | [docs/threat-model.md](docs/threat-model.md) | 威胁模型、信任边界和非目标 | | [CLAUDE.md](CLAUDE.md) | Claude Code 的 Agent 指南 | | [AGENTS.md](AGENTS.md) | Codex 的 Agent 指南 | ## 贡献 本地开发、验证、发布和文档期望请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许可证 [MIT](LICENSE)
标签:API密钥保护, API网关, Cloud Credentials, DLL 劫持, DLL注入, DLP, MITM, Rust, Zero Trust, 中间人代理, 代码分析, 凭证管理, 可视化界面, 大语言模型, 威胁情报, 开发者工具, 提示词注入防御, 敏感信息过滤, 本地代理, 流量审计, 私有化部署, 秘密扫描, 网络安全, 网络安全, 网络流量审计, 通知系统, 防御规避, 隐私保护, 隐私保护