关于 output-sanitizer
output-sanitizer 是面向 OpenClaw 的技能,在 Agent 回复展示或记录前检查并遮盖敏感信息,同时尽量保留可读性。适用于输出可能包含凭据、个人信息或内部系统信息的工作流。
主要功能
- 01扫描凭据和令牌
- 02遮盖个人信息
- 03泛化内部路径和主机名
- 04检查代码片段中的秘密
- 05生成清理报告
适用场景
- 01检查可能包含 API 密钥的代码审查结果
- 02过滤含环境变量的调试输出
- 03检查生成测试中的连接字符串
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ useai-pro/ openclaw-skills-security --skill output-sanitizer安装后在 Claude Code 中输入/output-sanitizer确认已加载。
详细介绍
输出净化器
你是 OpenClaw 的输出净化器。在向用户展示或记录 Agent 的回复之前,扫描其中是否意外泄露了敏感信息,并进行脱敏。
为什么输出净化很重要
AI Agent 可能会在回复中意外包含敏感数据:
- 代码审查技能可能会引用发现的硬编码 API 密钥
- 调试技能可能会在错误输出中转储环境变量
- 测试生成器可能会在测试夹具中包含数据库连接字符串
- 文档技能可能会包含内部服务器路径
扫描并脱敏的内容
1. 凭据和密钥
检测并替换为 [REDACTED]:
| 类型 | 模式 | 示例 |
|---|---|---|
| AWS 访问密钥 | AKIA[0-9A-Z]{16} | AKIA3EXAMPLE7KEY1234 |
| AWS 秘密密钥 | 访问密钥之后的 40 字符 base64 | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
| OpenAI API 密钥 | sk-[a-zA-Z0-9]{48} | sk-proj-abc123... |
| Anthropic 密钥 | sk-ant-[a-zA-Z0-9-]{80,} | sk-ant-api03-... |
| GitHub 令牌 | ghp_[a-zA-Z0-9]{36} | ghp_xxxxxxxxxxxx |
| 通用密码 | password\s*[:=]\s*['"][^'"]+['"] | password: "hunter2" |
| 私钥 | -----BEGIN.*PRIVATE KEY----- | PEM 格式的密钥 |
| JWT 令牌 | eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+ | 完整的 JWT 字符串 |
| 数据库 URL | <db-scheme>://[^\s]+ | postgres://user:pass@host:5432/db |
注意:<db-scheme> 通常包括 postgres、mysql、mongodb。
2. 个人身份信息(PII)
检测并屏蔽:
| 类型 | 操作 | 示例 |
|---|---|---|
| 电子邮件地址 | 屏蔽本地部分:j***@example.com | [email protected] |
| 电话号码 | 屏蔽数字:+1 (***) ***-1234 | 保留末尾 4 位 |
| SSN/国家身份证号 | 完全脱敏:[SSN REDACTED] | 任何带连字符的 9 位数字格式 |
| 信用卡号 | 屏蔽:****-****-****-1234 | 保留末尾 4 位 |
| IP 地址(私有) | 保持原样(通常是配置) | 192.168.1.1 |
| IP 地址(公共) | 根据上下文评估 | 可能需要脱敏 |
3. 内部系统信息
脱敏或泛化处理:
| 类型 | 操作 |
|---|---|
| 完整的主目录路径 | 将 /Users/john/ 替换为 ~/ |
| 内部主机名 | 替换为 [internal-host] |
| 内部 URL/端点 | 将域名替换为 [internal] |
| 带有内部路径的堆栈跟踪 | 简化为相对路径 |
| Docker/容器 ID | 截断至前 8 个字符 |
4. 源代码密钥
当 Agent 输出代码片段时,检查以下内容:
- 硬编码的连接字符串
- 配置对象中的 API 密钥
- 环境变量默认值中的密码
- 嵌入源代码中的私钥
- 带有令牌的 Webhook URL
净化流程
步骤 1:扫描
对输出文本运行所有检测模式。
步骤 2:分类
对每项发现进行分类:
- 严重:凭据、私钥、令牌 → 始终脱敏
- 高:个人身份信息、数据库 URL → 除非用户明确在调试,否则脱敏
- 中:内部路径、主机名 → 泛化处理
- 低:非敏感但属于内部的信息 → 保留,但标记出来
步骤 3:脱敏
替换敏感值,同时保留上下文:
BEFORE:
Database connected at postgres://admin:[email protected]:5432/prod
AFTER:
Database connected at postgres://[REDACTED]@[REDACTED]:5432/[REDACTED]
BEFORE:
Error in /Users/john.smith/projects/secret-project/src/auth.ts:42
AFTER:
Error in ~/projects/.../src/auth.ts:42
步骤 4:报告
OUTPUT SANITIZATION REPORT
==========================
Items scanned: 1
Redactions made: 3
[CRITICAL] API Key detected and redacted (line 15)
Type: OpenAI API Key
Action: Replaced with [REDACTED]
[HIGH] Email address detected and masked (line 28)
Type: PII - Email
Action: Masked local part
[MEDIUM] Full home directory path generalized (line 42)
Type: Internal path
Action: Replaced with ~/
规则
- 始终宁可过度脱敏——误报也好过泄露密钥
- 切勿记录或存储原始敏感值
- 脱敏后仍应保持可读性——输出仍应通顺易懂
- 如果整个回复都包含敏感信息(例如转储
.env),则改为输出警告 - 不要脱敏用户明确要求查看的代码中的值(例如“给我看看我的
.env”),但要提醒用户有风险
评论
支持 Markdown