部署 Maskit:桌面客户端与 Docker 两条路
Maskit(数据面具,Data Maskit)是开源的本地隐私脱敏与还原网关,GitHub 2026-09 查询约 200 star(精确值 198):把 Cursor、Claude Code 等工具的 API Base URL 指向它在本机开的反代端口,请求出网前自动把密钥、内网地址、手机号替换成占位符,模型回复时毫秒级流式还原,100% 本地运算、零遥测(官方 README 表述)。接入只改一个 Base URL,工作量在部署:个人日常用桌面客户端,团队、服务器或 NAS 用 Docker。
桌面客户端(Windows / macOS)
GitHub Releases 下载安装包(细节出自官方 README):Windows 用 Maskit_<版本>_x64-setup.exe 双击安装,系统托盘右键启停,官方称支持基于 Minisign 的数字签名在线更新;macOS(Apple Silicon)用 Maskit_<版本>_aarch64.dmg 拖入”应用程序”。首次打开若提示无法验证开发者,执行:
xattr -cr /Applications/Maskit.app
Docker(团队 / 服务器 / NAS)
官方预构建多架构镜像 ghcr.io/xiayutian11/maskit:latest,原生支持 linux/amd64 与 linux/arm64,内嵌 Web 控制台,一行命令启动:
docker run -d \
--name maskit \
--restart unless-stopped \
-p 127.0.0.1:5801:5801 \
-p 127.0.0.1:18701:18701 \
-v maskit_data:/data \
-e MASKIT_PANEL_TOKEN="YourSecretToken123456" \
ghcr.io/xiayutian11/maskit:latest
参数说明(官方 README):5801 是 Web 控制台端口,必开;18701 起是模型反代端口,用几个开几个;MASKIT_PANEL_TOKEN 需 16 位以上纯 ASCII。默认绑定 127.0.0.1 回环不暴露公网;经 Nginx TLS 反代时追加 MASKIT_TRUST_PROXY=1。也可源码运行:pip install -r requirements.txt 后执行 python engine/panel.py。
接入原理:把 Base URL 改到本地端口
接入的本质是端点替换:请求先到 Maskit 本地端口,打码后由网关转发上游,回复沿原路流式还原。默认端口映射(官方 README):OpenAI 协议 http://127.0.0.1:18701/v1,DeepSeek 协议 http://127.0.0.1:18702/v1,Anthropic 协议 http://127.0.0.1:18703,可在”客户端管理”增改。项目定位与三类检测目标见 Maskit 是什么。
三个工程要点:走普通 HTTP 反代,无需装自签名 CA 根证书(官方称”免装根证书”);Fallback Passthrough 兜底,即使 Maskit 退出本地端口仍透明直连,工具不断网;API Key 照常填真实值,Maskit 收到后转发上游,不托管密钥。各工具端点字段名随版本变化,以各自官方文档为准。
Cursor 接入:OpenAI Base URL 指向 18701
Cursor 的接入口在模型设置:把自定义 OpenAI Base URL 改为本地端口,密钥照填。官方 README 路径是 Cursor → Settings → Models:
- 启动 Maskit,确认 OpenAI 端口(默认 18701)在监听;
- 打开 Cursor → Settings → Models;
- OpenAI Base URL 填
http://127.0.0.1:18701/v1; - API Key 填真实密钥(Maskit 收到后转发上游);
- 发一条消息验证,方法见下文。
两点补充:Cursor 迭代快,Base URL / Override 字段名称以 Cursor 官方文档为准;用 One API / New API 这类中转的,在 Maskit「客户端管理」添加客户端——目标网关填中转地址、本地端口填空闲端口(如 18709)、勾选脱敏路径,Base URL 改指 http://127.0.0.1:18709/v1(官方 README 步骤)。
Claude Code 接入:ANTHROPIC_BASE_URL 环境变量
Claude Code 改端点最直接的方式是环境变量:启动前把 ANTHROPIC_BASE_URL 指向 Maskit 的 Anthropic 端口 18703(官方 README 写法):
# Linux / macOS
export ANTHROPIC_BASE_URL="http://127.0.0.1:18703"
claude
Windows PowerShell 等价写法:
$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:18703"
claude
也可用 cc-switch 渠道切换工具,把当前 Claude 渠道的 Base URL 改为 http://127.0.0.1:18703(官方 README 推荐),或写进 shell 配置固化。环境变量名以 Claude Code 官方文档为准。还没装的先看 Claude Code 安装教程,密钥申请与配置见 Claude Code API Key 配置指南。
其他工具与代码接入
OpenAI 协议的命令行工具(Codex、OpenCode、Aider、Pi 等)统一走环境变量(官方 README 示例):
# Linux / macOS
export OPENAI_BASE_URL="http://127.0.0.1:18701/v1"
export OPENAI_API_KEY="your-api-key"
# Windows PowerShell
$env:OPENAI_BASE_URL = "http://127.0.0.1:18701/v1"
$env:OPENAI_API_KEY = "your-api-key"
代码接入只改 base_url 参数,对调用方透明(示例改自官方 README):
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:18701/v1",
api_key="your-api-key"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "排查数据库连接:mysql://root:Pass123@192.168.1.100:3306"}]
)
print(response.choices[0].message.content)
验证脱敏是否生效:一段假密钥的端到端测试
接入成功的标准是三件事同时成立:模型收到占位符、你看到原文、日志有记录。全程用假数据测,不拿真实凭证冒险(工程验证方法,非官方流程):
- 在已接入的工具里发一条含假敏感信息的消息,例如
排查数据库:mysql://root:FakePass@192.168.1.50:3306/db,密钥 sk-proj-TEST123456; - 观察回复:模型围绕”连接串、密钥”给出正常建议,说明占位符保留了语义,推理没被打断;
- 打开 Web 控制台(5801 端口)日志页找到这笔请求,确认连接串与密钥已被形如
{{CONNSTR_xxx}}的占位符替换,日志支持原文高亮对照(官方 README 功能),实际格式以日志为准; - 也可用 curl 直连复核:
curl http://127.0.0.1:18701/v1/chat/completions \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"排查数据库:mysql://root:FakePass@192.168.1.50:3306/db"}]}'
回复里出现还原后的假连接串、日志对应位置是占位符,链路即打通,再换真实工作负载。
使用边界与注意事项
Maskit 解决的是”出网面”问题,三个边界要在放量前实测清楚(工程建议):
- 多轮一致性:滑动窗口复用保证窗口内同一敏感词每轮映射同一占位符(官方 README:同一对话第 1 轮与第 10 轮的”张三”一致);滑出窗口后的映射保留行为建议实测,关键代号提前加入自定义词库。
- 长上下文耗时:正则扫描与占位符拼接都在本地进程内进行,上下文越长本地处理占比越明显;仓库级请求先测一次端到端延迟再放量。
- 误报与漏报:内置 19 类正则走保守路线(官方称低误报),非标准格式的内部凭证可能漏报,PEM 私钥这类大段文本的识别边界建议抽查;漏报代价更高,先紧后松。
- 能力边界:脱敏改变的是模型看到什么,不改变模型能力上限,代码质量与幻觉问题照常审查。
与本地模型方案组合:两条隐私路线对比
脱敏网关与本地模型是两条可叠加的隐私路线:前者让云端模型拿不到真实数据,后者让数据根本不出本机:
| 维度 | 脱敏网关 + 云端模型 | 本地模型(Ollama 等) |
|---|---|---|
| 数据边界 | 真实值不出本机,占位符出网 | 全部数据不出本机 |
| 模型能力 | 云端旗舰模型满血能力 | 受显存约束,多为蒸馏版 |
| 成本 | 按量计费的 API 费用 | 电费加显卡投入,边际近零 |
| 部署 | 部署网关加改 Base URL | 装环境、拉模型、调参数 |
| 适用 | 日常主力开发 | 红线数据、离线环境、批处理 |
常见组合按数据敏感度分流:日常开发走网关加云端模型,红线任务走本地模型。显存选型与部署见 DeepSeek 本地部署与 Ollama 方案;本机隐私工具生态参考 OpenHuman 本地隐私运行。
常见问题
Cursor 隐私设置能防代码外发吗?
Cursor 自带隐私设置控制的是会话数据是否用于训练,请求仍会完整到达模型服务商,挡不住密钥和内网地址出网;要打码需把 Base URL 指向本地脱敏网关。
两层防护对象不同:隐私模式约束服务商拿到数据后怎么用,脱敏网关约束发出去的数据里有什么(隐私模式行为以 Cursor 官方文档为准)。
Claude Code 怎么做数据脱敏?
Claude Code 没有内置脱敏功能,标准做法是启动前设置 ANTHROPIC_BASE_URL=http://127.0.0.1:18703,让请求先经 Maskit 打码再转发 Anthropic,回复自动还原。
步骤三段:部署 Maskit、设环境变量启动 claude、用假密钥发消息到日志页核对占位符,细节见上文。
数据脱敏网关是什么?
数据脱敏网关是部署在应用与外部服务之间的代理层,流量经过时自动替换敏感信息;大模型场景的网关(如 Maskit)还要在回复时把占位符还原成原文,保证体验无感。
与数据库动态脱敏的差别在对象与方向:数据库网关拦查询结果,大模型网关拦出网提示词并处理流式还原。选型看规则覆盖、流式性能与日志审计。