安全模型概述
当你将 Clawdbot 连接到 WhatsApp、Telegram、Signal 等公开消息平台时,实际上为全世界打开了一个"入口"。任何知道你联系方式的人都可以尝试与你的 AI 对话。
核心问题:AI 应该响应哪些人的消息?
Clawdbot 采用"配对+白名单"模型,默认拒绝所有陌生人,只响应明确授权的联系人。
配对模式工作原理
默认策略:dmPolicy="pairing"
配置文件 ~/.clawdbot/config.json:
{
"channels": {
"whatsapp": {
"dmPolicy": "pairing",
"enabled": true
}
}
}
完整流程演示
步骤1:陌生人发送消息
陌生用户 (+8612345678) → "你好,能帮我查下天气吗?"
步骤2:Clawdbot 生成配对码
系统内部执行:
const pairingCode = generateCode(); // 例如:A3X7K2
await db.storePendingPairing({
code: pairingCode,
channel: 'whatsapp',
userId: '+8612345678',
timestamp: Date.now()
});
日志文件 ~/.clawdbot/logs/gateway.log 会记录:
[2026-01-27 10:30:15] PAIRING_REQUEST channel=whatsapp user=+8612345678 code=A3X7K2
步骤3:用户看不到任何回复
陌生人的消息进入"黑洞",不会收到任何反馈。
步骤4:管理员批准配对
你在控制台或命令行执行:
clawdbot pairing approve whatsapp A3X7K2
系统执行:
const pairing = await db.getPendingPairing('A3X7K2');
if (!pairing) {
console.error('配对码不存在或已过期');
return;
}
// 添加到白名单
await db.addToAllowlist({
channel: pairing.channel,
userId: pairing.userId,
approvedAt: Date.now()
});
// 删除待处理记录
await db.deletePendingPairing('A3X7K2');
console.log(`已批准 ${pairing.userId} 的访问权限`);
步骤5:用户可以正常对话
陌生人再次发送消息:
用户: 现在可以帮我查天气了吗?
AI: 当然可以。请问您想查询哪个城市的天气?
白名单数据结构
SQLite Schema
CREATE TABLE allowlist (
id INTEGER PRIMARY KEY AUTOINCREMENT,
channel TEXT NOT NULL,
user_id TEXT NOT NULL,
approved_at INTEGER NOT NULL,
approved_by TEXT,
notes TEXT,
UNIQUE(channel, user_id)
);
CREATE INDEX idx_allowlist_lookup
ON allowlist(channel, user_id);
查看当前白名单
sqlite3 ~/.clawdbot/data.db "SELECT * FROM allowlist;"
输出示例:
1|whatsapp|+8612345678|1738054215|admin|同事张三
2|telegram|@user123|1738054300|admin|客户李四
3|signal|+1234567890|1738054400||
手动管理白名单
添加:
clawdbot allowlist add whatsapp +8612345678 --note "信任的联系人"
删除:
clawdbot allowlist remove whatsapp +8612345678
列出:
clawdbot allowlist list whatsapp
开放模式配置
公开访问场景
如果你在运营一个客服 bot,需要响应所有用户:
{
"channels": {
"telegram": {
"dmPolicy": "open",
"allowFrom": ["*"]
}
}
}
"*" 表示通配符,接受所有人的消息。
风险与防护
开放模式的风险:
- API 成本失控:攻击者脚本化发送大量消息
- 数据泄露:通过社会工程学套取敏感信息
- 声誉风险:AI 被诱导说出不当言论
防护措施:
{
"channels": {
"telegram": {
"dmPolicy": "open",
"allowFrom": ["*"],
"rateLimit": {
"maxMessagesPerMinute": 10,
"maxMessagesPerHour": 100,
"banDuration": 3600
}
}
}
}
触发限流后的行为:
if (isRateLimited(userId)) {
await sendMessage(userId,
'您的消息频率过高,请在 1 小时后再试。'
);
return;
}
群聊场景配置
群聊权限独立管理
群聊和私聊使用不同的权限模型:
{
"channels": {
"whatsapp": {
"dm": {
"policy": "pairing",
"allowFrom": []
},
"group": {
"policy": "mention",
"allowedGroups": [
"120363xxxxx@g.us",
"120363yyyyy@g.us"
]
}
}
}
}
群聊响应策略
策略1:仅响应 @ 提及
{
"group": {
"replyPolicy": "mentionOnly"
}
}
行为:
用户A: 今天天气真好
Bot: (不回复)
用户B: @bot 今天天气怎么样?
Bot: 今天晴天,气温 20-25 度。
策略2:响应所有消息
{
"group": {
"replyPolicy": "all"
}
}
警告:这会让 bot 变得"话痨",可能打断正常对话。
策略3:智能模式
{
"group": {
"replyPolicy": "smart",
"keywords": ["天气", "日程", "提醒"]
}
}
行为:
用户: 明天天气怎么样?
Bot: 明天多云,气温 18-23 度。
用户: 今天吃什么?
Bot: (不回复,因为不在关键词列表中)
实战案例:家庭群助手
场景需求
- 家庭微信群(5人)
- bot 负责日程提醒、购物清单管理
- 只响应家庭成员,忽略临时加入的亲戚
配置方案
{
"channels": {
"whatsapp": {
"group": {
"policy": "whitelist",
"allowedGroups": ["120363家庭群@g.us"],
"allowedMembers": [
"+8613800138000", // 爸爸
"+8613800138001", // 妈妈
"+8613800138002", // 自己
"+8613800138003", // 配偶
"+8613800138004" // 孩子
],
"replyPolicy": "mentionOnly"
}
}
}
}
获取群组 ID
WhatsApp 群组 ID 不直观,需要通过日志获取:
# 开启调试日志
clawdbot gateway --verbose
# 在群里发一条消息 @bot
# 查看日志
tail -f ~/.clawdbot/logs/gateway.log | grep "group"
日志输出:
[DEBUG] incoming_message group=120363xxxxx@g.us from=+8613800138000
把 120363xxxxx@g.us 填入配置。
获取成员 ID
在群里让每个成员发一条消息,记录日志中的 from 字段。
动态调整白名单
添加新成员:
clawdbot allowlist add whatsapp:group:120363xxxxx@g.us +8613800138005
安全检查清单
运行诊断命令:
clawdbot doctor
输出示例:
✓ 控制台绑定到 localhost (安全)
✓ 防火墙已启用
⚠ WhatsApp DM 模式为 'open',建议改为 'pairing'
✓ Telegram 群聊已限制成员白名单
✗ Signal 未配置速率限制
建议:
1. 修改 WhatsApp DM 策略
2. 为 Signal 添加速率限制配置
审计日志
查看最近的配对请求
sqlite3 ~/.clawdbot/data.db <<SQL
SELECT
datetime(timestamp/1000, 'unixepoch', 'localtime') as time,
channel,
user_id,
code,
CASE
WHEN approved_at IS NULL THEN '待处理'
ELSE '已批准'
END as status
FROM pairing_requests
ORDER BY timestamp DESC
LIMIT 20;
SQL
查看白名单变更历史
sqlite3 ~/.clawdbot/data.db <<SQL
SELECT
datetime(approved_at/1000, 'unixepoch', 'localtime') as time,
channel,
user_id,
approved_by,
notes
FROM allowlist
ORDER BY approved_at DESC;
SQL
自动化配对脚本
批量导入联系人
创建 contacts.txt:
whatsapp,+8613800138000,同事张三
telegram,@user123,客户李四
signal,+1234567890,合作伙伴
执行脚本:
while IFS=',' read -r channel user note; do
clawdbot allowlist add "$channel" "$user" --note "$note"
done < contacts.txt
定期清理过期配对请求
#!/bin/bash
# 删除 24 小时前的未批准配对请求
sqlite3 ~/.clawdbot/data.db <<SQL
DELETE FROM pairing_requests
WHERE approved_at IS NULL
AND timestamp < $(date -d '24 hours ago' +%s)000;
SQL
echo "已清理过期的配对请求"
添加到 crontab:
crontab -e
# 每天凌晨 2 点清理
0 2 * * * /path/to/cleanup_pairing.sh
多设备同步
如果你在多台设备上运行 Clawdbot,白名单需要同步。
方案1:共享数据库
使用网络数据库(如 PostgreSQL)替代 SQLite:
{
"database": {
"type": "postgres",
"url": "postgresql://user:pass@db-server/clawdbot"
}
}
方案2:定期同步
主设备定期导出白名单:
sqlite3 ~/.clawdbot/data.db ".dump allowlist" > allowlist.sql
rsync allowlist.sql backup-server:/backups/
从设备定期导入:
rsync backup-server:/backups/allowlist.sql ./
sqlite3 ~/.clawdbot/data.db < allowlist.sql
总结
配对机制的核心原则:默认拒绝,显式授权。
关键配置决策树:
你的 bot 是?
├── 个人助手
│ └── 使用 dmPolicy="pairing"
├── 团队工具
│ └── 群聊 policy="whitelist" + 成员白名单
└── 公开服务
└── dmPolicy="open" + 速率限制 + 成本熔断
安全检查三步骤:
- 运行
clawdbot doctor检查配置 - 定期审查
allowlist表,移除不再需要的权限 - 监控日志中的
PAIRING_REQUEST事件,发现异常访问