关于 openclaw-audit-watchdog
openclaw-audit-watchdog 为 OpenClaw 安排定期安全审计,并向指定的私信目标发送结果,也可在配置收件人时发送邮件。它适合需要持续审查审计发现的 OpenClaw 运维场景。
主要功能
- 01运行标准和深度安全审计
- 02汇总严重级别与主要发现
- 03通过 OpenClaw Cron 安排重复任务
- 04向指定私信目标发送报告
- 05支持可选邮件投递和发现抑制
适用场景
- 01每日接收主机安全审计报告
- 02为不同环境配置独立的报告接收方
- 03对已审查的审计发现启用抑制
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ prompt-security/ clawsec --skill openclaw-audit-watchdog安装后在 Claude Code 中输入/openclaw-audit-watchdog确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.clawhubignoreCHANGELOG.mdREADME.mdskill.jsonexamples/README.mdsecurity-audit-config.example.jsonscripts/codex_review.shload_suppression_config.mjsrender_report.mjsrun_audit_and_format.shrunner.shsend_smtp.mjssendmail_report.shsetup_cron.mjstest/E2E-TEST-RESULTS.mdempty-suppressions.jsoninvalid-json.jsonmalformed-config.jsonrender_report_suppression.test.mjssetup_cron.test.mjssuppression_config_fuzz.test.mjssuppression_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."
只有验证成功后,才能安装或解压归档。
运行要求
必需的运行时:
openclawnodebash
可选的运行时:
- 用于本地 MTA 投递的
sendmail - 通过
PROMPTSEC_SMTP_HOST/PROMPTSEC_SMTP_PORT配置的 SMTP 中继 - 仅当
PROMPTSEC_GIT_PULL=1时需要git
此技能默认不会 always 自动运行,但调用时会创建或更新一个无人值守的 openclaw cron 任务。启用前,请检查配置的私信/电子邮件收件人,以及主机上的 openclaw/SMTP 环境。
目标
创建(或更新)每日 cron 任务,该任务将:
- 运行:
openclaw security audit --jsonopenclaw security audit --deep --json
-
汇总审计结果(严重/警告/信息 + 主要发现)
-
将报告发送至:
- 用户选择的私信目标(频道 + 收件人 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
被抑制的发现项仍会显示在报告的信息部分中,但不会计入严重/警告总数。
抑制 / 允许列表
审计流程支持一种选择性启用的抑制机制,用于管理已审核的发现项。抑制采用纵深防御式激活方式:必须同时满足两个独立条件。
激活要求
- CLI 标志: 调用时必须传入
--enable-suppressions标志。 - 配置哨兵值: 配置文件必须包含
"enabledFor",且数组中包含"audit"。
如果缺少任一条件,所有发现项都会照常报告,并忽略抑制列表。
配置文件解析顺序(4 层)
- 显式的
--config <path>参数 OPENCLAW_AUDIT_CONFIG环境变量~/.openclaw/security-audit.json.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 消息中指示隔离运行执行以下操作:
- 运行审计
- 优先使用 JSON 输出,以便可靠解析:
openclaw security audit --jsonopenclaw security audit --deep --json
- 生成简洁的文本报告:
包括:
- 时间戳 + 主机标识(如有)
- 摘要计数
- 对每项 CRITICAL/WARN,列出:
checkId+title+ 一行修复建议 - 如果深度探测失败:包含探测错误行
- 发送报告:
- 使用
message工具私信所选用户目标
邮件发送要求
邮件发送为可选项。仅当配置了 PROMPTSEC_EMAIL_TO 时,才承诺发送或尝试发送邮件。
如果设置了 PROMPTSEC_EMAIL_TO,请按以下优先顺序尝试发送:
A) 如果本地有兼容 sendmail 的二进制文件,优先使用。
B) 否则,回退到已配置的 SMTP 中继:
PROMPTSEC_SMTP_HOSTPROMPTSEC_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。