Clawdbot DM 安全机制实战配置指南

171 阅读2分钟

安全模型概述

当你将 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": ["*"]
    }
  }
}

"*" 表示通配符,接受所有人的消息。

风险与防护

开放模式的风险:

  1. API 成本失控:攻击者脚本化发送大量消息
  2. 数据泄露:通过社会工程学套取敏感信息
  3. 声誉风险: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" + 速率限制 + 成本熔断

安全检查三步骤:

  1. 运行 clawdbot doctor 检查配置
  2. 定期审查 allowlist 表,移除不再需要的权限
  3. 监控日志中的 PAIRING_REQUEST 事件,发现异常访问