RPBLC-hq/DAM

GitHub: RPBLC-hq/DAM

专为 AI 编码 Agent 设计的本地隐私防火墙,通过代理拦截出站 prompt 中的敏感信息并进行令牌化替换,防止 PII 泄露给模型提供商。

Stars: 9 | Forks: 0

DAM

数据访问中介

专为编码 Agent 设计的本地隐私防火墙。

License: Apache-2.0 Rust 1.94+ Node >=18 npm: @rpblc/dam Checks: fmt, clippy, test

快速开始 · 工作原理 · 授权 · Web UI · 托盘应用 · 命令 · V1 限制 · 下一步计划

DAM 运行在你的机器上,位于编码 Agent 和其模型提供商之间。它会检测出站 prompt 中的敏感值,应用本地策略和授权确认,将受保护的值替换为稳定的引用,并将原始值存储在本地 Vault 中,这样提供商就只能看到你希望分享的内容。 V1 版本专注于目前最重要的本地 AI 路径: - 通过 `dam connect` 启动本地受保护端点的 **工具和 Agent**。 - 通过 `ANTHROPIC_BASE_URL` 支持的 **Claude Code**。 - 通过注入 OpenAI 提供商配置支持的 **Codex API-key 模式**。 Codex ChatGPT-login 模式被故意屏蔽,直到其传输通道能够得到安全保护。 ``` You type: "Email banana@banana.com and include card 4111-1111-1111-1111" DAM sends upstream: "Email [email:BhjEUc1EX1JHLbeT7JUS6g] and include card [cc:7j21sVjW3aN4xFqP9L6MRA]" Provider can reason over: "there is an email" "there is a card" Provider does not need: banana@banana.com 4111-1111-1111-1111 ``` ## 快速开始 当你想要尝试 DAM 而不想创建持久化的本地数据库时,可以使用一次性 npm 试用模式: ``` npx @rpblc/dam claude ``` 对于 Codex,请使用 API-key 模式: ``` OPENAI_API_KEY=sk-... npx @rpblc/dam codex --api ``` 试用模式会创建临时的 Vault、日志和授权数据库,启动受保护的 Agent,然后在会话退出时删除这些数据库。 ``` DAM trial mode Vault: /tmp/dam-trial-.../vault.db Log: /tmp/dam-trial-.../log.db Consents: /tmp/dam-trial-.../consent.db ``` 保留试用数据库以供检查: ``` npx @rpblc/dam claude --keep ``` 全局安装以使用常规的持久化本地状态: ``` npm install -g @rpblc/dam dam connect dam status dam integrations list dam claude dam codex --api ``` 使用 `npx` 时,`--persist` 会跳过一次性试用模式,并使用已配置/默认的数据库路径: ``` npx @rpblc/dam claude --persist ``` 从源码检出运行: ``` cargo run -p dam -- connect cargo run -p dam -- integrations list cargo build -p dam -p dam-web -p dam-tray cargo run -p dam-tray cargo run -p dam -- claude cargo run -p dam -- codex --api ``` ## 工作原理 ``` local machine provider prompt ──► dam launcher/daemon ──► dam-proxy ────────────────► model API │ │ │ │ ├─ detect sensitive values │ │ ├─ apply policy │ │ ├─ apply active consents │ │ ├─ write tokenized values to vault │ │ ├─ redact outbound request │ │ └─ write non-sensitive log events │ │ │ ◄──────────────── response with DAM references ◄───────┘ vault.db raw originals for tokenized values, local SQLite consent.db exact-value passthrough grants with TTL log.db event metadata, not raw detected values ``` 出站处理管道在代理和 `dam-filter` 中具有相同的结构: ``` input -> dam-detect -> dam-policy -> dam-consent active exact-value overrides -> dam-core replacement plan -> dam-vault for tokenized values -> dam-redact -> output ``` 默认情况下,在同一请求/运行中,重复出现的相同值会复用相同的引用: ``` [policy] deduplicate_replacements = true ``` 如果在你的使用场景中,复用相同的引用会泄露过多的等价信息,请将其设置为 `false`。 ## 授权 授权允许特定的检测值以未脱敏的形式通过,直到其 TTL 到期或授权被撤销。它会覆盖 `tokenize` 和 `redact`,但不会覆盖 `block`。 授权是基于精确值授予的,其键名为: ``` kind + value_fingerprint + scope ``` 它们不存储原始的敏感值。从 Vault UI 或 MCP 服务器创建的授权会使用一个稳定的 Vault 密钥,例如: ``` email:ANJFsZtLfEA9WeP3bZS8Nw ``` 这个稳定密钥非常重要,因为入站引用解析会在 Agent 看到本地值之前,将方括号引用还原回这些本地值。 默认授权配置: ``` [consent] enabled = true backend = "sqlite" path = "consent.db" default_ttl_seconds = 86400 mcp_write_enabled = true ``` 撤销一个授权会同时撤销具有相同精确值和作用域的所有活动授权,因此重复的 Vault 记录无法在撤销后继续保持通行状态。 ## Web UI `dam-web` 是用于开发和运维人员检查的本地管理 UI: ``` dam web --config dam.example.toml cargo run -p dam-web -- --config dam.example.toml ``` 它提供: - `/connect`:用于本地保护层面:选择配置文件,应用设置,连接,断开连接,以及检查活动端点。 - `/`:用于查看 Vault 记录、明文值,以及记录级别的授予/撤销操作。 - `/consents`:用于查看活动和历史授权记录。 - `/logs`:用于查看非敏感的检测、脱敏、授权和解析事件。 - `/doctor`:用于与 `damctl doctor` 共享的本地就绪检查。 - `/diagnostics`:用于配置和代理健康检查。 `/connect` 使用与 `dam profile set` 相同的活动配置文件状态。Connect 操作会通过 shell 调用本地 `PATH` 中的 `dam` 二进制文件;当从源码树或自定义安装目录运行时,请设置 `DAM_BIN=/path/to/dam`。 Web UI 会以明文形式显示 Vault 值。请将其视为本地管理界面,而不是公共 Web 应用。 ## 托盘应用 `dam-tray` 是用于本地连接用户体验的首个原生 shell。在 macOS 上,它会启动一个本地 `dam-web` 子进程,将 `/connect` 保留在隐藏的 WebView 中,并且仅在点击 `[R:]` 项时打开菜单栏弹出窗口。 ``` cargo build -p dam -p dam-web -p dam-tray cargo run -p dam-tray ``` 托盘 shell 默认使用 `$DAM_STATE_DIR` 或 `$HOME/.dam` 来存储持久化的本地状态。页面内的 Quit DAM 操作会运行 `dam disconnect`,停止托管的 Web UI,并退出托盘 shell。 ## MCP DAM 内置了一个 MCP 服务器,以便 Agent 在启用时可以管理授权: ``` cargo run -p damctl -- mcp config cargo run -p dam-mcp -- --config dam.example.toml ``` 当前工具: - `dam_consent_list` - `dam_consent_grant` - `dam_consent_revoke` `dam_consent_request` 被有意暂停,直到通知流程开发完成。 ## 命令 后台本地端点: ``` dam connect [--openai|--anthropic] [DAM_OPTIONS] dam connect --profile [--apply] [DAM_OPTIONS] dam connect --apply [DAM_OPTIONS] dam status [--json] dam profile status [--json] dam profile set [--json] dam profile clear [--json] dam disconnect dam integrations list [--json] dam integrations show [--json] dam integrations apply [--write|--dry-run] dam integrations rollback ``` 受保护的 Agent 启动器: ``` dam claude [DAM_OPTIONS] [-- CLAUDE_ARGS...] dam codex --api [DAM_OPTIONS] [-- CODEX_ARGS...] ``` DAM 选项: ``` --profile Apply integration profile daemon defaults --apply Apply the selected or active integration profile before connecting --openai Use the OpenAI-compatible daemon preset --anthropic Use the Anthropic daemon preset --api Use Codex API-key mode through DAM --config Load DAM config before launcher overrides --listen Local proxy listen address, default 127.0.0.1:7828 --target-name Proxy target name for daemon mode --provider Provider adapter for daemon mode --upstream Provider upstream --db Vault SQLite path, default vault.db --log Log SQLite path, default log.db --consent-db Consent SQLite path, default consent.db --no-log Disable DAM log writes --no-resolve-inbound Leave DAM references unresolved in inbound responses --resolve-inbound Restore known DAM references in inbound responses ``` 辅助二进制文件可从源码构建和原生发行版中获取: ``` cargo run -p dam-filter -- --config dam.example.toml session.txt > clean.txt cargo run -p dam-filter -- --config dam.example.toml --report session.txt > clean.txt 2> report.txt ``` 控制与诊断: ``` cargo run -p damctl -- status cargo run -p damctl -- doctor --config dam.example.toml cargo run -p damctl -- daemon inspect cargo run -p damctl -- integrations check cargo run -p damctl -- config check --config dam.example.toml cargo run -p damctl -- mcp config --config dam.example.toml ``` ## 检测 当前的检测器是基于规则的,并且有意设计得较为狭窄: - 电子邮件地址,包括常见的空格分隔符变体 - 短划线格式的 NANP 电话号码 - 带有基本无效区域拒绝的 US SSN - 带有 Luhn 校验的信用卡 策略将检测结果映射为 `tokenize`、`redact`、`allow` 或 `block`。默认策略会对支持的类型进行 tokenize 处理。 ## V1 限制 - DAM 是显式的 base-URL 路由,而不是透明的 HTTPS 拦截、VPN/TUN 路由或 TLS MITM。 - `dam profile set ` 用于为本地用户选择活动的工具配置文件。当省略 `--profile` 时,`dam connect --apply` 会使用该活动配置文件。 - `dam connect` 会启动一个本地端点,而带有活动配置文件的 `dam connect --profile --apply` 或 `dam connect --apply` 可以在连接之前应用可逆的工具设置。`dam integrations apply ` 默认为预览模式;添加 `--write` 可以在支持回滚的情况下编辑 Codex 配置、Claude Code 设置或 DAM 管理的环境文件。 - Codex ChatGPT-login 模式被阻止,因为其当前的模型传输不受 base-URL 启动器的保护。 - 入站提供商响应不会被重新检测。已知的 DAM 引用可以使用 `--resolve-inbound` 在本地解析,但此功能默认关闭。 - 当前的 Vault/日志/授权存储是本地 SQLite 实现。 - 检测器目前尚未涵盖姓名、地址、组织、私钥、JWT、API 密钥、IBAN 或 IP 地址。 - npm 包是围绕原生 DAM 二进制文件的 Node 入口点;发布打包必须包含 `npm/native` 下的平台二进制文件。 ## 下一步计划 接下来的工程阶段建议顺序: 1. 冒烟测试 `dam connect`、`dam claude`、`dam codex --api` 和 `dam-tray`(可针对真实或伪造的提供商路径),然后检查 Vault 和日志 SQLite 数据库。 2. 在可以安全更改工具配置文件的情况下,将配置文件应用支持扩展到 Claude/Codex 之外。 3. 在配置文件应用稳定后,为守护程序添加登录/启动用户体验。 4. 使用已签名的原生二进制文件和 npm/native 发布资产打包托盘应用。 在它们的前置切片完成之前,不要在接下来的阶段进行以下工作: - Codex ChatGPT-login 保护,除非这项工作专门是针对 WebSocket/`backend-api/codex/responses` 传输计划或适配器进行的。 - TLS 拦截、本地 CA 管理、VPN/TUN 或任意 Web 流量重写。 - 在提供商流式传输语义设计并完成固定测试之前的流式/SSE 响应解析。 - 在本地路由器和管道契约证明稳定之前的远程 Vault/日志后端。 已实现的提取模块: - `dam-pipeline`:用于代理/API 样式流程的共享请求处理编排。 - `dam-provider-openai`:兼容 OpenAI 的适配器,采用固定测试优先,且在自动化测试中不进行真实的提供商调用。 - `dam-provider-anthropic`:兼容 Anthropic 的适配器,采用固定测试优先,且在自动化测试中不进行真实的提供商调用。 - `dam-router`:可复用的首选目标选择、提供商分类、认证模式和故障模式决策。 - `dam-diagnostics`:用于 `damctl doctor` 和 `dam-web /doctor` 的共享本地就绪检查。 - `dam-daemon`:用于 `dam connect/status/disconnect` 的后台本地代理生命周期和状态文件。 - `dam-integrations`:用于 `dam integrations`、`dam profile` 和 `dam connect --profile` 的已知本地工具配置文件。 - `dam-tray`:托管 Connect 界面的首个原生桌面 shell。 近期仍需构建的产品切片: - 更广泛的集成配置文件应用/安装支持,在可以可靠更改工具配置文件的地方提供安全的回滚机制。 - 在配置文件应用稳定之后,为本地守护程序添加登录/启动用户体验。 - 签名的原生托盘/菜单栏打包和发布安装。 后端替换模块: - `dam-vault-remote`:使用 `vault.backend = "remote"` 的远程 `VaultWriter` 和 `VaultReader` 实现。 - `dam-log-remote`:使用 `log.backend = "remote"` 的远程 `EventSink` 实现。 暂停的模块: - `dam-outbox`:用于失败的异步远程 Vault/日志写入的持久队列。 - `dam-detect-pipeline`:用于多检测器的编排,包括顺序、并行和嵌套的检测器套件。 - `dam-auth`:用于远程 Vault/日志/代理部署的 auth/token 处理。 - `dam-net`:用于选定或全设备路由的未来 VPN/TUN/网络扩展层。 - `dam-trust`:未来的 TLS 拦截/本地 CA 管理(如果稍后得到验证)。 - `dam-websocket`:在 HTTP 和 SSE 路径稳定之后的未来 WebSocket 适配器。需要在 `dam codex` 能够保护 Codex 的 ChatGPT-login `backend-api/codex/responses` 传输之前完成。 - `dam-notify`:用于用户可见的关注事件(例如授权请求或严重错误)的通知模块。 ## 构建 ``` cargo fmt --all --check cargo clippy --workspace -- -D warnings cargo test --workspace npm pack --dry-run ``` ## 许可证 Apache-2.0。
标签:AI 代理安全, AI 安全, AI 数据安全, AI 防火墙, API 网关, CISA项目, Claude Code 安全, GNU通用公共许可证, LLM 代理, MITM代理, Node.js, OpenAI Codex, Rust 语言, 个人身份信息 (PII) 保护, 个人隐私保护, 企业隐私保护, 可视化界面, 大语言模型 (LLM) 防火墙, 安全中间件, 敏感数据脱敏, 数据合规与同意, 数据访问中介, 数据防泄漏 (DLP), 数据隐私, 暗色界面, 本地数据保险箱, 编码安全, 通知系统, 隐私计算, 隐私防火墙