构建不裸奔的贾维斯:OpenClaw 安全部署最佳实践指南 (v2026 版)

构建不裸奔的贾维斯:OpenClaw 安全部署最佳实践指南 (v2026 版)

OpenClaw 很强。它能帮你管理日程、整理文件、回复消息、甚至控制智能家居。但如果你只是照着官方 Readme 里的 docker run 一敲了之,那你现在的状态可能和"裸奔"没区别。

RCE 漏洞虽然在 v2026.1.29 修了,但那只是打了一个补丁。如果你的整体安全配置不到位,下一个漏洞依然能把你带走。

这里有一份给 OpenClaw 用户的实战加固指南。不讲虚的,不讲理论,只讲怎么把门窗锁好。

第一步:检查你的版本

在做任何事情之前,先确认你跑的是修复后的版本。

# 如果是 Docker 部署
docker exec openclaw cat /app/package.json | jq '.version'
# 期望输出:>= "2026.1.29"

# 如果是源码部署
cd /path/to/openclaw
cat package.json | jq '.version'

如果版本低于 2026.1.29,立刻升级:

# Docker 方式
docker pull openclaw/openclaw:latest
docker-compose down
docker-compose up -d

# 源码方式
git pull origin main
npm install
npm run build
pm2 restart openclaw  # 或者你用的其他进程管理器

第二步:别让它直接暴露在公网

这是最基本也是最重要的一条。千万不要把 OpenClaw 的端口直接映射到公网 IP。

很多人为了"在外面也能用",直接在路由器上做端口转发。这等于把你家里的门钥匙挂在门外面。

错误做法:

# docker-compose.yml - 千万别这么写!
services:
  openclaw:
    ports:
      - "0.0.0.0:3000:3000"  # 这意味着任何人都能访问

然后在路由器上把 3000 端口转发出去。

正确做法:只绑定到 localhost

# docker-compose.yml
services:
  openclaw:
    ports:
      - "127.0.0.1:3000:3000"  # 只有本机能访问

如果你需要远程访问,有几个安全的方案:

方案 A:Tailscale (推荐,最简单)

Tailscale 是一个基于 WireGuard 的 VPN 服务,设置极其简单。

# 在你的服务器上安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

# 在你的手机/笔记本上也安装 Tailscale,用同一个账号登录
# 之后你就可以通过 Tailscale 分配的内网 IP 访问服务器
# 比如 http://100.64.x.x:3000

优点:设置简单,自动打洞,不需要公网 IP,流量加密。

方案 B:WireGuard (更可控)

如果你想更可控,可以自己搭 WireGuard:

# 服务器端(假设是 Ubuntu)
sudo apt install wireguard

# 生成密钥对
wg genkey | tee privatekey | wg pubkey > publickey

# 创建配置
sudo cat > /etc/wireguard/wg0.conf << EOF
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = $(cat privatekey)

[Peer]
PublicKey = <客户端的公钥>
AllowedIPs = 10.0.0.2/32
EOF

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

方案 C:Cloudflare Tunnel (下一篇会详细讲)

如果你连 VPN 都懒得配,Cloudflare Tunnel 是个好选择。它不需要开任何入站端口,还自带鉴权。

第三步:容器隔离是底线

永远不要直接在宿主机上跑 OpenClaw。 用 Docker。

而且,不要给容器太多权限。我见过很多人的配置是这样的:

# 危险配置!
services:
  openclaw:
    volumes:
      - /:/host  # 把整个根目录挂载进去
    privileged: true  # 给了 root 权限
    network_mode: host  # 直接用宿主机网络

这意味着如果 OpenClaw 被攻破,攻击者相当于获得了宿主机的 root 权限。

安全配置:

# docker-compose.yml
version: '3.8'
services:
  openclaw:
    image: openclaw/openclaw:latest
    container_name: openclaw
    restart: unless-stopped
    
    # 只暴露必要端口,只绑定到 localhost
    ports:
      - "127.0.0.1:3000:3000"
    
    # 只挂载必要目录
    volumes:
      - ./data:/app/data            # 应用数据
      - ./config:/app/config:ro     # 配置文件,只读
      # 不要挂载 home 目录、根目录等敏感位置
    
    # 以非 root 用户运行
    user: "1000:1000"
    
    # 安全相关设置
    security_opt:
      - no-new-privileges:true      # 禁止提权
    cap_drop:
      - ALL                          # 移除所有 Linux capabilities
    cap_add:
      - NET_BIND_SERVICE            # 只添加必要的 capability
    
    # 只读根文件系统(可选,某些功能可能需要调整)
    read_only: true
    tmpfs:
      - /tmp
      - /app/tmp
    
    # 资源限制
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
    
    # 环境变量(敏感信息用 Docker secrets 或 .env 文件)
    env_file:
      - .env

第四步:API Key 的本地加密管理

OpenClaw 需要很多 Key:OpenAI、Anthropic、Replicate 等。这些 Key 怎么存储,直接关系到你的钱包安全。

最差的做法:明文写在配置文件里

// config.json - 千万别这样!
{
  "openai_api_key": "sk-proj-xxx...",
  "anthropic_api_key": "sk-ant-xxx..."
}

然后这个文件可能不小心被 commit 到 Git,或者被同步到云盘,或者被其他应用读取。

好一点的做法:环境变量

# .env 文件
OPENAI_API_KEY=sk-proj-xxx...
ANTHROPIC_API_KEY=sk-ant-xxx...
# docker-compose.yml
services:
  openclaw:
    env_file:
      - .env

确保 .env 文件:

  • 加入 .gitignore
  • 权限设置为 600(只有 owner 能读写)
chmod 600 .env
echo ".env" >> .gitignore

更好的做法:Docker Secrets (Swarm 模式) 或外部密钥管理

# docker-compose.yml (Swarm 模式)
version: '3.8'
services:
  openclaw:
    secrets:
      - openai_key
      - anthropic_key
    environment:
      - OPENAI_API_KEY_FILE=/run/secrets/openai_key
      - ANTHROPIC_API_KEY_FILE=/run/secrets/anthropic_key

secrets:
  openai_key:
    external: true
  anthropic_key:
    external: true

如果你用的是 Kubernetes,可以用 Kubernetes Secrets 或者 HashiCorp Vault。

第五步:开启鉴权,哪怕是在内网

新版 OpenClaw 应该加强了鉴权机制。请务必去设置里开启。

# 检查当前鉴权状态
curl -s http://localhost:3000/api/health
# 如果返回数据而不是 401,说明鉴权没开

# 开启鉴权(具体配置看你的版本)
# 在 config.json 或环境变量中设置
// config.json
{
  "auth": {
    "enabled": true,
    "type": "token",  // 或 "basic"
    "token": "your-strong-random-token-here"
  }
}

Token 怎么生成?

# 生成一个强随机 token
openssl rand -base64 32
# 输出类似:K7xPq9vM2nRtYjW4uL6hD8fGcSaEzXbV0iNoQmCp1wH=

把这个 token 保存好,在所有 API 请求中带上:

curl -H "Authorization: Bearer K7xPq9vM2nRtYjW4uL6hD8fGcSaEzXbV0iNoQmCp1wH=" \
     http://localhost:3000/api/status

为什么内网也要鉴权?

  1. 你的内网可能不止你一个人。室友、家人、访客都可能连到你的 WiFi。
  2. 你的其他设备可能被入侵。比如智能电视、智能音箱、路由器本身。
  3. 恶意网页可以通过浏览器攻击内网服务(就像 OpenClaw 这次的漏洞)。

内网不是安全区。别有这个幻觉。

第六步:网络层隔离

如果你对安全有更高要求,可以用 Docker 网络把 OpenClaw 隔离起来。

# docker-compose.yml
version: '3.8'

networks:
  openclaw_net:
    driver: bridge
    internal: true  # 内部网络,不能直接访问互联网
  
  proxy_net:
    driver: bridge

services:
  openclaw:
    networks:
      - openclaw_net
    # OpenClaw 本身不能直接上网
  
  # 如果 OpenClaw 需要调用外部 API,通过代理
  proxy:
    image: nginx:alpine
    networks:
      - openclaw_net
      - proxy_net
    # 配置 Nginx 作为出口代理,可以做白名单控制

这样,即使 OpenClaw 被攻破,攻击者也不能直接从容器内访问互联网。所有外部请求都要经过代理,你可以在代理层做审计和过滤。

第七步:日志与监控

时不时看一眼 Docker 的日志。如果你发现 Agent 在凌晨 3 点尝试访问一些奇怪的网站,或者执行了你没下达的 shell 命令,立刻停掉容器。

# 查看实时日志
docker logs -f openclaw

# 查看最近 100 行日志
docker logs --tail 100 openclaw

# 搜索可疑关键词
docker logs openclaw 2>&1 | grep -E "(error|warning|unauthorized|failed)"

更进一步,可以把日志导出到专门的日志系统(比如 Loki、ELK):

# docker-compose.yml
services:
  openclaw:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    # 或者使用 fluentd、loki 等驱动

设置告警规则:

  • 登录失败次数超过阈值
  • 出现敏感命令执行(rm -rf、curl | sh 等)
  • 访问非白名单的外部域名
  • 资源使用异常飙升

第八步:定期备份与恢复演练

# 备份数据目录
tar -czvf openclaw-backup-$(date +%Y%m%d).tar.gz ./data ./config

# 测试恢复
docker-compose down
rm -rf ./data ./config
tar -xzvf openclaw-backup-xxx.tar.gz
docker-compose up -d
# 验证服务正常

备份要存在不同的物理位置。如果你的电脑被勒索软件加密,备份在同一台电脑上等于没有备份。

完整的安全配置示例

最后,给一个相对完整的 docker-compose.yml 示例:

version: '3.8'

services:
  openclaw:
    image: openclaw/openclaw:2026.1.29  # 锁定版本,避免意外升级
    container_name: openclaw
    restart: unless-stopped
    
    ports:
      - "127.0.0.1:3000:3000"
    
    volumes:
      - ./data:/app/data
      - ./config:/app/config:ro
    
    environment:
      - NODE_ENV=production
      - LOG_LEVEL=info
      - AUTH_ENABLED=true
      - AUTH_TOKEN_FILE=/run/secrets/auth_token
    
    secrets:
      - auth_token
      - openai_key
    
    user: "1000:1000"
    
    security_opt:
      - no-new-privileges:true
    
    cap_drop:
      - ALL
    
    read_only: true
    tmpfs:
      - /tmp:size=100M
    
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '0.5'
          memory: 512M
    
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"

secrets:
  auth_token:
    file: ./secrets/auth_token.txt
  openai_key:
    file: ./secrets/openai_key.txt

总结

把 OpenClaw 当作一个外包员工。

你可以雇佣它,让它帮你干活。但你得盯着它,只给它最小的权限,并且绝不把家里房产证交给它保管。

  • 绑定到 localhost,不直接暴露
  • 用 Docker 隔离,限制权限
  • 开启鉴权,即使在内网
  • API Key 加密存储
  • 定期查看日志
  • 保持更新

这才是和 AI Agent 共存的正确姿势。

安全配置可能会让事情变得稍微麻烦一点,但相比被黑之后的损失,这点麻烦不算什么。你愿意花时间配置 2FA 保护你的银行账户,那也应该花点时间保护你的 AI Agent——因为它可能比你的银行账户更危险。

← 返回博客列表