OpenClaw 安全运维:自动化巡检与加固

70次阅读

OpenClaw 安全运维:自动化巡检与加固

系统安全不能靠运气,定期检查、及时加固才是正道。本文介绍如何使用 healthcheck 技能和 shell 命令实现自动化安全巡检、分析会话日志、及时发现风险,带你搭建安全运维工作流。


01 安全运维自动化是什么?

安全运维自动化 是指通过 OpenClaw 的 healthcheck 技能和 shell 命令,实现系统安全审计、日志分析、异常检测等安全任务的自动化执行。

核心能力: – 🔍 安全审计 — 自动检查系统配置、发现漏洞 – 📊 日志分析 — 会话日志统计、成本分析 – 🚨 异常检测 — 敏感词检测、高成本会话识别 – 📋 报告生成 — 自动生成安全巡检报告


02 为什么需要自动化安全运维?

安全运维的痛点:

安全技能矩阵:


03 安全审计(healthcheck)

准备工作

healthcheck 技能位于:

~/.nvm/versions/node/v22.17.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md

使用方式: 1. 阅读上述 SKILL.md 文件了解详细用法 2. 根据指导进行系统安全审计和加固 3. 该技能会引导你完成风险评估和修复

核心检查命令

healthcheck 技能会检查以下内容,你也可以手动执行这些命令:

系统层面:

# 操作系统版本和补丁状态
uname -a
cat /etc/os-release

# 开放端口检查
ss -ltnup

# 防火墙配置
sudo ufw status
# 或
sudo firewall-cmd --state

# SSH 配置检查
cat /etc/ssh/sshd_config | grep -E "^(Port|PermitRootLogin|PasswordAuthentication)"

# 磁盘加密状态(Linux)lsblk -f | grep crypt

# 自动更新配置(Ubuntu/Debian)cat /etc/apt/apt.conf.d/20auto-upgrades

OpenClaw 层面:

# OpenClaw 版本检查
openclaw --version

# OpenClaw 状态检查
openclaw status

# 检查 OpenClaw 版本
openclaw --version

实战案例 1:每日安全巡检

#!/bin/bash
# daily-security-check.sh

DATE=$(date +%Y-%m-%d)
REPORT_FILE="/var/log/security-audit-$DATE.md"

cat > $REPORT_FILE << EOF
# 安全巡检报告 ($DATE)

生成时间: $(date)

## 1. 系统信息

### 1.1 操作系统
\`\`\`
$(uname -a)
$(cat /etc/os-release 2>/dev/null | head -5)
\`\`\`

### 1.2 开放端口
\`\`\`
$(ss -ltnup 2>/dev/null || netstat -tlnp 2>/dev/null || echo " 命令不可用 ")
\`\`\`

### 1.3 防火墙状态
\`\`\`
$(sudo ufw status 2>/dev/null || sudo firewall-cmd --state 2>/dev/null || echo " 防火墙未安装或未配置 ")
\`\`\`

### 1.4 SSH 配置
\`\`\`
$(grep -E "^(Port|PermitRootLogin|PasswordAuthentication|PubkeyAuthentication)" /etc/ssh/sshd_config 2>/dev/null || echo "SSH 配置读取失败 ")
\`\`\`

### 1.5 磁盘加密
\`\`\`
$(lsblk -f 2>/dev/null | grep -E "(crypt|LUKS)" || echo " 未发现加密卷 ")
\`\`\`

## 2. OpenClaw 状态

### 2.1 版本信息
\`\`\`
$(openclaw --version 2>/dev/null || echo " 无法获取版本 ")
\`\`\`

### 2.2 运行状态
\`\`\`
$(openclaw status 2>/dev/null || echo " 无法获取状态 ")
\`\`\`

### 2.3 版本信息
\`\`\`
$(openclaw --version 2>/dev/null || echo " 无法获取版本信息 ")
\`\`\`

## 3. 建议操作

- [ ] 检查是否有异常开放端口
- [ ] 确认防火墙规则正确
- [ ] 验证 SSH 配置安全
- [ ] 确保磁盘加密已启用
- [ ] 检查 OpenClaw 是否需要更新

---
* 本报告由自动化脚本生成 *
EOF

echo " 巡检完成: $REPORT_FILE"

配合 cron:

# 每天凌晨 2 点执行
0 2 * * * /path/to/daily-security-check.sh

实战案例 2:系统加固流程

#!/bin/bash
# system-hardening.sh

echo "🔍 正在评估当前安全状态..."

# 1. 收集当前状态
echo ""
echo "📋 当前系统状态:"
echo "================"

echo ""
echo "1. 开放端口:"
ss -ltnup 2>/dev/null || netstat -tlnp 2>/dev/null

echo ""
echo "2. 防火墙状态:"
sudo ufw status 2>/dev/null || sudo firewall-cmd --state 2>/dev/null || echo " 未安装防火墙 "

echo ""
echo "3. SSH 配置:"
grep -E "^(Port|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config 2>/dev/null

echo ""
echo "4. 系统更新状态:"
if command -v apt &> /dev/null; then
    apt list --upgradable 2>/dev/null | head -10
elif command -v yum &> /dev/null; then
    yum check-update 2>/dev/null | head -10
fi

# 2. 显示加固建议
echo ""
echo "🔧 建议的加固措施:"
echo "=================="
echo "1. 禁用 root 登录:修改 /etc/ssh/sshd_config 设置 PermitRootLogin no"
echo "2. 使用密钥认证:设置 PasswordAuthentication no"
echo "3. 更改默认 SSH 端口:修改 Port 为非常用端口 "
echo "4. 启用防火墙:sudo ufw enable 或配置 firewalld"
echo "5. 配置自动更新:apt 安装 unattended-upgrades"
echo "6. 启用磁盘加密:使用 LUKS 加密数据分区 "

# 3. 询问是否执行修复
echo ""
read -p " 是否查看详细加固命令?(y/n) " confirm

if ["$confirm" = "y"]; then
    echo ""
    echo "📖 详细加固命令:"
    echo "================"
    echo ""
    echo "# SSH 加固 "
    echo "sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config"
    echo "sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config"
    echo "sudo systemctl restart sshd"
    echo ""
    echo "# 防火墙配置(UFW)"
    echo "sudo ufw default deny incoming"
    echo "sudo ufw default allow outgoing"
    echo "sudo ufw allow ssh"
    echo "sudo ufw enable"
    echo ""
    echo "# 自动更新(Ubuntu/Debian)"
    echo "sudo apt install unattended-upgrades"
    echo "sudo dpkg-reconfigure unattended-upgrades"
fi

04 会话日志分析(session-logs)

基础用法

OpenClaw 会话日志存储在:

~/.openclaw/agents/<agentId>/sessions/*.jsonl

列出所有会话:

for f in ~/.openclaw/agents/*/sessions/*.jsonl; do
  date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
  size=$(ls -lh "$f" | awk '{print $5}')
  echo "$date $size $(basename $f)"
done | sort -r

查找特定日期的会话:

TARGET_DATE="2026-01-06"
for f in ~/.openclaw/agents/*/sessions/*.jsonl; do
  head -1 "$f" | jq -r '.timestamp' | grep -q "$TARGET_DATE" && echo "$f"
done

提取用户消息:

jq -r 'select(.message.role == "user") | \
  .message.content[]? | \
  select(.type == "text") | \
  .text' <session>.jsonl

搜索关键词:

jq -r 'select(.message.role == "assistant") | \
  .message.content[]? | \
  select(.type == "text") | \
  .text' <session>.jsonl | rg -i "password"

实战案例 3:成本分析与优化

#!/bin/bash
# cost-analysis.sh

echo "💰 OpenClaw 使用成本分析 "
echo "=========================="

# 查找所有会话目录
SESSIONS_DIRS=$(find ~/.openclaw/agents -name "sessions" -type d 2>/dev/null)

if [-z "$SESSIONS_DIRS"]; then
    echo " 未找到会话日志目录 "
    exit 1
fi

# 每日成本汇总
echo ""
echo "📅 每日成本:"
for dir in $SESSIONS_DIRS; do
    for f in "$dir"/*.jsonl; do
        if [-f "$f"]; then
            date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
            cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f" 2>/dev/null)
            if [-n "$date"] && [-n "$cost"]; then
                echo "$date: \$$cost"
            fi
        fi
    done
done | awk '{a[$1]+=$2} END {for(d in a) print d, "$"a[d]}' | sort -r | head -10

# 统计信息
echo ""
echo "📊 会话统计:"
TOTAL_SESSIONS=0
TOTAL_MESSAGES=0
TOTAL_COST=0

for dir in $SESSIONS_DIRS; do
    count=$(ls "$dir"/*.jsonl 2>/dev/null | wc -l)
    TOTAL_SESSIONS=$((TOTAL_SESSIONS + count))

    for f in "$dir"/*.jsonl; do
        if [-f "$f"]; then
            msgs=$(jq -s 'length' "$f" 2>/dev/null)
            cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f" 2>/dev/null)
            TOTAL_MESSAGES=$((TOTAL_MESSAGES + msgs))
            TOTAL_COST=$(echo "$TOTAL_COST + $cost" | bc -l 2>/dev/null || echo "$TOTAL_COST")
        fi
    done
done

echo " 总会话数: $TOTAL_SESSIONS"
echo " 总消息数: $TOTAL_MESSAGES"
echo " 总成本: \$$TOTAL_COST"

# 工具使用频率
echo ""
echo "🛠️ 工具使用频率:"
for dir in $SESSIONS_DIRS; do
    jq -r '.message.content[]? | select(.type == "toolCall") | .name' \
        "$dir"/*.jsonl 2>/dev/null
done | sort | uniq -c | sort -rn | head -10

实战案例 4:异常行为检测

#!/bin/bash
# anomaly-detection.sh

echo "🔍 异常行为检测 "
echo "==============="

# 查找所有会话目录
SESSIONS_DIRS=$(find ~/.openclaw/agents -name "sessions" -type d 2>/dev/null)

if [-z "$SESSIONS_DIRS"]; then
    echo " 未找到会话日志目录 "
    exit 1
fi

# 1. 检测敏感关键词
SENSITIVE_KEYWORDS=("password" "secret" "token" "key" "credential" "api_key" "private_key")

echo ""
echo "⚠️ 包含敏感词的会话:"
for keyword in "${SENSITIVE_KEYWORDS[@]}"; do
    echo ""
    echo " 关键词 '$keyword':"
    for dir in $SESSIONS_DIRS; do
        for f in "$dir"/*.jsonl; do
            if [-f "$f"]; then
                if jq -r '.message.content[]? | select(.type == "text") | .text' "$f" 2>/dev/null | rg -iq "$keyword"; then
                    echo "  - $(basename $f)"
                fi
            fi
        done
    done
done

# 2. 检测高成本会话(超过 $1)echo ""
echo "💸 高成本会话(>\$1):"
for dir in $SESSIONS_DIRS; do
    for f in "$dir"/*.jsonl; do
        if [-f "$f"]; then
            cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f" 2>/dev/null)
            if [-n "$cost"] && (($(echo "$cost > 1" | bc -l 2>/dev/null || echo "0") )); then
                echo "$(basename $f): \$$cost"
            fi
        fi
    done
done

# 3. 检测工具调用异常(如大量 exec)echo ""
echo "🔧 工具调用分析:"
for dir in $SESSIONS_DIRS; do
    for f in "$dir"/*.jsonl; do
        if [-f "$f"]; then
            exec_count=$(jq -r '.message.content[]? | select(.type == "toolCall") | .name' "$f" 2>/dev/null | grep -c "exec")
            if ["$exec_count" -gt 50]; then
                echo "$(basename $f): $exec_count 次 exec 调用 "
            fi
        fi
    done
done

05 综合实战

案例 5:安全事件响应自动化

#!/bin/bash
# incident-response.sh

INCIDENT_TYPE="$1"

case $INCIDENT_TYPE in
  "suspicious-login")
    echo "🚨 检测到可疑登录 "

    # 1. 收集系统状态
    REPORT_FILE="/tmp/incident-report-$(date +%Y%m%d-%H%M%S).md"

    cat > $REPORT_FILE << EOF
# 安全事件报告

** 时间:** $(date)
** 类型:** $INCIDENT_TYPE

## 系统状态

### 当前登录用户
\`\`\`
$(who)
\`\`\`

### 最近登录记录
\`\`\`
$(last -10 2>/dev/null || echo " 无法获取登录记录 ")
\`\`\`

### 开放端口
\`\`\`
$(ss -ltnup 2>/dev/null || netstat -tlnp 2>/dev/null)
\`\`\`

### 防火墙状态
\`\`\`
$(sudo ufw status 2>/dev/null || echo " 防火墙状态未知 ")
\`\`\`

## 建议措施
1. 立即检查 /var/log/auth.log 中的异常
2. 如有可疑 IP,立即加入防火墙黑名单
3. 考虑更改 SSH 密钥和密码
4. 检查是否有未授权进程在运行

## 后续行动
- [ ] 完成安全审计
- [ ] 更新防火墙规则
- [ ] 通知安全团队
EOF

    echo " 事件报告已生成: $REPORT_FILE"
    cat $REPORT_FILE
    ;;

  "config-change")
    echo "⚙️ 检测到配置变更 "
    echo " 请检查以下配置文件的最近修改:"
    echo "- ~/.openclaw/config.json"
    echo "- /etc/ssh/sshd_config"
    echo "- 防火墙规则 "
    ;;

  *)
    echo " 未知事件类型: $INCIDENT_TYPE"
    echo " 用法: $0 [suspicious-login|config-change]"
    exit 1
    ;;
esac

案例 6:定期安全报告

#!/bin/bash
# weekly-security-report.sh

WEEK=$(date +%Y-W%U)
REPORT="/var/log/security-weekly-$WEEK.md"

cat > $REPORT << EOF
# 安全周报 ($WEEK)

生成时间: $(date)

## 1. 系统安全状态

### 1.1 系统信息
\`\`\`
$(uname -a)
\`\`\`

### 1.2 开放端口
\`\`\`
$(ss -ltnup 2>/dev/null || netstat -tlnp 2>/dev/null || echo " 命令不可用 ")
\`\`\`

### 1.3 防火墙状态
\`\`\`
$(sudo ufw status 2>/dev/null || sudo firewall-cmd --state 2>/dev/null || echo " 防火墙未安装 ")
\`\`\`

### 1.4 SSH 配置
\`\`\`
$(grep -E "^(Port|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config 2>/dev/null || echo "SSH 配置读取失败 ")
\`\`\`

### 1.5 磁盘使用情况
\`\`\`
$(df -h 2>/dev/null | head -10)
\`\`\`

## 2. OpenClaw 状态

### 2.1 版本信息
\`\`\`
$(openclaw --version 2>/dev/null || echo " 无法获取版本 ")
\`\`\`

### 2.2 运行状态
\`\`\`
$(openclaw status 2>/dev/null || echo " 无法获取状态 ")
\`\`\`

## 3. 会话活动分析

### 3.1 本周会话统计
EOF

# 统计本周会话
find ~/.openclaw/agents -name "sessions" -type d 2>/dev/null | while read dir; do
    echo " 目录: $dir" >> $REPORT
    echo " 会话数: $(ls "$dir"/*.jsonl 2>/dev/null | wc -l)" >> $REPORT
    echo "" >> $REPORT
done

cat >> $REPORT << EOF

## 4. 建议措施

- [ ] 检查系统更新
- [ ] 审查防火墙规则
- [ ] 验证备份状态
- [ ] 检查磁盘空间

---
* 本报告由自动化脚本生成 *
EOF

echo " 周报已生成: $REPORT"

06 常见问题

Q1: 安全审计需要 root 权限吗?

回答: 部分检查需要,建议:

# 使用 sudo 运行
sudo ./daily-security-check.sh

# 或配置免密 sudo(谨慎使用)# /etc/sudoers:
user ALL=(ALL) NOPASSWD: /usr/bin/ss,/usr/sbin/ufw

Q2: 日志文件太大怎么办?

解决:

# 压缩旧日志
gzip ~/.openclaw/agents/*/sessions/*.jsonl.$(date -d '30 days ago' +%Y%m)*

# 或定期清理
find ~/.openclaw/agents/*/sessions -name "*.jsonl" -mtime +90 -delete

# 查看日志大小
du -sh ~/.openclaw/agents/*/sessions/

Q3: 如何保护敏感日志?

建议:

# 设置权限
chmod 700 ~/.openclaw/agents
chmod 600 ~/.openclaw/agents/*/sessions/*.jsonl

# 检查权限
ls -la ~/.openclaw/agents/

Q4: 如何手动运行 healthcheck 技能?

步骤: 1. 阅读 SKILL.md 文件:bash cat ~/.nvm/versions/node/v22.17.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md 2. 根据指导进行系统检查 3. 该技能会引导你完成风险评估和加固


07 总结

下一步: – 建立定期安全巡检机制 – 结合告警系统实现实时响应 – 制定安全事件响应预案


本文是 OpenClaw 进阶技能系列第 10 篇(完结)

系列回顾: 1. OpenClaw + Codex:让 AI 帮你写代码 2. 用 OpenClaw 搭建自动化代码审查工作流 3. OpenClaw 批量生图实战:从 Prompt 到成品画廊 4. OpenClaw 语音工作流:听写、合成、通话一条龙 5. OpenClaw 浏览器自动化:解放你的重复操作 6. OpenClaw 笔记自动化:一句话记到所有平台 7. 用 OpenClaw 打造语音智能家居中枢 8. OpenClaw + 飞书:企业自动化完全指南 9. OpenClaw 媒体处理:视频、图片、GIF 全搞定 10. OpenClaw 安全运维:自动化巡检与加固

#OpenClaw #安全运维 #自动化巡检 #日志分析 #系统加固

正文完