前言
OpenClaw 作为一个连接多个聊天平台的 AI 网关,安全性至关重要。一旦被未授权的用户滥用,不仅可能产生高额 API 费用,还可能泄露敏感信息。本教程将从多个层面介绍如何加固 OpenClaw 的安全性,包括 Dashboard 认证、用户访问控制、速率限制和审计日志。
安全威胁概览
| 威胁类型 | 风险等级 | 说明 |
|---|---|---|
| 未授权访问 Dashboard | 高 | 攻击者可修改配置、查看对话 |
| API Key 泄露 | 高 | 他人可使用你的 API 额度 |
| 用户滥用 | 中 | 授权用户过度使用导致高费用 |
| 对话内容泄露 | 中 | 对话记录被未授权访问 |
| DDoS 攻击 | 中 | 服务被恶意请求淹没 |
| 注入攻击 | 低 | 恶意提示词操纵 AI 行为 |
第一步:Dashboard 认证
1.1 启用密码认证
默认情况下 Dashboard 可能没有密码保护。立即配置:
{
dashboard: {
enabled: true,
port: 18789,
auth: {
enabled: true,
username: "admin",
password: "${OPENCLAW_DASHBOARD_PASSWORD}", // 使用环境变量
}
}
}
设置环境变量:
# 生成强密码
openssl rand -base64 32
# 输出类似:K7x9mP2vQ4wR1tY6uI3oA8sD5fG0hJ=
# 添加到环境变量
echo 'export OPENCLAW_DASHBOARD_PASSWORD="K7x9mP2vQ4wR1tY6uI3oA8sD5fG0hJ="' >> ~/.bashrc
source ~/.bashrc
1.2 配置 Session 管理
{
dashboard: {
auth: {
enabled: true,
username: "admin",
password: "${OPENCLAW_DASHBOARD_PASSWORD}",
session: {
timeout: 3600, // Session 过期时间(秒),1小时
maxSessions: 3, // 最多同时登录数
secureCookie: true, // 仅通过 HTTPS 发送 Cookie
}
}
}
}
1.3 多用户管理
如果有团队需要管理 OpenClaw:
{
dashboard: {
auth: {
enabled: true,
users: [
{
username: "admin",
password: "${ADMIN_PASSWORD}",
role: "admin", // 完全控制权
},
{
username: "operator",
password: "${OPERATOR_PASSWORD}",
role: "operator", // 可查看日志和状态,不能修改配置
},
{
username: "viewer",
password: "${VIEWER_PASSWORD}",
role: "viewer", // 只读权限
}
]
}
}
}
角色权限对比:
| 权限 | admin | operator | viewer |
|---|---|---|---|
| 查看 Dashboard | ✓ | ✓ | ✓ |
| 查看日志 | ✓ | ✓ | ✓ |
| 查看对话记录 | ✓ | ✓ | ✗ |
| 修改配置 | ✓ | ✗ | ✗ |
| 管理用户 | ✓ | ✗ | ✗ |
| 重启服务 | ✓ | ✓ | ✗ |
第二步:API Key 保护
2.1 环境变量存储(必须)
永远不要将 API Key 明文写在配置文件中:
// 错误示范 ✗
{
models: {
openai: {
apiKey: "sk-proj-abc123..." // 不要这样做!
}
}
}
// 正确做法 ✓
{
models: {
openai: {
apiKey: "${OPENAI_API_KEY}" // 通过环境变量引用
}
}
}
2.2 文件权限控制
# 限制配置文件权限
chmod 600 ~/.config/openclaw/openclaw.json5
# 确认文件所有者
chown $(whoami) ~/.config/openclaw/openclaw.json5
# 检查权限
ls -la ~/.config/openclaw/openclaw.json5
# 应该显示 -rw------- (仅所有者可读写)
2.3 Git 排除
如果你用 Git 管理配置,确保敏感文件被排除:
# 在 .gitignore 中添加
echo "openclaw.json5" >> ~/.config/openclaw/.gitignore
echo ".env" >> ~/.config/openclaw/.gitignore
echo "*.key" >> ~/.config/openclaw/.gitignore
echo "*.pem" >> ~/.config/openclaw/.gitignore
第三步:用户白名单/黑名单
3.1 用户白名单(推荐)
只允许指定用户使用 AI 助手:
{
accessControl: {
mode: "whitelist", // whitelist 或 blacklist
whitelist: {
telegram: [
"123456789", // Telegram 用户 ID
"987654321",
],
whatsapp: [
"+8613800138000", // WhatsApp 手机号
"+8613900139000",
],
discord: [
"112233445566778899", // Discord 用户 ID
]
},
denyMessage: "抱歉,你没有使用该助手的权限。请联系管理员。",
}
}
3.2 用户黑名单
如果大部分用户都可以使用,只需屏蔽个别用户:
{
accessControl: {
mode: "blacklist",
blacklist: {
telegram: [
"111111111", // 被封禁的用户
],
global: [
"[email protected]", // 全频道封禁
]
},
blockMessage: "你的访问权限已被暂停。",
}
}
3.3 群组权限控制
对于群组中的机器人,可以限制哪些群组允许使用:
{
accessControl: {
groups: {
telegram: {
allowedGroups: [
"-1001234567890", // 允许的群组 ID
"-1009876543210",
],
allowPrivate: true, // 允许私聊
},
discord: {
allowedServers: [
"1234567890123456", // 允许的服务器 ID
],
allowedChannels: [
"9876543210987654", // 允许的频道 ID(更精细)
]
}
}
}
}
第四步:速率限制
4.1 全局速率限制
防止任何单个用户过度使用:
{
rateLimit: {
global: {
maxRequestsPerMinute: 30, // 全局每分钟最多 30 次请求
maxRequestsPerHour: 500, // 全局每小时最多 500 次
maxRequestsPerDay: 5000, // 全局每天最多 5000 次
}
}
}
4.2 按用户速率限制
{
rateLimit: {
perUser: {
maxRequestsPerMinute: 5, // 每用户每分钟 5 次
maxRequestsPerHour: 60, // 每用户每小时 60 次
maxRequestsPerDay: 500, // 每用户每天 500 次
cooldownMessage: "你发送消息太频繁了,请稍后再试。",
}
}
}
4.3 分级速率限制
为不同用户组设定不同限制:
{
rateLimit: {
tiers: {
vip: {
users: ["123456789", "+8613800138000"],
maxRequestsPerMinute: 20,
maxRequestsPerDay: 2000,
},
standard: {
default: true, // 未指定的用户使用此级别
maxRequestsPerMinute: 5,
maxRequestsPerDay: 200,
},
restricted: {
users: ["987654321"],
maxRequestsPerMinute: 1,
maxRequestsPerDay: 20,
}
}
}
}
第五步:IP 限制
5.1 Dashboard IP 白名单
只允许特定 IP 访问 Dashboard:
{
dashboard: {
auth: {
enabled: true,
username: "admin",
password: "${OPENCLAW_DASHBOARD_PASSWORD}",
},
ipWhitelist: [
"203.0.113.0/24", // 你的办公室 IP 段
"198.51.100.1", // 你的家庭 IP
"127.0.0.1", // 本地访问
]
}
}
5.2 使用防火墙限制
系统层面的 IP 限制更加可靠:
# 使用 ufw(Ubuntu)
sudo ufw allow from 203.0.113.0/24 to any port 18789
sudo ufw deny 18789
# 使用 iptables
sudo iptables -A INPUT -p tcp --dport 18789 -s 203.0.113.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 18789 -j DROP
5.3 Fail2ban 防暴力破解
配置 Fail2ban 自动封禁多次登录失败的 IP:
sudo apt install fail2ban
创建 OpenClaw 的 Fail2ban 规则:
sudo nano /etc/fail2ban/jail.d/openclaw.conf
[openclaw]
enabled = true
port = 18789
filter = openclaw
logpath = /var/log/openclaw/access.log
maxretry = 5
findtime = 600
bantime = 3600
创建过滤器:
sudo nano /etc/fail2ban/filter.d/openclaw.conf
[Definition]
failregex = ^.*authentication failed.*from <HOST>.*$
ignoreregex =
sudo systemctl restart fail2ban
第六步:审计日志
6.1 启用详细日志
{
logging: {
level: "info", // debug, info, warn, error
file: "/var/log/openclaw/openclaw.log",
audit: {
enabled: true,
file: "/var/log/openclaw/audit.log",
events: [
"auth.login", // 登录事件
"auth.failed", // 登录失败
"config.change", // 配置修改
"user.blocked", // 用户被阻止
"rateLimit.exceeded", // 速率限制触发
"message.received", // 收到消息(可选,量大)
]
}
}
}
6.2 日志轮转
防止日志文件无限增长:
sudo nano /etc/logrotate.d/openclaw
/var/log/openclaw/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 openclaw openclaw
postrotate
openclaw restart > /dev/null 2>&1 || true
endscript
}
6.3 查看审计日志
# 查看最近的审计事件
openclaw logs --audit --since 24h
# 筛选登录失败事件
openclaw logs --audit --filter "auth.failed"
# 查看特定用户的活动
openclaw logs --audit --user "123456789"
第七步:安全最佳实践清单
部署前检查
# 运行安全检查
openclaw doctor --security
安全清单
| 检查项 | 状态 | 说明 |
|---|---|---|
| Dashboard 密码已设置 | □ | 使用强密码,至少 16 位 |
| API Key 使用环境变量 | □ | 不在配置文件中明文存储 |
| 配置文件权限 600 | □ | 仅所有者可读写 |
| HTTPS 已启用 | □ | 生产环境必须 |
| 用户白名单已配置 | □ | 限制谁可以使用 |
| 速率限制已启用 | □ | 防止滥用 |
| 审计日志已启用 | □ | 记录关键操作 |
| 防火墙已配置 | □ | 仅开放必要端口 |
| 自动更新已启用 | □ | 及时修复安全漏洞 |
| 定期备份 | □ | 防止数据丢失 |
定期安全维护
# 每周:检查审计日志中的异常
openclaw logs --audit --since 7d --filter "auth.failed"
# 每月:更新 OpenClaw 到最新版本
npm update -g openclaw@latest
# 每月:轮换 Dashboard 密码
# 更新环境变量中的密码后重启
# 每季度:审查白名单,移除不活跃用户
常见问题
忘记 Dashboard 密码
# 直接修改环境变量中的密码
export OPENCLAW_DASHBOARD_PASSWORD="新密码"
openclaw restart
误封自己的 IP
# 通过 SSH 登录服务器后
# 如果是 Fail2ban 封的
sudo fail2ban-client set openclaw unbanip 你的IP
# 如果是配置文件的 IP 白名单
# 编辑配置文件添加你的 IP,然后重启
openclaw restart
速率限制过于严格
观察日志中 rateLimit.exceeded 事件的频率,适当调整:
openclaw logs --audit --filter "rateLimit.exceeded" --since 24h
根据实际使用情况调整限制值。
小结
安全加固是运行生产级 OpenClaw 实例的必备步骤。核心措施包括:启用 Dashboard 认证、通过环境变量保护 API Key、配置用户白名单、设置速率限制、启用审计日志。这些措施并不复杂,但能极大提升安全性。建议按照本文的安全清单逐项检查和配置,确保你的 AI 助手在安全可控的环境下运行。