5.1 Exec Approvals 设计哲学
5.1.1 核心安全理念
OpenClaw Node 的安全设计基于一个核心认知:AI Agent 是"受信任但需验证"的操作者。
设计原则:
-
最小权限原则:
- 默认拒绝所有命令
- 仅显式允许的 command 可执行
- 权限按 Agent 隔离,避免横向扩散
-
纵深防御:
- 多层安全检查(网络层、应用层、命令层)
- 任何一层失败都阻止执行
- 不依赖单一安全机制
-
可追溯性:
- 所有命令执行记录日志
- 可追溯到具体 Agent、会话、时间
- 支持事后审计和取证
-
人机协作:
- 高风险命令需要人工审批
- AI 可以建议,人类做最终决定
- 审批决策可学习、可优化
5.1.2 安全级别定义
Exec Approvals 定义了三个安全级别:
| 级别 | 配置 | 行为 | 适用场景 |
|---|---|---|---|
| deny | security: "deny" |
拒绝所有命令 | 高安全环境、测试验证 |
| allowlist | security: "allowlist" |
仅允许白名单命令 | 生产环境(推荐) |
| full | security: "full" |
允许所有命令 | 隔离沙箱、完全信任 |
配置示例:
json
{
"version": 1,
"defaults": {
"security": "allowlist",
"ask": "on-miss",
"askFallback": "deny"
}
}
各级别详解:
1. deny(拒绝所有):
json
{
"security": "deny"
}
- 所有
system.run请求都被拒绝 - 适用于:新部署验证、安全审计期间、高风险操作前
2. allowlist(白名单):
json
{
"security": "allowlist",
"allowlist": [
{
"id": "safe-001",
"pattern": "/usr/bin/git",
"args": ["status", "log", "diff"],
"description": "只读 Git 操作"
},
{
"id": "safe-002",
"pattern": "/opt/homebrew/bin/npm",
"args": ["test", "run build"],
"description": "测试和构建"
}
]
}
- 仅白名单中的命令可执行
- 支持参数级别的精细控制
- 适用于:绝大多数生产场景
3. full(完全开放):
json
{
"security": "full"
}
- 所有命令都可以执行
- 极度危险,仅限隔离沙箱使用
- 适用于:本地开发、完全隔离的测试环境
5.1.3 审批模式
当命令不在白名单时,有三种处理模式:
| 模式 | 配置 | 行为 | 适用场景 |
|---|---|---|---|
| off | ask: "off" |
直接拒绝,不询问 | 自动化场景、无人值守 |
| on-miss | ask: "on-miss" |
仅未命中时询问 | 平衡安全与效率(推荐) |
| always | ask: "always" |
每次都询问 | 高风险操作、学习阶段 |
审批流程:
命令请求
↓
检查白名单
↓
命中 → 执行
↓
未命中 → 检查 ask 模式
↓
ask=off → 拒绝,记录日志
ask=on-miss → 发送审批请求 → 等待人工响应
ask=always → 发送审批请求 → 等待人工响应
↓
人工批准 → 执行,可选加入白名单
人工拒绝 → 拒绝,记录原因
5.1.4 文件绑定机制
问题场景:
时间线:
T0: Agent 请求执行 "node script.js"
T1: 用户审查 script.js,确认安全,批准
T2: 攻击者篡改 script.js(注入恶意代码)
T3: Agent 执行被篡改的 script.js → 系统被攻破
文件绑定解决方案:
T0: Agent 请求执行 "node script.js"
T1: Exec Approvals 计算哈希:sha256("script.js") = "abc123..."
T2: 批准时记录:{ command: "node script.js", hash: "abc123..." }
T3: 执行前重新计算哈希
T4: 哈希匹配 → 执行
哈希不匹配 → 拒绝,告警
配置示例:
json
{
"version": 1,
"defaults": {
"security": "allowlist",
"fileBinding": {
"enabled": true,
"algorithm": "sha256",
"maxFileSize": "1MB",
"extensions": [".js", ".py", ".sh", ".rb"]
}
}
}
限制与注意事项:
- 仅适用于单个或少量文件
- 对于复杂项目(如
npm test依赖 node_modules),无法完全绑定 - 建议结合沙箱和容器化使用
5.2 安全配置基线
5.2.1 推荐配置模板
生产环境基线:
json
// ~/.openclaw/exec-approvals.json
{
"version": 1,
"defaults": {
"security": "allowlist",
"ask": "on-miss",
"askFallback": "deny",
"autoAllowSkills": false,
"fileBinding": {
"enabled": true,
"algorithm": "sha256",
"maxFileSize": "1MB"
}
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"allowlist": [
{
"id": "read-only-001",
"pattern": "/usr/bin/cat",
"args": ["*"],
"description": "读取文件内容"
},
{
"id": "read-only-002",
"pattern": "/usr/bin/ls",
"args": ["-la", "*"],
"description": "列出目录内容"
},
{
"id": "dev-001",
"pattern": "/opt/homebrew/bin/git",
"args": ["status", "log", "diff", "pull"],
"description": "Git 只读操作"
},
{
"id": "dev-002",
"pattern": "/opt/homebrew/bin/npm",
"args": ["test", "run build", "run lint"],
"description": "开发和测试"
}
]
}
},
"audit": {
"enabled": true,
"logPath": "~/.openclaw/logs/exec-audit.jsonl",
"retention": "90d",
"includeCommandOutput": true,
"alertOnDeny": true
}
}
5.2.2 分级配置策略
按环境分级:
| 环境 | security | ask | 说明 |
|---|---|---|---|
| 生产 | allowlist | on-miss | 严格白名单,未命中时询问 |
| 预发布 | allowlist | off | 白名单内自动执行 |
| 开发 | allowlist | off | 更宽松的白名单 |
| 沙箱 | full | off | 完全开放,隔离环境 |
按 Agent 分级:
json
{
"agents": {
"production-bot": {
"security": "allowlist",
"ask": "always",
"allowlist": [
// 仅限最安全的命令
]
},
"dev-bot": {
"security": "allowlist",
"ask": "on-miss",
"allowlist": [
// 包含开发相关命令
]
},
"sandbox-bot": {
"security": "full",
"ask": "off"
// 完全开放,仅限沙箱
}
}
}
5.2.3 白名单最佳实践
1. 使用绝对路径:
json
// ✅ 推荐
{
"pattern": "/opt/homebrew/bin/npm"
}
// ❌ 避免
{
"pattern": "npm"
}
2. 限制参数范围:
json
// ✅ 推荐:明确允许的参数
{
"pattern": "/usr/bin/docker",
"args": ["build", "run", "push"],
"description": "Docker 构建和推送"
}
// ❌ 避免:允许任意参数
{
"pattern": "/usr/bin/docker",
"args": ["*"]
}
3. 添加描述和标签:
json
{
"id": "cicd-001",
"pattern": "/opt/homebrew/bin/npm",
"args": ["ci", "test", "run build"],
"description": "CI/CD 构建和测试流程",
"tags": ["cicd", "npm", "safe"],
"owner": "devops-team",
"createdAt": "2026-03-27",
"reviewedBy": "security-team"
}
4. 定期审查和清理:
bash
# 查看使用频率
openclaw approvals list --usage
# 删除未使用的条目(90 天未使用)
openclaw approvals cleanup --unused-days 90
# 导出审计报告
openclaw approvals export --format json > approvals-audit.json
5.2.4 环境变量安全
危险环境变量过滤:
json
{
"envFilter": {
"blocked": [
"AWS_SECRET_ACCESS_KEY",
"GCP_PRIVATE_KEY",
"AZURE_CLIENT_SECRET",
"DATABASE_PASSWORD",
"API_KEY",
"PRIVATE_KEY"
],
"allowed": [
"NODE_ENV",
"CI",
"PATH"
]
}
}
推荐做法:
- 使用密钥管理工具(1Password、Vault)
- 通过环境变量注入,不硬编码
- 定期轮换密钥
- 审计密钥访问日志
5.3 沙箱隔离机制
5.3.1 沙箱层级
OpenClaw 支持多层沙箱隔离:
┌─────────────────────────────────────────────────────────────┐
│ Level 1: 进程沙箱 │
│ - 独立用户权限 │
│ - 资源限制(CPU、内存) │
│ - 文件系统隔离 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Level 2: 容器沙箱 (Docker) │
│ - 完整容器隔离 │
│ - 网络策略 │
│ - 卷挂载控制 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Level 3: 虚拟机沙箱 │
│ - 完全隔离的 OS │
│ - 硬件级隔离 │
│ - 快照和回滚 │
└─────────────────────────────────────────────────────────────┘
5.3.2 进程沙箱配置
用户权限隔离:
bash
# 创建专用用户
sudo useradd -r -s /bin/false openclaw-sandbox
# 限制 sudo 权限
sudo visudo
# 添加:
openclaw-sandbox ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/git
资源限制:
bash
# /etc/security/limits.conf
openclaw-sandbox soft cpu 3600
openclaw-sandbox hard cpu 7200
openclaw-sandbox soft nofile 1024
openclaw-sandbox hard nofile 4096
openclaw-sandbox soft memlock 512000
openclaw-sandbox hard memlock 512000
5.3.3 Docker 容器沙箱
Docker 配置示例:
dockerfile
# Dockerfile.sandbox
FROM node:22-alpine
# 创建非 root 用户
RUN addgroup -g 1001 -S openclaw && \
adduser -u 1001 -S openclaw -G openclaw
# 设置工作目录
WORKDIR /workspace
# 限制权限
USER openclaw
# 只读文件系统
READONLY true
# 资源限制
# docker run --memory="512m" --cpus="1.0"
运行配置:
yaml
# docker-compose.sandbox.yml
version: '3.8'
services:
openclaw-sandbox:
image: openclaw-sandbox:latest
container_name: openclaw-execution
user: "1001:1001"
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
networks:
- sandbox-net
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
networks:
sandbox-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
gateway: 172.20.0.1
5.3.4 文件系统隔离
挂载策略:
json
{
"filesystem": {
"readOnlyPaths": [
"/usr",
"/bin",
"/opt"
],
"writablePaths": [
"/workspace/project"
],
"blockedPaths": [
"/etc/passwd",
"/etc/shadow",
"/root",
"/home"
],
"tmpfsPaths": [
"/tmp",
"/var/tmp"
]
}
}
5.4 审计与合规
5.4.1 审计日志格式
日志条目示例:
json
{
"timestamp": "2026-03-27T10:30:00.000Z",
"sessionId": "session-abc123",
"agentId": "main",
"nodeId": "node-prod-01",
"command": {
"cmd": "npm",
"args": ["test"],
"cwd": "/workspace/project",
"env": {
"NODE_ENV": "test"
}
},
"approval": {
"type": "allowlist",
"ruleId": "dev-002",
"approvedBy": "system",
"approvedAt": "2026-03-27T10:29:59.000Z"
},
"execution": {
"status": "success",
"exitCode": 0,
"duration": 12345,
"outputLength": 5678
},
"fileBinding": {
"checked": true,
"files": [
{
"path": "package.json",
"hash": "sha256:abc123...",
"matched": true
}
]
},
"risk": {
"score": 0.1,
"level": "low",
"factors": ["allowlist_match", "known_command"]
}
}
5.4.2 实时告警
告警规则配置:
yaml
# alerting-rules.yaml
rules:
- name: "高风险命令执行"
condition: "risk.score > 0.8"
action: "slack_alert"
channel: "#security-alerts"
- name: "审批拒绝"
condition: "approval.status == 'denied'"
action: "email_alert"
recipients: ["security@company.com"]
- name: "异常执行频率"
condition: "execution.count > 100 in 5 minutes"
action: "pagerduty_alert"
severity: "warning"
- name: "文件哈希不匹配"
condition: "fileBinding.matched == false"
action: "slack_alert + block_session"
channel: "#security-alerts"
5.4.3 合规报告
自动生成合规报告:
bash
# 生成月度合规报告
openclaw audit report \
--from 2026-02-01 \
--to 2026-02-29 \
--format pdf \
--output compliance-report-2026-02.pdf
报告内容:
- 命令执行统计(总数、成功率、平均耗时)
- 审批统计(自动批准、人工批准、拒绝)
- 高风险操作清单
- 异常事件汇总
- 合规性评分
5.5 应急响应流程
5.5.1 事件分级
| 级别 | 定义 | 响应时间 | 示例 |
|---|---|---|---|
| P0 | 严重安全事件 | <5 分钟 | 未授权命令执行、数据泄露 |
| P1 | 高影响事件 | <15 分钟 | 大规模服务中断、配置错误 |
| P2 | 中等影响事件 | <1 小时 | 单点故障、性能下降 |
| P3 | 低影响事件 | <24 小时 | 小错误、文档问题 |
5.5.2 应急响应流程
┌─────────────────────────────────────────────────────────────┐
│ P0/P1 事件应急响应流程 │
└─────────────────────────────────────────────────────────────┘
1. 检测与告警
└─> 监控系统检测到异常
└─> 自动发送告警(Slack + PagerDuty + 邮件)
└─> 创建事件工单
2. 初步评估(5 分钟内)
└─> 值班工程师确认事件
└─> 评估影响范围和严重程度
└─> 确定事件级别(P0/P1)
└─> 启动应急响应群
3. 遏制(15 分钟内)
└─> 隔离受影响的 Node
└─> 暂停相关 Agent
└─> 撤销可疑会话
└─> 保存现场证据
4. 根除(1 小时内)
└─> 分析根本原因
└─> 修复安全漏洞
└─> 更新安全策略
└─> 验证修复效果
5. 恢复(2 小时内)
└─> 逐步恢复服务
└─> 监控关键指标
└─> 确认服务正常
6. 事后总结(24 小时内)
└─> 编写事件报告
└─> 召开复盘会议
└─> 制定改进措施
└─> 更新应急预案
5.5.3 紧急禁用机制
一键禁用所有 Node:
bash
# 禁用所有 Hooks
openclaw hooks disable --all
# 暂停所有 Agent
openclaw agents pause --all
# 撤销所有活跃会话
openclaw sessions revoke --all
紧急联系人:
json
{
"emergencyContacts": [
{
"name": "安全负责人",
"role": "security-lead",
"phone": "+1-xxx-xxx-xxxx",
"email": "security@company.com",
"slack": "@security-lead"
},
{
"name": "运维负责人",
"role": "ops-lead",
"phone": "+1-xxx-xxx-xxxx",
"email": "ops@company.com",
"slack": "@ops-lead"
}
]
}
本章小结
本章详细介绍了 OpenClaw Node 的安全与审批机制:
-
Exec Approvals 设计哲学:基于"受信任但需验证"理念,采用最小权限、纵深防御、可追溯性、人机协作四大原则。
-
安全配置基线:提供了生产环境推荐配置模板,支持按环境和 Agent 分级配置,白名单最佳实践包括绝对路径、参数限制、描述标签、定期审查。
-
沙箱隔离机制:三层沙箱(进程、容器、虚拟机),配合文件系统隔离和资源限制,确保即使命令执行失败也不会影响主机安全。
-
审计与合规:详细的审计日志格式、实时告警规则、自动合规报告,满足企业审计和合规要求。
-
应急响应流程:明确的事件分级、标准化的响应流程、一键禁用机制,确保安全事件能够快速有效处置。
安全配置检查清单:
- 生产环境使用
security: "allowlist" - 配置
ask: "on-miss"平衡安全与效率 - 启用文件绑定机制
- 配置审计日志,保留 90 天+
- 设置实时告警规则
- 定期审查白名单(每季度)
- 制定应急响应流程并演练
- 配置紧急联系人
参考文献:
- OpenClaw Official Documentation. "Exec Approvals." https://docs.openclaw.ai/tools/exec-approvals/
- OpenClaw Official Documentation. "Security Best Practices." https://docs.openclaw.ai/gateway/security/
- LinkedIn. "OpenClaw Security Best Practices." https://www.linkedin.com/posts/sunilpaul_openclaw-aisecurity-agenticai-activity-7435129003344269312-2tsx
- LumaDock VPS. "OpenClaw Security Best Practices Guide." https://lumadock.com/tutorials/openclaw-security-best-practices-guide
- SpaceO. "6 OpenClaw Security Best Practices for Workflow Automation." https://www.spaceo.ai/blog/openclaw-security-best-practices/
- GitHub Issue #22176. "Headless node host to execute system.run commands." https://github.com/openclaw/openclaw/issues/22176