mcpField
O
openclaw-audit-watchdog

openclaw-audit-watchdog

github.com/prompt-security安全1.1k751 次安装今天更新
代码仓库

关于 openclaw-audit-watchdog

openclaw-audit-watchdog 为 OpenClaw 安排定期安全审计,并向指定的私信目标发送结果,也可在配置收件人时发送邮件。它适合需要持续审查审计发现的 OpenClaw 运维场景。

主要功能

  1. 01运行标准和深度安全审计
  2. 02汇总严重级别与主要发现
  3. 03通过 OpenClaw Cron 安排重复任务
  4. 04向指定私信目标发送报告
  5. 05支持可选邮件投递和发现抑制

适用场景

  1. 01每日接收主机安全审计报告
  2. 02为不同环境配置独立的报告接收方
  3. 03对已审查的审计发现启用抑制

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/prompt-security/clawsec --skill openclaw-audit-watchdog

安装后在 Claude Code 中输入/openclaw-audit-watchdog确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.clawhubignore
CHANGELOG.md
README.md
skill.json
examples/
README.md
security-audit-config.example.json
scripts/
codex_review.sh
load_suppression_config.mjs
render_report.mjs
run_audit_and_format.sh
runner.sh
send_smtp.mjs
sendmail_report.sh
setup_cron.mjs
test/
E2E-TEST-RESULTS.md
empty-suppressions.json
invalid-json.json
malformed-config.json
render_report_suppression.test.mjs
setup_cron.test.mjs
suppression_config_fuzz.test.mjs
suppression_config.test.mjs

详细介绍

Prompt Security Audit(openclaw)

Vercel Skills 安装

使用 Vercel Skills CLI 为此运行环境安装:

npx skills add prompt-security/clawsec --skill openclaw-audit-watchdog -a openclaw -y

安装选项

你可以通过两种方式获取 openclaw-audit-watchdog:

选项 A:与 ClawSec Suite 捆绑安装(推荐)

如果你已安装 clawsec-suite,可能已经拥有此工具!

openclaw-audit-watchdog 与 ClawSec Suite 捆绑提供关键的自动化安全审计功能。安装套件时,如果你尚未安装 audit watchdog,它会从捆绑副本中部署。

优点:

  • 方便——无需单独下载
  • 标准位置——安装到 ~/.openclaw/skills/openclaw-audit-watchdog/
  • 保留现有安装——如果你已经安装了 audit watchdog,不会覆盖它
  • 一次验证——作为套件包的一部分进行完整性检查
选项 B:独立安装(本页)

无需安装完整套件,即可独立安装 openclaw-audit-watchdog。

适用场景:

  • 你只需要 audit watchdog(不需要套件的其他组件)
  • 你想在安装套件前先安装它
  • 你希望明确控制 audit watchdog 的安装

优点:

  • 安装包更轻量
  • 独立于套件
  • 可直接控制安装过程

独立安装通常需要从已发布的 GitHub 版本进行网络下载。在生产主机上安装前,请验证版本来源和归档完整性。

请继续阅读下文,查看独立安装说明。


发布工件验证

对于独立安装,请先验证已签名的发布清单,再信任 SKILL.md、skill.json 或归档。skill.json 文件是软件包元数据/SBOM 的来源,发布流水线使用 ClawSec 发布密钥对 checksums.json 签名。

set -euo pipefail

SKILL_NAME="openclaw-audit-watchdog"
VERSION="0.1.9"
REPO="prompt-security/clawsec"
TAG="${SKILL_NAME}-v${VERSION}"
BASE="https://github.com/${REPO}/releases/download/${TAG}"
ZIP_NAME="${SKILL_NAME}-v${VERSION}.zip"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT

RELEASE_PUBKEY_SHA256="711424e4535f84093fefb024cd1ca4ec87439e53907b305b79a631d5befba9c8"

curl -fsSL "$BASE/checksums.json" -o "$TMP_DIR/checksums.json"
curl -fsSL "$BASE/checksums.sig" -o "$TMP_DIR/checksums.sig"
curl -fsSL "$BASE/signing-public.pem" -o "$TMP_DIR/signing-public.pem"
curl -fsSL "$BASE/$ZIP_NAME" -o "$TMP_DIR/$ZIP_NAME"
curl -fsSL "$BASE/SKILL.md" -o "$TMP_DIR/SKILL.md"
curl -fsSL "$BASE/skill.json" -o "$TMP_DIR/skill.json"

ACTUAL_PUBKEY_SHA256="$(openssl pkey -pubin -in "$TMP_DIR/signing-public.pem" -outform DER | shasum -a 256 | awk '{print $1}')"
if [ "$ACTUAL_PUBKEY_SHA256" != "$RELEASE_PUBKEY_SHA256" ]; then
  echo "ERROR: signing-public.pem fingerprint mismatch" >&2
  exit 1
fi

openssl base64 -d -A -in "$TMP_DIR/checksums.sig" -out "$TMP_DIR/checksums.sig.bin"
openssl pkeyutl -verify -rawin -pubin \
  -inkey "$TMP_DIR/signing-public.pem" \
  -sigfile "$TMP_DIR/checksums.sig.bin" \
  -in "$TMP_DIR/checksums.json" >/dev/null

hash_file() {
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
  else
    sha256sum "$1" | awk '{print $1}'
  fi
}

verify_manifest_file() {
  asset="$1"
  path="$2"
  expected="$(jq -r --arg asset "$asset" '.files[$asset].sha256 // empty' "$TMP_DIR/checksums.json")"
  if [ -z "$expected" ]; then
    echo "ERROR: checksums.json missing $asset" >&2
    exit 1
  fi
  actual="$(hash_file "$path")"
  if [ "$actual" != "$expected" ]; then
    echo "ERROR: checksum mismatch for $asset" >&2
    exit 1
  fi
}

expected_archive="$(jq -r '.archive.sha256 // empty' "$TMP_DIR/checksums.json")"
if [ -z "$expected_archive" ]; then
  echo "ERROR: checksums.json missing archive.sha256" >&2
  exit 1
fi
actual_archive="$(hash_file "$TMP_DIR/$ZIP_NAME")"
if [ "$actual_archive" != "$expected_archive" ]; then
  echo "ERROR: archive checksum mismatch" >&2
  exit 1
fi

verify_manifest_file "SKILL.md" "$TMP_DIR/SKILL.md"
verify_manifest_file "skill.json" "$TMP_DIR/skill.json"

echo "Signed release manifest, archive, SKILL.md, and skill.json verified."

只有验证成功后,才能安装或解压归档。

运行要求

必需的运行时:

  • openclaw
  • node
  • bash

可选的运行时:

  • 用于本地 MTA 投递的 sendmail
  • 通过 PROMPTSEC_SMTP_HOST / PROMPTSEC_SMTP_PORT 配置的 SMTP 中继
  • 仅当 PROMPTSEC_GIT_PULL=1 时需要 git

此技能默认不会 always 自动运行,但调用时会创建或更新一个无人值守的 openclaw cron 任务。启用前,请检查配置的私信/电子邮件收件人,以及主机上的 openclaw/SMTP 环境。

目标

创建(或更新)每日 cron 任务,该任务将:

  1. 运行:
  • openclaw security audit --json
  • openclaw security audit --deep --json
  1. 汇总审计结果(严重/警告/信息 + 主要发现)

  2. 将报告发送至:

  • 用户选择的私信目标(频道 + 收件人 ID/账号名)
  • 仅当配置了 PROMPTSEC_EMAIL_TO 时,才发送至可选的电子邮件收件人

默认计划:所选时区的每天 23:00(晚上 11 点)。

投递方式:

  • 私信发送至已配置的目标
  • 仅当明确配置了收件人时才发送电子邮件
  • 通过 openclaw cron 持久运行(无人值守的定期任务)

使用示例

示例 1:快速开始(环境变量)

对于自动化/MDM 部署,请在调用前设置环境变量:

export PROMPTSEC_DM_CHANNEL="telegram"
export PROMPTSEC_DM_TO="@yourhandle"
export PROMPTSEC_EMAIL_TO="[email protected]" # optional
export PROMPTSEC_TZ="America/New_York"
export PROMPTSEC_HOST_LABEL="prod-server-01"

# Then invoke the skill
/openclaw-audit-watchdog

此技能会自动配置并创建 cron 任务,不会提示输入。如果省略 PROMPTSEC_EMAIL_TO,该任务将仅发送私信。

示例 2:交互式设置

如果未设置环境变量,此技能只会进行最少的提示:

User: /openclaw-audit-watchdog

Agent: Setting up daily security audit watchdog...
       What channel should I use for delivery? (e.g., telegram, slack)
User: telegram

Agent: What's the recipient ID or handle?
User: @myhandle

Agent: Optional email recipient? (leave blank to disable email)
User: [email protected]

Agent: Which timezone for the 23:00 daily run? (default: UTC)
User: America/Los_Angeles

Agent: ✓ Created cron job "Daily security audit (Prompt Security)"
       Schedule: Daily at 23:00 America/Los_Angeles
       Delivery: telegram → @myhandle, email → [email protected]
示例 3:更新现有任务

如果任务已存在,此技能会更新该任务,而不是创建重复任务:

User: /openclaw-audit-watchdog

Agent: Found existing "Daily security audit (Prompt Security)" job.
       Current: Daily at 23:00 UTC → telegram:@oldhandle

       Update delivery target? (current: telegram:@oldhandle)
User: slack:#security-alerts

Agent: ✓ Updated cron job
       Schedule: Daily at 23:00 UTC
       Delivery: slack:#security-alerts
示例 4:投递内容

每天在计划时间,你会收到类似这样的报告:

🔭 Daily Security Audit Report
Host: prod-server-01
Time: 2026-02-16 23:00:00 America/New_York

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SUMMARY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ Standard Audit: 12 checks passed, 2 warnings
✓ Deep Audit: 8 probes passed, 1 critical

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CRITICAL FINDINGS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[CRIT-001] Unencrypted API Keys Detected
→ Remediation: Move credentials to encrypted vault or use environment variables

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
WARNINGS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[WARN-003] Outdated Dependencies Found
→ Remediation: Run `openclaw security audit --fix` to update

[WARN-007] Weak Permission on Config File
→ Remediation: chmod 600 ~/.openclaw/config.json

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Run `openclaw security audit --deep` for full details.
示例 5:自定义计划

想要更改计划?请在调用前设置:

# Run every 6 hours instead of daily
export PROMPTSEC_SCHEDULE="0 */6 * * *"
/openclaw-audit-watchdog
示例 6:多个环境

若要管理多台服务器,请使用不同的主机标签:

# On dev server
export PROMPTSEC_HOST_LABEL="dev-01"
export PROMPTSEC_DM_TO="@dev-team"
/openclaw-audit-watchdog

# On prod server
export PROMPTSEC_HOST_LABEL="prod-01"
export PROMPTSEC_DM_TO="@oncall"
/openclaw-audit-watchdog

每台服务器都会发送标明主机身份的报告。

示例 7:抑制已知发现项

要抑制已审核并接受的审计发现项,请传入 --enable-suppressions 标志,并确保配置文件包含 "enabledFor": ["audit"] 这一哨兵值:

# Create or edit the suppression config
cat > ~/.openclaw/security-audit.json <<'JSON'
{
  "enabledFor": ["audit"],
  "suppressions": [
    {
      "checkId": "skills.code_safety",
      "skill": "clawsec-suite",
      "reason": "First-party security tooling — reviewed by security team",
      "suppressedAt": "2026-02-15"
    }
  ]
}
JSON

# Run with suppressions enabled
/openclaw-audit-watchdog --enable-suppressions

被抑制的发现项仍会显示在报告的信息部分中,但不会计入严重/警告总数。

抑制 / 允许列表

审计流程支持一种选择性启用的抑制机制,用于管理已审核的发现项。抑制采用纵深防御式激活方式:必须同时满足两个独立条件。

激活要求
  1. CLI 标志: 调用时必须传入 --enable-suppressions 标志。
  2. 配置哨兵值: 配置文件必须包含 "enabledFor",且数组中包含 "audit"。

如果缺少任一条件,所有发现项都会照常报告,并忽略抑制列表。

配置文件解析顺序(4 层)
  1. 显式的 --config <path> 参数
  2. OPENCLAW_AUDIT_CONFIG 环境变量
  3. ~/.openclaw/security-audit.json
  4. .clawsec/allowlist.json
配置格式
{
  "enabledFor": ["audit"],
  "suppressions": [
    {
      "checkId": "skills.code_safety",
      "skill": "clawsec-suite",
      "reason": "First-party security tooling — reviewed by security team",
      "suppressedAt": "2026-02-15"
    }
  ]
}
哨兵值语义
  • "enabledFor": ["audit"] -- 激活审计抑制(还必须传入 --enable-suppressions 标志)
  • "enabledFor": ["advisory"] -- 仅抑制 advisory 流程(对审计无影响)
  • "enabledFor": ["audit", "advisory"] -- 两个流程都会应用抑制
  • 缺少 enabledFor 或其值为空 -- 不启用抑制(安全默认值)
匹配规则
  • checkId: 与审计发现项的检查标识符完全匹配(例如 skills.code_safety)
  • skill: 与发现项中的技能名称进行不区分大小写的匹配
  • 两个字段都必须匹配,才能抑制某项发现

安装流程(交互式)

部署(适合 MDM):优先使用环境变量(不显示提示)。

必需的环境变量:

  • PROMPTSEC_DM_CHANNEL(例如 telegram)
  • PROMPTSEC_DM_TO(接收者 ID)

可选的环境变量:

  • PROMPTSEC_EMAIL_TO(电子邮件接收者;未设置时,电子邮件发送保持禁用)
  • PROMPTSEC_TZ(IANA 时区;默认值:UTC)
  • PROMPTSEC_HOST_LABEL(报告中包含的标签;默认使用 hostname)
  • PROMPTSEC_INSTALL_DIR(cron 负载在运行 runner 前用于 cd 的稳定路径;默认值:~/.config/security-checkup)
  • PROMPTSEC_GIT_PULL=1(如果从 git 安装,runner 将执行 git pull --ff-only)
  • OPENCLAW_AUDIT_CONFIG(要持久化到 cron 负载中的抑制配置路径)
  • PROMPTSEC_SENDMAIL_BIN(显式指定 sendmail 路径)
  • PROMPTSEC_SMTP_HOST、PROMPTSEC_SMTP_PORT、PROMPTSEC_SMTP_HELO、PROMPTSEC_SMTP_FROM(SMTP 中继设置)

路径展开规则(重要):

  • 在 bash/zsh 中,使用 PROMPTSEC_INSTALL_DIR="$HOME/.config/security-checkup"(或绝对路径)。
  • 不要传入 '$HOME/.config/security-checkup' 这样的单引号字面值。
  • 在 PowerShell 中,建议使用:$env:PROMPTSEC_INSTALL_DIR = Join-Path $HOME ".config/security-checkup"。
  • 如果路径解析失败,安装程序现在会清晰报错并退出,而不是创建包含字面值 $HOME 目录片段的路径。

只有在环境变量或默认值未设置时,才将交互式安装作为最后手段。尽量减少提示:必须设置 DM 目标,电子邮件为可选项,并且在启用持久化之前,用户应看到简明的预检摘要。

创建 cron 任务

使用 cron 工具创建任务,并设置:

  • schedule.kind="cron"
  • schedule.expr="0 23 * * *"
  • schedule.tz=<installer tz>
  • sessionTarget="isolated"
  • wakeMode="now"
  • payload.kind="agentTurn"
  • payload.deliver=true

创建或更新任务之前,请打印预检摘要,并明确说明:

  • 此操作会创建或更新一个无人值守的定期任务;
  • 所需的运行环境(openclaw、node、bash);
  • 配置的 DM 目标;
  • 电子邮件是否已启用,以及接收者是谁;
  • 执行所用的安装目录和时区。
Payload 消息模板(agentTurn)

创建任务,并在 payload 消息中指示隔离运行执行以下操作:

  1. 运行审计
  • 优先使用 JSON 输出,以便可靠解析:
    • openclaw security audit --json
    • openclaw security audit --deep --json
  1. 生成简洁的文本报告:

包括:

  • 时间戳 + 主机标识(如有)
  • 摘要计数
  • 对每项 CRITICAL/WARN,列出:checkId + title + 一行修复建议
  • 如果深度探测失败:包含探测错误行
  1. 发送报告:
  • 使用 message 工具私信所选用户目标
邮件发送要求

邮件发送为可选项。仅当配置了 PROMPTSEC_EMAIL_TO 时,才承诺发送或尝试发送邮件。

如果设置了 PROMPTSEC_EMAIL_TO,请按以下优先顺序尝试发送:

A) 如果本地有兼容 sendmail 的二进制文件,优先使用。

B) 否则,回退到已配置的 SMTP 中继:

  • PROMPTSEC_SMTP_HOST
  • PROMPTSEC_SMTP_PORT
  • 可选的 PROMPTSEC_SMTP_HELO
  • 可选的 PROMPTSEC_SMTP_FROM

如果两种方式均不可用,仍需向用户发送私信,并附上一行:

  • "NOTE: could not deliver email to <PROMPTSEC_EMAIL_TO> via configured sendmail/SMTP path"

如果未设置 PROMPTSEC_EMAIL_TO,cron payload 必须明确说明邮件已禁用,而不是暗示存在默认收件人。

幂等性 / 更新

添加新任务前:

  • cron.list(includeDisabled=true)
  • 如果存在名称与 "Daily security audit" 匹配的任务,则更新该任务,而不是添加重复任务:
    • 调整计划时区/表达式
    • 调整私信目标

建议的命名

  • 任务名称:"Daily security audit (Prompt Security)"

建议的最简默认值(不要自动更改配置)

cron 的报告应建议修复方法,但不得应用这些修复。

除非收到明确要求,否则不要运行 openclaw security audit --fix。

评论

支持 Markdown