在不影响工作流的前提下,将私有数据、内部基础设施和机密信息隔离在云端编码代理之外。
安装 · 快速开始 · 策略 · 监控 · Pi / OMP · 安全
Cover 是一款面向 AI 编码代理的双向隐私代理。它在请求离开你的机器之前,将匹配到的敏感值在本地替换为逼真且确定性的替身,然后在普通响应和流式响应中将匹配的伪造值还原为原始值。模型获得连贯的上下文;你的代理和工具则继续使用真实环境。
当对话需要端到端持续可用时,使用可逆的 pseudonymize 或 placeholder 规则。当无需还原时,使用单向的 mask 或 redact 规则;使用 block 在本地阻止请求,使用 allow 设置明确的例外。
支持的客户端包括 Codex、Claude Code、Cursor、Pi / Oh My Pi,以及 兼容 OpenAI 或 Anthropic 的 SDK 和路由器。
安装程序会下载适用于你的操作系统和 CPU 的发行版,根据已发布的 SHA-256 校验和进行验证,以原子方式安装到 ~/.local/bin/cover,配置选定的客户端,并启动代理。
curl -fsSL https://raw.githubusercontent.com/DavidCarliez/cover/main/scripts/install.sh | bash
无需 Go 工具链或 Git 检出。你只需要 curl、一个归档解压工具(Linux/macOS 上的 tar 或 Windows 上的 unzip),以及用于校验的 sha256sum、shasum 或 openssl。
预构建的 Linux、macOS 和 Windows 归档文件及其校验和可从 GitHub Releases 获取。
对于非交互式安装:
curl -fsSL https://raw.githubusercontent.com/DavidCarliez/cover/main/scripts/install.sh | \
COVER_AGENTS=openai,claude bash
固定一个发布版本,或仅安装二进制文件,并将环境变量应用于 bash 进程:
curl -fsSL https://raw.githubusercontent.com/DavidCarliez/cover/main/scripts/install.sh | \
COVER_VERSION=v0.1.0 COVER_SKIP_SETUP=1 bash
git clone https://github.com/DavidCarliez/cover.git
cd cover
go build -o cover ./cmd/cover
install -m 0755 cover ~/.local/bin/cover
核心二进制文件没有 cgo 依赖。标准 Go 交叉编译即可正常工作:
GOOS=linux GOARCH=arm64 go build -o cover-linux-arm64 ./cmd/cover
GOOS=windows GOARCH=amd64 go build -o cover.exe ./cmd/cover
| 领域 | 覆盖功能 |
|---|---|
| 策略 | 声明式规则,支持 allow、placeholder、pseudonymize、mask、redact 和 block 操作 |
| 真实替换 | 针对 IP 地址、主机、域名、电子邮件、用户名、密码、UUID、URL、别名、数字标识符、IBAN 和电话号码的确定性生成器 |
| 上下文感知规则 | 工具结果字符串中的 JSON 键、HTTP 头、Cookie、查询参数和表单字段,以及正则表达式和内置检测器 |
| 稳定身份 | 基于安装密钥的 HMAC 假名在请求、会话和重启之间保持一致 |
| 映射安全 | 有界、会话隔离、仅内存的可逆映射,具有 TTL 和容量限制 |
| 检查 | cover inspect 在不联系 LLM 的情况下预览受保护的 JSON |
| 诊断 | cover doctor 验证策略、守护进程健康、本地故障关闭行为和 Codex 路由 |
| 监控 | 仅元数据的审计和监控视图,以及对捕获和转发内容的显式实时检查 |
| 代理加固 | 默认回环监听器、请求体和流限制、通用安全错误以及故障关闭解析 |
| 流式兼容性 | OpenAI Responses、Chat Completions 和 Anthropic SSE 在增量事件、心跳和交错通道中的恢复;JSON 安全的工具参数 |
| Codex 兼容性 | Responses API 和路由器配置、压缩检查以及不可变的 encrypted_content 字段 |
| 可选语义传递 | 本地 llama.cpp 检测器可以检查正则表达式遗漏的自由格式文本 |
cover init # write ~/.config/cover/config.yaml
cover start --detach # run in the background
cover doctor # verify the local setup
cover test # local redaction round trip, no network call
cover monitor # watch privacy-safe request metadata
cover init 会提示选择 OpenAI、Anthropic 或自定义上游。完整配置记录在 configs/config.example.yaml 中。
| 命令 | 用途 |
|---|---|
cover install | 配置客户端、shell 导出和后台代理 |
cover init | 创建配置文件 |
cover start [--detach] | 在前台或后台启动 Cover |
cover stop | 停止后台进程 |
cover restart | 在后台重启 |
cover status [--json] | 显示进程、监听器和脱敏后的上游状态 |
cover version [--json] | 显示构建版本、提交和日期 |
cover update [--version vX.Y.Z] | 安装经过验证的 GitHub 发布版本;如果正在运行则重启并检查健康状态(Linux/macOS) |
cover update --rollback | 恢复之前的二进制文件,保留配置 |
cover env | 为已配置的客户端打印 shell 导出 |
cover test | 运行合成的本地脱敏和恢复检查 |
cover inspect request.json | 预览 Cover 将转发的确切内容 |
cover doctor [--json] | 运行配置、隐私、守护进程和路由检查 |
cover monitor | 显示最近的安全元数据并跟踪新事件 |
cover monitor --show-content | 每行显示一个敏感原始值 → 替换值对;添加 --json 获取完整事件 |
cover models pull | 下载可选的本地检测器运行时和模型 |
cover models status | 报告本地检测器安装和配置 |
cover completion | 生成 shell 补全脚本 |
停止 Cover 不会更改客户端配置。仍指向 Cover 的客户端将无法连接,直到 Cover 重启或客户端重新指向其直接提供商或路由器。
stop、restart 和 update 仅向属于 Cover 的进程发送信号:监听器必须在仅限回环的 /__cover/health 端点上报告该进程,或者进程可执行文件必须命名为 cover。过期的 pidfile(包括其进程 ID 现在属于另一个程序的 pidfile)会被删除,Cover 端口上的其他程序永远不会被停止。
停止和重启会排空活动请求,最长 30 秒,可通过 shutdown_timeout_ms 配置。在 Windows 上(没有 SIGTERM),cover stop 会结束进程而不排空。超过该期限后,剩余连接将关闭。重启期间新连接可能会短暂失败;这不是零停机切换。cover status 和 cover doctor 会报告运行中的守护进程与已安装的二进制文件不一致的情况。
在 Linux/macOS 上,cover update 通过 HTTPS 下载已发布的版本,根据发布校验和验证其 SHA-256,验证候选版本,并保存当前二进制文件以便回滚。如果重启后的守护进程未通过健康检查,Cover 会恢复之前的二进制文件并尝试重启它。配置会被保留。Windows 用户应停止 Cover 并重新运行发布安装程序。更新使用已发布的版本,而不是 main 上未发布的提交;校验和可检测损坏的下载,但不是独立的签名。
内置正则检测涵盖 AWS 和 GCP 密钥、GitHub、GitLab、Slack、Stripe 和 Anthropic 令牌、私钥块、JWT、显式通用密钥赋值、电子邮件、SSN、信用卡、电话号码和 IBAN。裸 OpenAI sk-... 值故意不作为专用的内置类别。如果你的环境需要,请定义显式规则。内置检测器在单行内匹配:跨行拆分的电话号码、SSN、卡号或 secret = value 赋值不会被检测到。
规则位于 ~/.config/cover/config.yaml 中的 rules 下。每条规则使用一个选择器:pattern、detector、keys、headers、cookies、query_params 或 form_fields。不要在一个规则中组合多种选择器类型。
rules:
password_fields:
keys: [password, passwd, pwd, passphrase, user_password, database_password]
category: password
action: pseudonymize
generator: password
priority: 220
ipv4_addresses:
detector: builtin_ipv4
category: ip_address
action: pseudonymize
generator: ipv4
priority: 100
customer_name:
pattern: '(?i)\bNIKE\b'
category: customer
action: pseudonymize
generator: alias
priority: 80
forbidden_secret:
pattern: '(?i)secret\s*[:=]\s*(?P<value>[^\s,;]+)'
action: block
priority: 200
键选择器保护完整值,包括短字符串。例如,
{"password":"admin"} 会被保护,而不会将每个
{"username":...} 都视为密码。选中的数组或对象会将策略应用于其标量后代;更高优先级的子规则可以覆盖它。
命名 (?P<value>...) 组允许正则表达式仅替换捕获的值。
一旦任何规则保护了某个值,Cover 会在该值再次出现的任何位置保护同一值,使用相同的操作和相同的确定性替换:
短于 4 字节的值不会在其选中字段之外被匹配。
短于 8 字节的值以及数字仅作为完整单词匹配,因此受保护的 admin 不会改变 administrator。在上面的示例中,{"username":"admin"} 与 {"password":"admin"} 相邻时因此也会受到保护,因为发送它会泄露密码。由显式 allow 键规则覆盖的字段保持不变。
此记忆仅保存在进程内存中,受
mappings.max_known_values(默认 50,000)和
mappings.known_value_ttl_minutes(默认 24 小时)限制。值的每次出现都会续期其生命周期。重启后,一旦规则匹配到某个值,该值会再次受到保护。
| 操作 | LLM 接收到的内容 | 响应行为 |
|---|---|---|
allow | 原始值 | 不变 |
placeholder | 一个简短的不透明令牌 | 重复时在本地恢复 |
pseudonymize | 一个逼真、确定性的假值 | 重复时在本地恢复 |
mask | 首尾字符,中间被掩码 | 单向;不恢复 |
redact | [REDACTED] | 单向;不恢复 |
block | 无;Cover 在本地拒绝整个请求 | 无上游响应 |
当匹配重叠时,保护性规则选中的任何字节都不会被发送。block 匹配会阻止请求。否则,将应用覆盖整个重叠范围的最高优先级匹配;如果没有这样的匹配,该范围会变成一个占位符,而不是根据组合文本生成的假值。allow 匹配仅豁免它完全包含且优先级不高于它的保护性匹配,因此允许 corp.example.com 不会暴露 [email protected]。
假名生成器:ipv4、ipv6、hostname、domain、fqdn、email、
username、password、secret、uuid、url、alias、number、iban、
phone 和 digits。
url 生成器会替换主机、凭据、每个路径段、查询值和片段;仅保留 scheme、端口、段数和查询键。主机、域名和电子邮件假值使用 example.com,或者当原始值具有私有后缀(如 .internal)时使用该后缀,绝不使用真实的公共域名。
iban 保留原始值的国家代码和间距,并生成具有不同账户的有效 IBAN;phone 保留间距、国家代码、中继零和国内号码的第一位数字,并更改其余部分。digits 保留每个非数字字符并更改每个数字,用于增值税、注册或客户编号等标识符。这三者都适用于匹配你所使用格式的 pattern 规则。
mask 在每端最多显示值的六分之一(少于六个字符时不显示)。