第 33 章

生产安全加固:最小权限配置、Skills 审计流程与 security audit 命令

第33章:生产安全加固——最小权限配置、Skills 审计流程与 security audit 命令

"安全不是一个功能,而是一种属性。它需要在每一层设计决策中被考虑,而不是在最后作为补丁打上去。" —— OpenClaw 安全加固最佳实践指南,2026年


33.1 纵深防御:多层安全的设计哲学

在经历了 ClawBleed 和 ClawHavoc 两次重大安全事件之后,OpenClaw 社区逐渐形成了一套基于**纵深防御(Defense in Depth)**的安全加固体系。

纵深防御的核心思想是:假设每一层防御都会被攻破,因此设计多层独立的防御措施,使攻击者需要同时突破所有层才能成功

OpenClaw 纵深防御层次模型
┌─────────────────────────────────────────────────────┐
│ 层1:网络层                                          │
│   VPN/Tailscale + 防火墙 + loopback 绑定            │
├─────────────────────────────────────────────────────┤
│ 层2:认证层                                          │
│   强 Token(64字符)+ 会话超时 + IP 白名单           │
├─────────────────────────────────────────────────────┤
│ 层3:授权层                                          │
│   工具最小权限 + Skills allowlist + 沙箱             │
├─────────────────────────────────────────────────────┤
│ 层4:配置层                                          │
│   allow_url_actions:false + 安全 SECRET_KEY 存储     │
├─────────────────────────────────────────────────────┤
│ 层5:审计层                                          │
│   结构化日志 + 告警 + 定期 security audit            │
└─────────────────────────────────────────────────────┘

33.2 完整生产安全配置文件

以下是一份适用于生产环境的完整 openclaw.json 安全配置文件,涵盖所有安全加固选项:

{
  "version": "2026.1",
  "_comment": "生产环境安全配置 - 请勿在开发环境中直接使用此配置",
  
  "gateway": {
    "bind": "loopback",
    "port": 18789,
    "auth": {
      "token": "<用 openssl rand -hex 32 生成的 64 字符 Token>",
      "tokenRotationDays": 90,
      "sessionTimeoutMinutes": 60,
      "maxConcurrentSessions": 5
    },
    "cors": {
      "allowedOrigins": ["http://localhost:3000"],
      "allowCredentials": false
    },
    "rateLimit": {
      "requestsPerMinute": 60,
      "burstSize": 10
    },
    "tls": {
      "enabled": true,
      "certFile": "/etc/openclaw/tls/server.crt",
      "keyFile": "/etc/openclaw/tls/server.key"
    }
  },

  "sandbox": "all",
  
  "tools": {
    "allow": [
      "read",
      "write",
      "browser.search",
      "browser.navigate"
    ],
    "deny": [
      "exec",
      "apply_patch",
      "system.run",
      "system.which",
      "python",
      "node",
      "bash"
    ],
    "fileAccess": {
      "allowedPaths": [
        "~/Documents/openclaw-workspace",
        "/tmp/openclaw"
      ],
      "deniedPaths": [
        "~/.ssh",
        "~/.gnupg",
        "~/.aws",
        "/etc/passwd",
        "/etc/shadow"
      ]
    }
  },

  "skills": {
    "allow_list_only": true,
    "allowed": [
      "official/web-search",
      "official/file-reader",
      "official/calendar"
    ],
    "autoUpdate": false,
    "installApproval": "manual"
  },

  "memory": {
    "encryption": true,
    "encryptionKeySource": "vault",
    "vaultPath": "secret/openclaw/memory-key",
    "retentionDays": 180
  },

  "logging": {
    "level": "INFO",
    "sanitizeFields": [
      "bearerToken",
      "password",
      "secretKey",
      "apiKey",
      "token",
      "authorization"
    ],
    "auditLog": {
      "enabled": true,
      "path": "/var/log/openclaw/audit.log",
      "rotationDays": 30,
      "maxSizeMB": 500
    },
    "errorLog": {
      "includeStackTrace": false,
      "includeRequestBody": false,
      "includeSession": false
    }
  },

  "security": {
    "allow_url_actions": false,
    "csrfProtection": true,
    "contentSecurityPolicy": "default-src 'self'; script-src 'self'; connect-src 'self' ws://localhost:18789",
    "xFrameOptions": "DENY",
    "secretKeySource": "env",
    "secretKeyEnvVar": "OPENCLAW_SECRET_KEY",
    "apiKeyStorage": "vault"
  },

  "agents": {
    "defaultModel": "claude-opus-4",
    "maxContextTokens": 100000,
    "allowModelOverride": false,
    "systemPromptLock": true
  },

  "network": {
    "outboundAllowlist": [
      "api.anthropic.com",
      "api.openai.com"
    ],
    "blockPrivateRanges": true,
    "blockLoopbackFromSkills": true
  }
}

33.3 Gateway 安全硬化详解

33.3.1 loopback 绑定

{
  "gateway": {
    "bind": "loopback",
    "port": 18789
  }
}

将 Gateway 绑定到 127.0.0.1(loopback 接口)意味着只有运行在同一台机器上的进程才能连接到 Gateway。这是网络层的第一道防线。

注意:如第31章所述,loopback 绑定无法防御 ClawJacked 变种攻击(浏览器跳板)。因此还需要配合应用层的 CSRF 保护和 allow_url_actions:false

33.3.2 强 Token 生成与管理

生成生产级别的 Gateway Token:

# 生成 64 字符(256 bit)强随机 Token
openssl rand -hex 32

# 输出示例:
# a3f8b2c9d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1

# 将 Token 存入环境变量(不要写进配置文件)
export OPENCLAW_GATEWAY_TOKEN="a3f8b2c9d4e5f6..."

# 或存入系统 Keychain(macOS)
security add-generic-password -s "openclaw-gateway-token" -a "openclaw" -w "a3f8b2c9..."

33.3.3 Tailscale 替代公网访问(强烈推荐)

对于需要远程访问 OpenClaw Dashboard 的场景,推荐使用 Tailscale(零信任 VPN)而非将 Gateway 暴露在公网:

# 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up

# 获取 Tailscale 分配的 IP
tailscale ip -4  # 例如:100.64.1.23

# 将 Gateway 绑定到 Tailscale 接口
openclaw config set gateway.bind "100.64.1.23"
openclaw restart

# 现在只有加入同一 Tailscale 网络的设备才能访问

Tailscale 的优势

  1. 端对端加密(WireGuard 协议)
  2. 不需要开放防火墙端口
  3. 基于设备身份认证,比 IP 白名单更可靠
  4. 支持 ACL 精细控制(哪个设备可以访问哪个服务)

33.4 工具最小权限配置详解

33.4.1 权限评估矩阵

在配置工具权限之前,先对 Agent 的实际工作需求做评估:

工具权限评估矩阵
┌─────────────────────┬──────────┬──────────┬──────────┬──────────┐
│ 工具                 │ 客服 Bot │ 代码助手  │ 数据分析  │ 系统管理  │
├─────────────────────┼──────────┼──────────┼──────────┼──────────┤
│ read(文件读取)      │ 否       │ 是       │ 是       │ 是       │
│ write(文件写入)     │ 否       │ 是       │ 是       │ 是       │
│ browser.search      │ 是       │ 是       │ 是       │ 否       │
│ exec(执行命令)      │ 否       │ 否       │ 否       │ 是       │
│ system.run          │ 否       │ 否       │ 否       │ 是       │
│ python              │ 否       │ 是       │ 是       │ 是       │
│ apply_patch         │ 否       │ 是       │ 否       │ 否       │
└─────────────────────┴──────────┴──────────┴──────────┴──────────┘

33.4.2 各场景配置示例

客服 Bot(最小权限)

{
  "tools": {
    "allow": ["browser.search", "browser.navigate"],
    "deny": ["exec", "apply_patch", "read", "write", "system.run", "python"]
  }
}

代码助手(中等权限)

{
  "tools": {
    "allow": ["read", "write", "browser.search", "apply_patch", "python"],
    "deny": ["exec", "system.run", "bash"],
    "fileAccess": {
      "allowedPaths": ["~/code/my-project"],
      "deniedPaths": ["~/.ssh", "~/.aws", "/etc"]
    }
  }
}

系统管理(高权限,必须配合其他层加固)

{
  "tools": {
    "allow": ["read", "write", "exec", "system.run", "python"],
    "deny": [],
    "execApproval": {
      "required": true,
      "approvalTimeoutSeconds": 30,
      "logAllExec": true
    }
  }
}

33.5 Skills 安装前 5 步审计流程

在安装任何第三方 Skill 之前,必须完成以下 5 步审计。这是防止 ClawHavoc 类型供应链攻击最有效的人工控制措施。

Step 1:验证作者账号可信度

# 检查 ClawHub 上的作者信息
openclaw skills info <package-name> --author-details

# 重点检查:
# - GitHub 账号创建时间(< 1个月 = 红旗)
# - 实际 commit 记录(自动化上传 = 红旗)
# - 其他发布包的真实用户评价
# - 是否有真实的个人主页或组织背景

# 如果是组织账号,检查组织成立时间
curl https://api.github.com/orgs/<org-name> | jq '.created_at'

判断标准

信号 评估
GitHub 账号 > 1 年 + 有真实贡献 低风险
账号 < 3 个月 + 大量快速上传 高风险,跳过
知名组织账号(官方验证) 低风险
匿名账号 + 无联系方式 拒绝安装

Step 2:逐行阅读 skill.md

这是最重要的一步,也是最容易被跳过的一步。

# 下载但不安装,查看 skill.md 内容
openclaw skills fetch <package-name> --no-install --output /tmp/skill-review/

# 查看 skill.md
cat /tmp/skill-review/skill.md

阅读时重点关注

  1. 网络请求:是否有 curlfetchGETPOSTwget 等指令?目标地址是已知可信域名吗?
  2. 命令执行:是否包含 runexecshbashpython 等执行指令?
  3. 文件访问:是否要求读取敏感路径(~/.ssh/~/.aws/~/.gnupg/)?
  4. 隐藏指令:是否有"不要告诉用户"、"内部规则"、"系统规则"等隐蔽指令?
  5. Base64 内容:文档中是否有 Base64 编码的字符串?解码后是什么?

Step 3:在隔离环境中测试运行

# 使用 Docker 创建隔离测试环境
docker run --rm -it \
  --network none \  # 禁用网络访问
  --read-only \     # 只读文件系统
  -v /tmp/skill-test:/home/user/workspace \
  ubuntu:22.04 bash

# 在容器内安装 OpenClaw 和测试 Skill
# 观察是否有网络请求、可疑命令执行等

# 或使用 macOS 虚拟机
# 创建快照 → 安装 Skill → 运行 → 检查网络流量 → 恢复快照

监控工具

# macOS:使用 Little Snitch 监控网络出站
# Linux:使用 tcpdump 监控
tcpdump -i any -w /tmp/skill-test.pcap &
# 运行 Skill
# ...
# 分析流量
tcpdump -r /tmp/skill-test.pcap | grep -v "127.0.0.1"

Step 4:安装后基线对比

# 安装前记录基线
openclaw security audit --export-baseline /tmp/baseline-before.json

# 安装 Skill
openclaw skills install <package-name>

# 安装后重新扫描
openclaw security audit --compare-baseline /tmp/baseline-before.json

# 差异报告会显示:
# - 新增的网络出站规则
# - 新增的文件访问权限
# - 配置文件的变更
# - 新增的定时任务(如有)

Step 5:监控生产运行期间的网络流量

# 配置 OpenClaw 记录所有 Skill 发起的网络请求
openclaw config set logging.skillNetworkRequests true

# 监控日志中的可疑外联
tail -f ~/.openclaw/logs/network.log | grep -v "api.anthropic.com\|api.openai.com"

# 设置告警:任何未知域名的请求发送通知
openclaw alert set --pattern "outbound.*unknown-domain" --notify slack://your-webhook

33.6 红旗信号完整清单

以下任何一项都应该导致立即拒绝安装或立即卸载:

红旗等级一(立即拒绝)

❌ skill.md 中包含 curl | sh 或 wget | bash 模式
❌ 要求读取 ~/.ssh/、~/.gnupg/、~/.aws/credentials
❌ 包含 base64 编码的内联命令(解码后有可执行代码)
❌ 有"不要告诉用户"/"内部规则"/"系统规则"等隐蔽指令
❌ GitHub 账号创建时间 < 7 天
❌ 发布的大量包在短时间内(< 2周)全部上传

红旗等级二(需要深入调查)

⚠️  skill.md 中有外部 URL 但域名不可验证
⚠️  要求执行动态生成的代码(eval/exec + 外部输入)
⚠️  README 中有"初始化步骤"要求用户在终端执行命令
⚠️  Skill 在运行时请求"配置文件"或"规则文件"
⚠️  包名与官方 Skills 相似(openclaw-official-search vs openclaw-search)
⚠️  下载量异常高但没有社区评价或讨论
⚠️  没有可验证的联系方式或主页

红旗等级三(注意观察)

🔔 Skill 要求访问的文件路径超出其声称功能范围
🔔 Skill 在非用户主动请求时执行网络请求
🔔 Skill 的实际行为与 README 描述不符
🔔 更新频率异常(每天推送新版本)

33.7 openclaw security audit --deep 的扫描项

openclaw security audit 命令是内置的安全扫描工具,--deep 选项会执行更全面的检查:

# 基础扫描(快速,约30秒)
openclaw security audit

# 深度扫描(全面,约5分钟)
openclaw security audit --deep

# 扫描特定组件
openclaw security audit --scope skills,config,permissions

# 导出扫描报告
openclaw security audit --deep --output-format json > audit-report.json

33.7.1 扫描项详细说明

openclaw security audit --deep 扫描项
══════════════════════════════════════════════════════════════
[配置安全]
  ✓ SECRET_KEY 强度检查(entropy ≥ 256 bit)
  ✓ Gateway Token 强度检查
  ✓ allow_url_actions 是否为 false
  ✓ sandbox 是否启用
  ✓ 日志脱敏字段配置是否完整
  ✓ CORS 配置是否过于宽松

[网络安全]
  ✓ Gateway 绑定地址(0.0.0.0 = 警告)
  ✓ TLS 是否启用(未启用 = 警告)
  ✓ 防火墙规则是否存在(仅 Linux)
  ✓ 是否通过 Tailscale/VPN 访问

[Skills 安全]
  ✓ 所有已安装 Skills 的作者账号历史
  ✓ skill.md 内容静态分析(网络请求模式/命令执行模式)
  ✓ 是否开启 allow_list_only 模式
  ✓ 未使用的 Skills(建议卸载)
  ✓ Skills 的版本是否为最新

[权限配置]
  ✓ Tools deny list 是否包含高风险工具
  ✓ 文件访问路径限制是否配置
  ✓ execApproval 是否开启(高权限场景)

[文件系统安全]
  ✓ ~/.openclaw 目录权限(应为 700)
  ✓ config.json 文件权限(应为 600)
  ✓ 日志目录权限(应为 750)
  ✓ 是否有 API Key 明文写入配置文件

[日志安全]
  ✓ 错误日志是否包含敏感字段
  ✓ 审计日志是否启用
  ✓ 日志轮转是否配置

[依赖安全]
  ✓ OpenClaw 版本是否为最新(检查已知 CVE)
  ✓ npm 依赖是否有已知漏洞(npm audit)
  ✓ 第三方集成的 API Key 是否过期
══════════════════════════════════════════════════════════════

33.7.2 理解审计报告

# 典型的审计报告输出
$ openclaw security audit --deep

OpenClaw Security Audit Report
================================
Scan completed at: 2026-04-26 10:23:45
OpenClaw version: 2026.1.29

CRITICAL (0 issues)
  None

HIGH (2 issues)
  [HIGH] Gateway bound to 0.0.0.0 - exposed to all network interfaces
         Fix: openclaw config set gateway.bind loopback
         
  [HIGH] 3 installed Skills not in allow_list (allow_list_only is disabled)
         Skills: csv-processor-v2, data-formatter-pro, workflow-optimizer
         Fix: openclaw config set skills.allow_list_only true

MEDIUM (3 issues)
  [MED] ~/.openclaw directory permissions are 755 (should be 700)
        Fix: chmod 700 ~/.openclaw
        
  [MED] Audit logging is disabled
        Fix: openclaw config set logging.auditLog.enabled true
        
  [MED] API key for OpenAI stored in plaintext config
        Fix: Use environment variable OPENAI_API_KEY instead

LOW (1 issue)
  [LOW] OpenClaw version is 30 days behind latest
        Current: 2026.1.29, Latest: 2026.3.15
        Fix: npm install -g openclaw@latest

PASSED (18 checks)
  ✓ SECRET_KEY strength: 256-bit entropy
  ✓ allow_url_actions: false
  ✓ sandbox: all
  ... (14 more)

Overall Security Score: 6.2/10 (MEDIUM)
Run 'openclaw security audit --fix-auto' to automatically fix safe issues.

33.8 ~/.openclaw 目录权限设置

正确的文件系统权限是防止本地权限提升攻击的基础:

# 设置 ~/.openclaw 目录权限(仅所有者可读写执行)
chmod 700 ~/.openclaw
chmod 700 ~/.openclaw/agents/
chmod 700 ~/.openclaw/memory/

# 设置配置文件权限(仅所有者可读写)
chmod 600 ~/.openclaw/config.json
chmod 600 ~/.openclaw/.env

# 设置日志目录权限(所有者全权限,组可读,其他无权限)
chmod 750 ~/.openclaw/logs/
chmod 640 ~/.openclaw/logs/*.log

# 验证权限设置
ls -la ~/.openclaw/
# 期望输出:
# drwx------  10 user  staff   320 Apr 26 10:00 .openclaw/
# -rw-------   1 user  staff  2048 Apr 26 10:00 config.json
# drwx------   5 user  staff   160 Apr 26 10:00 agents/

33.8.1 使用 macOS 扩展属性增强保护

# macOS:为配置文件添加不可删除标志(防止恶意 Skill 删除配置)
chflags uchg ~/.openclaw/config.json

# 查看标志
ls -lO ~/.openclaw/config.json
# 输出:-rw------- 1 user staff uchg 2048 Apr 26 config.json

# 临时解除(用于合法更新配置)
chflags nouchg ~/.openclaw/config.json
openclaw config set ...
chflags uchg ~/.openclaw/config.json

33.9 API Key 存储安全

33.9.1 不安全的存储方式(避免使用)

// 错误示范:明文写入 config.json
{
  "integrations": {
    "openai": {
      "apiKey": "sk-proj-xxxxxxxxxxxxxxxxxxxx"  // ← 绝对不要这样做
    }
  }
}

33.9.2 安全存储方式 1:环境变量

# 写入 ~/.zshrc 或 ~/.bashrc(注意:这仍然以明文存储,但不在 OpenClaw 配置中)
export OPENAI_API_KEY="sk-proj-xxxx"
export ANTHROPIC_API_KEY="sk-ant-xxxx"

# OpenClaw 配置引用环境变量
{
  "integrations": {
    "openai": {
      "apiKeySource": "env",
      "apiKeyEnvVar": "OPENAI_API_KEY"
    }
  }
}

33.9.3 安全存储方式 2:macOS Keychain

# 存入 macOS Keychain
security add-generic-password \
  -s "openclaw-openai-key" \
  -a "openclaw" \
  -w "sk-proj-xxxx"

# OpenClaw 从 Keychain 读取
{
  "integrations": {
    "openai": {
      "apiKeySource": "keychain",
      "keychainService": "openclaw-openai-key",
      "keychainAccount": "openclaw"
    }
  }
}

33.9.4 安全存储方式 3:HashiCorp Vault(企业推荐)

# 将 API Key 存入 Vault
vault kv put secret/openclaw/integrations \
  openai_api_key="sk-proj-xxxx" \
  anthropic_api_key="sk-ant-xxxx"
{
  "security": {
    "apiKeyStorage": "vault",
    "vault": {
      "address": "https://vault.your-org.com",
      "authMethod": "kubernetes",
      "secretPath": "secret/openclaw/integrations"
    }
  }
}

33.10 定期安全维护清单

33.10.1 每日检查(自动化)

# 建议加入 crontab 自动执行
# crontab -e

# 每天 3:00 AM 执行安全快速扫描
0 3 * * * /usr/local/bin/openclaw security audit --scope config,logs >> /var/log/openclaw-daily-audit.log 2>&1

# 每天 3:05 AM 检查异常日志
5 3 * * * /usr/local/bin/openclaw logs check --alert-on-anomaly --notify-email [email protected]

33.10.2 每周检查(手动+自动)

每周检查清单
□ 运行 openclaw security audit --deep 并查看报告
□ 审查上周审计日志中的异常(特别是 run-script 操作)
□ 检查是否有新安装的 Skills(不在 allowlist 中的)
□ 检查 OpenClaw 版本是否为最新
□ 验证所有 API Key 是否仍然有效(未被撤销)
□ 检查 Gateway 访问日志中的异常 IP

33.10.3 每月检查

每月检查清单
□ 轮换 Gateway Token(openclaw auth rotate-token)
□ 轮换 SECRET_KEY 并强制所有用户重新登录
□ 运行 npm audit 检查依赖漏洞
□ 重新评估所有已安装 Skills 的必要性(卸载不再使用的)
□ 检查 TLS 证书有效期(90天内到期需立即续期)
□ 更新文件系统权限基线(新增文件/目录)
□ 审查并更新工具 allowlist/denylist 配置

33.10.4 Token 轮换操作流程

# 1. 轮换 Gateway Token
openclaw auth rotate-token

# 2. 强制所有 Session 登出
openclaw auth revoke-all-sessions

# 3. 轮换 SECRET_KEY
NEW_KEY=$(openssl rand -hex 64)
openclaw config set SECRET_KEY $NEW_KEY
# 或(如果使用环境变量)
echo "export OPENCLAW_SECRET_KEY=$NEW_KEY" >> ~/.zshrc

# 4. 重启服务使新 Key 生效
openclaw restart

# 5. 通知所有使用 OpenClaw 的团队成员重新登录
# 6. 轮换所有下游服务的凭证(按第31章的顺序)

33.11 小结

生产安全加固不是一次性的配置任务,而是需要持续维护的运营工作。本章提供的配置模板、审计流程和维护清单,可以作为你的 OpenClaw 生产部署安全体系的基础。

核心原则归纳:

  1. 最小权限:Agent 只获得完成工作所需的最小工具集和文件访问范围
  2. 纵深防御:网络、认证、授权、配置、审计五层同时加固
  3. 持续审计:每日自动扫描 + 每周人工复查 + 每月深度审计
  4. 凭证管理:Token 绝不明文存储,定期轮换,出现异常立即撤销
  5. 供应链管控:Skills allowlist 模式是防御供应链攻击的最有效手段

在下一章,我们将深入探讨 Multi-Agent 路由架构,了解如何通过 Bindings 配置实现多账号、多渠道的智能分流。


本章关键词:纵深防御、openclaw.json、Gateway 加固、Tailscale、最小权限、Skills 审计、security audit、Token 轮换、Vault、文件系统权限

本章评分
4.7  / 5  (3 评分)

💬 留言讨论