跳转至

自动脱敏

claude-mem 可以在存储观察结果和摘要之前自动检测并脱敏常见的机密信息。与手动 <private> 标签 不同,这是一个确定性的 regex 管道,可以捕捉你从未亲自输入过的机密——例如 curl 响应中打印的 API 密钥,或 Bash 命令回显的内容。

工作原理

启用后,脱敏会在与剥离 <private> 标签相同的单一位置运行,因此同时覆盖所有采集路径:工具输入和输出、你的提示词(包括存储的提示词历史)以及用于生成摘要的助手最后一条消息。服务器运行时 还会在存储事件之前对事件正文中的每个文本值进行脱敏,worker 和 hook 日志会对它们写入的工具行(例如 Bash 命令)进行脱敏。一个例外:服务器运行时会话和事件元数据(例如会话元数据中的开场 prompt)仅在字符串包含标签时才进行标签剥离,因此脱敏不会对其运行。内容会扫描一组精选的高置信度机密模式,匹配项会在原位置替换为自闭合的 <redacted type='...'/> 占位符,保留周围上下文,从而保持搜索和观察质量不受影响。

Before:  curl -H "Authorization: Bearer sk-abc123def456..." …
After:   curl -H "Authorization: Bearer <redacted type='openai_key'/>" …

当负载包含标记时,观察者提示词会告诉模型将其视为占位符,而不要推断出字面值。没有标记的提示词保持不变,因此当未发现任何内容时,脱敏不会增加 token 开销。

启用

添加至 ~/.claude-mem/settings.json:

{
  "CLAUDE_MEM_REDACT_ENABLED": "true"
}

这就是让 12 个内置模式生效所需的全部配置。添加 "CLAUDE_MEM_REDACT_GENERIC_ENABLED": "true" 还可以开启 3 个通用模式。

内置模式

名称 捕获内容
aws_access_key AKIA… 和临时 ASIA… 密钥 ID(16 个尾部字母数字字符)
aws_secret_key 40 字符 base64,锚定到任意大小写的 AWS_SECRET_ACCESS_KEY=…(如 ~/.aws/credentials 中),或 JSON "SecretAccessKey": "…"(aws sts 输出)
aws_session_token 100+ 字符 base64,锚定到 AWS_SESSION_TOKEN=…、aws_session_token = … 或 JSON "SessionToken": "…"(临时 STS/SSO 凭据)
github_pat ghp_…、gho_…、ghu_…、ghs_…、ghr_…、github_pat_…
openai_key sk-…(≥20 字符)
anthropic_key sk-ant-…(≥20 字符)
slack_token xoxb-…、xoxp-…、xoxa-…、xoxr-…、xoxs-…
jwt eyJ…[.]eyJ…[.]… 三段式令牌
private_key_pem -----BEGIN [RSA\|DSA\|EC\|OPENSSH\|PGP\|ENCRYPTED\|]PRIVATE KEY[ BLOCK]----- 块
stripe_key sk_live_…、pk_live_…、rk_test_…
google_api_key AIza…(35 个尾部字符)
claude_mem_key claude-mem 自己的服务器 API 密钥(cmem_…)和 cmem.ai Pro 记忆密钥(cm_pro_…)

通用模式

没有厂商前缀的凭据(例如数据库密码、内部令牌)需要基于密钥名称的低置信度匹配。以下三种模式默认关闭,直到你主动启用:

{
  "CLAUDE_MEM_REDACT_ENABLED": "true",
  "CLAUDE_MEM_REDACT_GENERIC_ENABLED": "true"
}
名称 捕获内容
generic_password 分配给 password / passwd 密钥或 *_PWD 密钥的值(DB_PASSWORD=…、MYSQL_PWD=…),支持 shell、yaml 或 JSON 风格
generic_token 分配给 *_TOKEN / *_SECRET / *_API_KEY 密钥的值(例如 AUTH_TOKEN=…、"client_secret": "…")
bearer_token Authorization: Bearer … 之后的值

它们在每个厂商模式之后运行,因此具有厂商形状的值(如 sk-… 密钥、JWT 等)会保留其特定标记。为了避免误报,它们仅在值长度达到 8 个及以上字符、包含至少一个字母、并且完全由机密典型字符组成时才会触发——因此 max_tokens=4096、短 PIN、纯数值以及 PWD / OLDPWD 工作目录变量不会被处理。在服务器运行时事件正文中,凭据命名密钥(client_secret、db_password、token 等)下的字符串值会被整体脱敏。与每个内置模式一样,它们都可以按名称单独禁用。

禁用单个内置模式

{
  "CLAUDE_MEM_REDACT_ENABLED": "true",
  "CLAUDE_MEM_REDACT_DISABLED_BUILTINS": "jwt,slack_token"
}

CSV 格式。其他内置模式保持启用。

添加自定义模式

{
  "CLAUDE_MEM_REDACT_ENABLED": "true",
  "CLAUDE_MEM_REDACT_CUSTOM_PATTERNS": "[{\"name\":\"company_internal_token\",\"regex\":\"INTERNAL-[A-Z0-9]{32}\"}]"
}

name 是必填项,并会显示在 <redacted type='...'/> 标记中。自定义模式会在内置模式之前评估,因此你可以覆盖特定令牌族的內置检测。

如果你的 regex 无法编译,或 JSON 格式错误,claude-mem 会记录一条警告并跳过损坏的条目——其余条目继续工作。

诊断日志

{
  "CLAUDE_MEM_REDACT_LOG_MATCHES": "true"
}

每次调用时向 worker 日志写入一行 pattern,count。原始匹配到的字节永远不会被记录。

限制

  • 超大字段安全失败:单个字段超过约 1M 字符(UTF-16 码元)时,会整体替换为 <redacted type='oversize'/>,而不是未扫描地存储,并记录一条警告。匹配数量没有上限:每个匹配都会被脱敏。
  • 覆盖缺口:内置模式不覆盖 Azure / GCP service-account JSON / IBM Cloud / 私有 IDC 令牌——请为这些场景使用自定义模式。
  • 不可读的 settings.json:如果文件在脱敏开启时无法解析(例如手动编辑出错),claude-mem 会继续使用最后成功加载的配置或内置模式进行脱敏,并记录一条警告。它不会回退到默认值(关闭)。修复文件以更改配置,或在环境中设置 CLAUDE_MEM_REDACT_ENABLED=false 以关闭脱敏。
  • server-beta 范围:在多租户 server-beta 部署中,脱敏配置目前是从 worker 本地的 ~/.claude-mem/settings.json 读取,而不是从租户级设置读取。对于团队部署,请在 worker 级别配置脱敏。未来的变更将改为使用租户级脱敏配置。
  • 破坏性:这是破坏性替换,而不是加密。被脱敏的字节无法恢复。如果你需要可逆的保护,请使用 <private> 标签,并让机密完全不出现在对话中。

与 <private> 标签的对比

<private>(手动) 自动脱敏
触发方式 用户用 <private>...</private> 包裹内容 在内容任意位置进行 Regex 匹配
粒度 整个块被丢弃 行内占位符,保留周围内容
默认行为 始终开启(无需设置) 默认关闭,直到你主动启用
适用场景 你事先知道内容属于敏感信息 你希望为意外泄露的 Token 提供安全网

两者可以同时使用 — <private> 块会先被移除,然后自动脱敏会扫描剩余内容,因此无论 <private> 块内部包含什么,其内容都会被完全移除。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/claude-mem