## OpenClaw 安全模型概述
OpenClaw 作为自托管的 AI Gateway,安全是核心设计原则之一。安全模型分为多个层次:
```
┌─────────────────────────────────┐
│ 第 1 层:Gateway 认证 │ ← 谁能访问 Gateway
├─────────────────────────────────┤
│ 第 2 层:渠道安全 │ ← 谁能通过渠道对话
├─────────────────────────────────┤
│ 第 3 层:工具权限控制 │ ← 智能体能用什么工具
├─────────────────────────────────┤
│ 第 4 层:沙箱隔离 │ ← 代码在哪里执行
├─────────────────────────────────┤
│ 第 5 层:密钥管理 │ ← 敏感信息如何存储
└─────────────────────────────────┘
```
每一层都是独立的安全屏障,即使某一层被突破,其他层仍然提供保护。
## Gateway 认证
Gateway 是 OpenClaw 的核心入口,保护 Gateway 的访问权限是第一道防线。
### 认证方式
OpenClaw 支持三种 Gateway 认证方式:
#### 1. Token 认证(推荐)
使用随机生成的 Token 进行认证:
```json
{
"gateway": {
"auth": {
"type": "token",
"token": "your-secret-token-here"
}
}
}
```
生成安全的随机 Token:
```bash
openssl rand -hex 32
```
#### 2. 密码认证
使用用户名和密码:
```json
{
"gateway": {
"auth": {
"type": "password",
"username": "admin",
"password": "your-strong-password"
}
}
}
```
> ⚠️ 密码认证适合个人使用,生产环境建议使用 Token 认证。
#### 3. 可信代理认证
当 Gateway 在反向代理(如 Nginx)后面时,可以信任代理的认证:
```json
{
"gateway": {
"auth": {
"type": "trusted-proxy",
"trustedProxies": ["127.0.0.1", "10.0.0.0/8"]
}
}
}
```
> ⚠️ 只在你完全控制代理服务器时使用此方式。错误配置可能导致未授权访问。
### 认证最佳实践
- 生产环境**必须**启用认证,不要裸跑 Gateway
- Token 至少 32 字符,使用随机生成
- 定期轮换 Token(建议每 90 天)
- 不要在代码仓库中提交认证信息
## 渠道安全
渠道是用户与智能体交互的入口,需要控制谁能通过渠道对话。
### 配对机制(Pairing)
某些渠道(如 WhatsApp)使用配对机制——只有通过配对流程的设备才能与智能体通信:
```bash
# WhatsApp 配对
openclaw channels login whatsapp
# 扫描二维码完成配对
```
配对后,只有配对的手机号码才能与智能体对话。
### 白名单(Allowlist)
限制只有特定用户才能与智能体交互:
```json
{
"channels": {
"telegram": {
"allowlist": [
"123456789",
"987654321"
]
}
}
}
```
不在白名单中的用户发送消息会被忽略。
### 群组安全
在群组中,智能体默认只响应被 @ 提及的消息:
```json
{
"channels": {
"telegram": {
"groupBehavior": "mention-only"
}
}
}
```
| 模式 | 说明 |
|------|------|
| `mention-only` | 只响应 @ 提及(推荐) |
| `all` | 响应所有消息 |
| `none` | 在群组中不响应 |
## 工具权限控制
工具权限控制决定智能体能使用哪些工具,是防止智能体"越权操作"的关键。
### Allow / Deny 列表
明确允许或禁止特定工具:
```json
{
"tools": {
"allow": [
"web_search",
"read",
"write"
],
"deny": [
"exec",
"browser"
]
}
}
```
- `allow`:白名单模式,只允许列出的工具
- `deny`:黑名单模式,禁止列出的工具
- 两者同时存在时,`deny` 优先
### 工具分组
使用预定义的工具组简化配置:
```json
{
"tools": {
"allow": [
"group:fs",
"group:web"
],
"deny": [
"group:runtime"
]
}
}
```
| 工具组 | 包含的工具 | 风险等级 |
|--------|-----------|---------|
| `group:fs` | read、write、list | 中 |
| `group:web` | web_search、web_fetch | 低 |
| `group:runtime` | exec、process | 高 |
| `group:browser` | browser 系列 | 中 |
### 工具配置文件(tools.profile)
为不同场景创建工具配置文件:
```json
{
"tools": {
"profiles": {
"safe": {
"allow": ["web_search", "read"],
"deny": ["exec", "browser", "write"]
},
"developer": {
"allow": ["*"],
"deny": []
},
"readonly": {
"allow": ["read", "web_search"],
"deny": ["write", "exec", "browser"]
}
},
"activeProfile": "safe"
}
}
```
## 沙箱隔离
沙箱通过 Docker 容器隔离智能体的代码执行环境,防止恶意代码影响宿主系统。
### 启用沙箱
```json
{
"sandbox": {
"mode": "docker"
}
}
```
### 沙箱提供的隔离
| 隔离维度 | 说明 |
|----------|------|
| 文件系统 | 只能访问挂载的目录 |
| 网络 | 可配置网络访问限制 |
| 进程 | 容器内进程与宿主隔离 |
| 资源 | CPU 和内存限制 |
### 何时该用沙箱
- ✅ 运行不受信任的第三方技能
- ✅ 执行用户提供的代码
- ✅ 处理来自公开渠道的请求
- ❌ 纯文本对话(无需沙箱)
- ❌ 只使用 web_search 等安全工具
> 📖 详细配置请参考《沙箱隔离专题教程》。
## 第三方技能安全审查
安装第三方技能前,务必进行安全审查。
### 安全扫描等级
龙虾技能库为每个技能提供安全扫描结果:
| 等级 | 含义 | 建议 |
|------|------|------|
| 🟢 Pass | 未发现安全问题 | 可以放心安装 |
| 🟡 Warning | 存在潜在风险 | 仔细阅读扫描报告 |
| 🔴 Fail | 发现安全问题 | 不建议安装 |
| ⚪ Unknown | 未扫描 | 谨慎使用 |
### 审查要点
安装技能前检查以下内容:
1. **requires.bins** — 技能需要哪些系统命令
```yaml
# SKILL.md frontmatter
requires:
bins:
- docker
- git
```
如果一个"天气查询"技能要求 `docker` 和 `ssh` 权限,这就很可疑。
2. **工具权限** — 技能请求使用哪些工具
```yaml
requires:
tools:
- exec
- write
```
3. **环境变量** — 技能需要哪些敏感信息
```yaml
requires:
env:
- GITHUB_TOKEN
- DATABASE_URL
```
### 安装时限制权限
安装技能时可以限制其权限:
```bash
clawhub install some-skill --allow-tools web_search,read
```
## 密钥管理
### 环境变量
最基本的密钥管理方式——通过环境变量传递:
```bash
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
```
### Secrets 配置
在 `openclaw.json` 中使用 secrets 引用:
```json
{
"providers": {
"openai": {
"apiKey": {
"$ref": "secrets.OPENAI_API_KEY"
}
}
}
}
```
Secrets 存储在 `~/.openclaw/secrets.json`(权限应设为 600):
```json
{
"OPENAI_API_KEY": "sk-...",
"ANTHROPIC_API_KEY": "sk-ant-..."
}
```
```bash
# 设置文件权限(仅所有者可读写)
chmod 600 ~/.openclaw/secrets.json
```
### SecretRef 机制
SecretRef 允许在配置中引用密钥而不暴露明文:
```json
{
"apiKey": {
"type": "SecretRef",
"name": "OPENAI_API_KEY"
}
}
```
### 密钥管理最佳实践
| 做法 | 推荐 |
|------|------|
| 使用环境变量或 SecretRef | ✅ |
| 密钥文件权限设为 600 | ✅ |
| 定期轮换 API Key | ✅ |
| 在 .gitignore 中排除密钥文件 | ✅ |
| 在代码中硬编码密钥 | ❌ |
| 在日志中输出密钥 | ❌ |
| 在 AGENTS.md 中写入密钥 | ❌ |
## 形式化验证简介
OpenClaw 使用 **TLA+** 形式化验证来确保核心协议的正确性。
### 什么是形式化验证
形式化验证是用数学方法证明系统设计的正确性,而不仅仅依赖测试。TLA+ 是一种规范语言,可以描述系统的所有可能状态,并验证关键属性是否始终成立。
### OpenClaw 验证了什么
OpenClaw 使用 TLA+ 验证了以下关键属性:
- **消息顺序**:消息按正确顺序处理,不会乱序
- **会话一致性**:会话状态在并发操作下保持一致
- **故障恢复**:Gateway 重启后能正确恢复状态
### 对用户的意义
形式化验证意味着 OpenClaw 的核心逻辑经过了数学级别的正确性保证,而不仅仅是"测试通过了"。这在处理并发、分布式场景时尤其重要。
> 💡 形式化验证是 OpenClaw 区别于其他 AI Gateway 的重要特性之一。
## 安全检查清单
部署 OpenClaw 到生产环境前,对照以下清单检查:
- [ ] Gateway 已启用认证(Token 或密码)
- [ ] 认证 Token 至少 32 字符
- [ ] 渠道配置了白名单或配对
- [ ] 工具权限已按需配置(非 allow: *)
- [ ] 不受信任的技能在沙箱中运行
- [ ] API Key 通过环境变量或 SecretRef 管理
- [ ] secrets.json 文件权限为 600
- [ ] .gitignore 排除了所有密钥文件
- [ ] Gateway 不直接暴露到公网(使用反向代理)
- [ ] 已配置 SSL/TLS 证书
## 小结
- OpenClaw 的安全模型分为 5 层,层层防护
- Gateway 认证是第一道防线,生产环境必须启用
- 工具权限控制防止智能体越权操作
- 沙箱隔离保护宿主系统安全
- 密钥管理使用 SecretRef 或环境变量,永远不要硬编码
- 形式化验证提供数学级别的正确性保证
#安全最佳实践 #认证配置 #权限控制 #密钥管理 #龙虾技能库