Skip to content

OpenClaw 安全最佳实践完整指南

安全是部署和使用 AI 助理系统的首要考虑。本文详细介绍如何安全地部署、配置和使用 OpenClaw,包括凭证管理、权限控制、网络安全和审计日志。

一、安全威胁模型

潜在风险

  1. 凭证泄露:API 密钥、密码、令牌被窃取
  2. 未授权访问:他人使用你的 AI 助理执行操作
  3. 数据泄露:敏感信息通过日志或消息外泄
  4. 命令注入:恶意输入导致执行危险命令
  5. 供应链攻击:依赖的库或服务被篡改

防护策略

防御层次:
1. 凭证加密存储
2. 访问控制和认证
3. 最小权限原则
4. 操作审计日志
5. 定期安全更新

二、凭证安全管理

1. 使用 GPG 加密存储

生成 GPG 密钥

bash
# 生成密钥对(如果没有)
gpg --full-generate-key

# 选择:RSA and RSA
# 密钥长度:4096
# 有效期:2 年
# 输入姓名和邮箱

加密敏感文件

bash
# 创建凭证目录
mkdir -p ~/.openclaw/credentials/encrypted
chmod 700 ~/.openclaw/credentials/encrypted

# 加密 Feishu 密钥
gpg --encrypt --recipient "your-email@example.com" \
    --output ~/.openclaw/credentials/encrypted/feishu-secret.json.gpg \
    feishu-secret.json

# 加密 Gateway Token
gpg --encrypt --recipient "your-email@example.com" \
    --output ~/.openclaw/credentials/encrypted/gateway-token.json.gpg \
    gateway-token.json

# 设置权限
chmod 600 ~/.openclaw/credentials/encrypted/*.gpg

解密使用

bash
# 解密到内存(不写磁盘)
gpg --decrypt ~/.openclaw/credentials/encrypted/feishu-secret.json.gpg

# 或在脚本中使用
FEISHU_SECRET=$(gpg --decrypt ~/.openclaw/credentials/encrypted/feishu-secret.json.gpg 2>/dev/null)

2. 使用 PASSWORD.md 管理密码

bash
# 创建密码文件
cat > ~/.openclaw/workspace/PASSWORD.md << 'EOF'
# 加密密码本

## 使用说明
- 本文件存储常用密码的加密版本
- 使用 GPG 加密,仅自己可解密
- 定期更换密码并更新本文件

## 密码列表

### Feishu 应用
- App ID: cli_a3bc4d5e6f7g8h9i
- App Secret: [已加密,见 feishu-secret.json.gpg]

### Gateway
- Token: [已加密,见 gateway-token.json.gpg]

### 服务器
- SSH 密码:[联系管理员获取]
- 数据库密码:[已加密,见 db-password.gpg]

## 更换记录
- 2026-03-19: 初始创建
- 下次更换:2026-06-19
EOF

# 加密密码文件
gpg --encrypt --recipient "your-email@example.com" \
    --output ~/.openclaw/workspace/PASSWORD.md.gpg \
    ~/.openclaw/workspace/PASSWORD.md

# 删除明文
shred -u ~/.openclaw/workspace/PASSWORD.md

# 设置权限
chmod 600 ~/.openclaw/workspace/PASSWORD.md.gpg

3. 环境变量管理

bash
# 创建环境变量文件(加密)
cat > ~/.openclaw/env.enc << 'EOF'
export FEISHU_APP_ID="cli_xxx"
export FEISHU_APP_SECRET="xxx"
export GATEWAY_TOKEN="xxx"
export OPENCLAW_WORKSPACE="/home/pao/.openclaw/workspace"
EOF

gpg --encrypt --recipient "your-email@example.com" \
    --output ~/.openclaw/env.enc \
    ~/.openclaw/env

shred -u ~/.openclaw/env
chmod 600 ~/.openclaw/env.enc

# 在启动脚本中加载
echo 'eval $(gpg --decrypt ~/.openclaw/env.enc 2>/dev/null)' >> ~/.bashrc

三、文件权限管理

1. 关键文件权限检查

bash
#!/bin/bash
# security-check.sh - 安全检查脚本

echo "🔒 检查关键文件权限..."

# 凭证文件
check_permission() {
  local file=$1
  local expected=$2
  local actual=$(stat -c %a "$file" 2>/dev/null)
  
  if [ "$actual" = "$expected" ]; then
    echo "✅ $file: $actual"
  else
    echo "❌ $file: $actual (应为 $expected)"
    chmod $expected "$file"
    echo "   已修复为 $expected"
  fi
}

# 检查凭证
check_permission ~/.openclaw/credentials/encrypted/*.gpg 600
check_permission ~/.openclaw/openclaw.json 600
check_permission ~/.openclaw/identity/device-auth.json 600

# 检查工作区敏感文件
check_permission ~/.openclaw/workspace/PASSWORD.md.gpg 600
check_permission ~/.openclaw/env.enc 600

# 检查脚本
check_permission ~/.openclaw/scripts/*.sh 755

echo "✅ 权限检查完成"

2. 自动化权限修复

bash
#!/bin/bash
# fix-permissions.sh - 自动修复权限

set -e

echo "🔧 修复 OpenClaw 文件权限..."

# 凭证目录
find ~/.openclaw/credentials -type f -exec chmod 600 {} \;
find ~/.openclaw/credentials -type d -exec chmod 700 {} \;

# 配置文件
chmod 600 ~/.openclaw/openclaw.json
chmod 600 ~/.openclaw/identity/*.json

# 工作区
chmod 755 ~/.openclaw/workspace
chmod 644 ~/.openclaw/workspace/*.md

# 脚本
find ~/.openclaw/scripts -name "*.sh" -exec chmod 755 {} \;

echo "✅ 权限修复完成"

四、网络安全配置

1. Nginx 安全配置

nginx
# /etc/nginx/sites-available/openclaw

server {
    listen 80;
    server_name www.AiTimes.net;
    
    # 强制 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.AiTimes.net;
    
    # SSL 配置
    ssl_certificate /etc/letsencrypt/live/AiTimes.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/AiTimes.net/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    
    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
    
    # 隐藏版本信息
    server_tokens off;
    
    # 限制请求大小
    client_max_body_size 10M;
    
    # 限制请求频率
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    limit_req zone=one burst=20 nodelay;
    
    # 网站根目录
    root /var/www/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # 禁止访问敏感文件
    location ~ /\. {
        deny all;
    }
    
    location ~* \.(git|env|md|log)$ {
        deny all;
    }
}

2. 防火墙配置

bash
#!/bin/bash
# firewall-setup.sh - 防火墙配置

# 启用 UFW
ufw --force enable

# 默认策略
ufw default deny incoming
ufw default allow outgoing

# 允许必要端口
ufw allow 22/tcp comment "SSH"
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"

# 限制 SSH 访问(可选,替换为你的 IP)
# ufw allow from 192.168.1.0/24 to any port 22

# 查看状态
ufw status verbose

3. SSH 安全加固

bash
# /etc/ssh/sshd_config 配置

# 禁用密码登录(使用密钥)
PasswordAuthentication no
PubkeyAuthentication yes

# 禁用 root 登录
PermitRootLogin no

# 更改默认端口(可选)
Port 2222

# 限制用户
AllowUsers pao

# 空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2

# 重启 SSH 服务
systemctl restart sshd

五、操作审计日志

1. 启用详细日志

javascript
// openclaw.json 配置
{
  "logging": {
    "level": "info",
    "file": "/var/log/openclaw/main.log",
    "maxSize": "100M",
    "maxFiles": 10,
    "includeTools": true,
    "includeMessages": true
  }
}

2. 安全事件日志

bash
#!/bin/bash
# security-audit.sh - 安全审计脚本

LOG_DIR="/var/log/openclaw/security"
mkdir -p "$LOG_DIR"

echo "🔍 安全审计 - $(date)" >> "$LOG_DIR/audit.log"

# 检查登录日志
echo "=== SSH 登录记录 ===" >> "$LOG_DIR/audit.log"
last -20 >> "$LOG_DIR/audit.log"

# 检查 sudo 使用
echo "=== Sudo 使用记录 ===" >> "$LOG_DIR/audit.log"
grep "sudo" /var/log/auth.log | tail -20 >> "$LOG_DIR/audit.log"

# 检查文件权限变更
echo "=== 敏感文件权限 ===" >> "$LOG_DIR/audit.log"
ls -la ~/.openclaw/credentials/ >> "$LOG_DIR/audit.log"
ls -la ~/.openclaw/*.json >> "$LOG_DIR/audit.log"

# 检查网络连接
echo "=== 网络连接 ===" >> "$LOG_DIR/audit.log"
netstat -tulpn | grep LISTEN >> "$LOG_DIR/audit.log"

# 检查进程
echo "=== 运行的进程 ===" >> "$LOG_DIR/audit.log"
ps aux | grep -E "node|nginx|openclaw" >> "$LOG_DIR/audit.log"

echo "✅ 审计完成,报告:$LOG_DIR/audit.log"

3. 异常行为检测

bash
#!/bin/bash
# anomaly-detect.sh - 异常检测

# 检查异常登录
FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log | wc -l)
if [ $FAILED_LOGINS -gt 10 ]; then
  echo "⚠️  警告:检测到 $FAILED_LOGINS 次失败登录尝试"
  # 发送告警
fi

# 检查异常文件访问
SENSITIVE_ACCESS=$(grep -E "credentials|PASSWORD|secret" /var/log/syslog | wc -l)
if [ $SENSITIVE_ACCESS -gt 50 ]; then
  echo "⚠️  警告:检测到 $SENSITIVE_ACCESS 次敏感文件访问"
fi

# 检查异常网络流量
HIGH_TRAFFIC=$(iftop -t -s 10 2>/dev/null | head -5)
echo "📊 网络流量TOP5: $HIGH_TRAFFIC"

六、定时安全检查

配置每日检查

javascript
cron(
  action="add",
  job={
    name: "夜间安全检查",
    schedule: {
      kind: "cron",
      expr: "30 23 * * *",
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: `
执行夜间安全检查:

1. 检查 OpenClaw 网关状态
   - openclaw gateway status
   - 异常则重启

2. 检查 Nginx 服务
   - systemctl status nginx
   - 异常则重启

3. 检查配置文件权限
   - 所有敏感文件应为 600
   - 异常则修复

4. 检查磁盘空间
   - df -h /home
   - >90% 则清理

5. 检查内存使用
   - free -h
   - >90% 则清理浏览器进程

6. 生成检查报告
   - 保存到 ~/.openclaw/logs/security/
   - 有问题则发送飞书通知
      `,
      timeoutSeconds: 600
    },
    sessionTarget: "isolated"
  }
)

配置早上上报

javascript
cron(
  action="add",
  job={
    name: "早上安全上报",
    schedule: {
      kind: "cron",
      expr: "0 8 * * *",
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: `
读取昨晚的安全检查报告:
- 位置:~/.openclaw/logs/security/pending/

如有问题:
1. 发送到飞书通知
2. 移动到已上报目录

如无问题:
- 静默退出,不发送通知
      `,
      timeoutSeconds: 300
    },
    sessionTarget: "isolated"
  }
)

七、应急响应

1. 凭证泄露处理

bash
#!/bin/bash
# emergency-revoke.sh - 凭证吊销脚本

echo "🚨 紧急凭证吊销程序"

# 1. 立即更改所有密码
echo "1. 请立即更改以下密码:"
echo "   - Feishu 应用密钥"
echo "   - Gateway Token"
echo "   - 服务器密码"
echo "   - 数据库密码"

# 2. 撤销访问令牌
echo "2. 撤销所有活动的访问令牌"
echo "   - Feishu: 应用管理后台"
echo "   - Gateway: 设备管理"

# 3. 检查日志
echo "3. 检查异常活动日志"
tail -100 /var/log/openclaw/main.log

# 4. 重新生成凭证
echo "4. 重新生成并加密新凭证"
# ... 执行凭证生成流程 ...

echo "✅ 紧急处理完成"

2. 未授权访问处理

bash
#!/bin/bash
# lock-down.sh - 系统锁定脚本

echo "🔒 系统锁定程序启动"

# 1. 停止网关
openclaw gateway stop

# 2. 停止 Nginx
systemctl stop nginx

# 3. 断开所有网络连接
# ufw --force disable  # 谨慎使用

# 4. 记录当前状态
ps aux > /tmp/process-snapshot.txt
netstat -tulpn > /tmp/network-snapshot.txt

# 5. 通知管理员
echo "系统已锁定,请立即检查!"

echo "✅ 系统已锁定"

八、安全清单

部署前检查

  • [ ] 生成并配置 GPG 密钥
  • [ ] 加密所有凭证文件
  • [ ] 设置正确的文件权限
  • [ ] 配置防火墙规则
  • [ ] 加固 SSH 配置
  • [ ] 配置 Nginx 安全头
  • [ ] 启用日志记录
  • [ ] 配置定时安全检查

日常维护

  • [ ] 每日检查安全日志
  • [ ] 每周审查访问记录
  • [ ] 每月更新系统和依赖
  • [ ] 每季度更换密码
  • [ ] 每半年进行安全审计

事件响应

  • [ ] 建立应急响应流程
  • [ ] 准备凭证吊销脚本
  • [ ] 配置告警通知渠道
  • [ ] 定期演练应急流程

九、总结

安全是一个持续的过程,需要:

层面措施
凭证GPG 加密、定期更换
权限最小权限、文件 600
网络防火墙、HTTPS、SSH 加固
审计详细日志、定期检查
应急响应流程、快速吊销

记住:安全无小事,预防胜于补救。


相关资源:

Released under the MIT License.