soul-guardian について
soul-guardianは、承認済みベースラインと照合してエージェントの中核ファイルを監視し、差分を通知して、対象ファイルを自動復元できます。OpenClawのワークスペース設定やプロンプトを保護したいユーザー向けです。
主な機能
- 01SHA-256ベースラインとのファイル差分検出
- 02対象ファイルの復元または通知のみ
- 03確認用の統合差分生成
- 04ハッシュチェーンによる改ざん検知監査ログ
- 05継続監視とハートビートチェック
活用シーン
- 01SOUL.mdとAGENTS.mdへの不正変更の監視
- 02HEARTBEAT.mdなどの変更確認
- 03差分を確認したうえで意図した編集を承認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ prompt-security/ clawsec --skill soul-guardianインストール後、Claude Code で/soul-guardianを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.clawhubignoreCHANGELOG.mdREADME.mdskill.jsonscripts/install_launchd_plist.pyonboard_state_dir.pysoul_guardian.pytest_install_launchd_plist.pytest_soul_guardian.py詳細
soul-guardian 👻
自動検出、復元、ユーザーへの警告により、エージェントのコアファイル(SOUL.md、AGENTS.md など)を不正な変更から保護します。
Vercel Skills のインストール
このハーネスには、Vercel Skills CLI を使ってインストールします。
npx skills add prompt-security/clawsec --skill soul-guardian -a openclaw -y
運用上の注意事項
- 必須ランタイム:
python3 - オプションのランタイム:cron 統合用の
openclaw、macOS のスケジュール設定用のlaunchctl、デモヘルパー用のbash - 副作用:保護対象ファイルを承認済みのベースラインに自動復元し、監査/隔離の状態をローカルに書き込む場合があります
- ネットワーク動作:デフォルトではありません
- 信頼モデル:スケジュール設定はすべてオプトインですが、復元モードでは意図的にベースラインから逸脱したファイルを上書きします
リリースアーティファクトの検証
単体でインストールする場合は、SKILL.md、skill.json、またはアーカイブを信頼する前に、署名済みリリースマニフェストを検証してください。skill.json ファイルはパッケージメタデータ/SBOM のソースであり、リリースパイプラインは ClawSec リリースキーを使って checksums.json に署名します。
set -euo pipefail
SKILL_NAME="soul-guardian"
VERSION="0.0.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."
この検証に成功してから、アーカイブをインストールまたは展開してください。
クイックスタート(3 ステップ)
ステップ 1:ベースラインを初期化する
cd ~/.openclaw/workspace
python3 skills/soul-guardian/scripts/soul_guardian.py init --actor setup --note "initial baseline"
ステップ 2:監視を有効にする
python3 skills/soul-guardian/scripts/soul_guardian.py enable-monitoring
これにより、ワークフローに監視を追加する方法を確認できます。
ステップ 3:HEARTBEAT.md に追加する(推奨)
自動監視のため、以下を HEARTBEAT.md に追加してください。
## Soul Guardian Check
- Run `python3 skills/soul-guardian/scripts/soul_guardian.py check --actor heartbeat --output-format alert`
- If any output is produced, relay it to the user immediately as a security alert
これで完了です。Soul Guardian は次の処理を行います。
- ✅ 保護対象ファイルへの不正な変更を検出する
- ✅ SOUL.md と AGENTS.md を承認済みのベースラインに自動復元する
- ✅ 差分を検出して処理したときに警告する
保護対象(デフォルトポリシー)
| ファイル | モード | 差分発生時の動作 |
|---|---|---|
| SOUL.md | restore | 自動復元+警告 |
| AGENTS.md | restore | 自動復元+警告 |
| USER.md | alert | 警告のみ |
| TOOLS.md | alert | 警告のみ |
| IDENTITY.md | alert | 警告のみ |
| HEARTBEAT.md | alert | 警告のみ |
| MEMORY.md | alert | 警告のみ |
| memory/*.md | ignore | 無視 |
コマンド
差分を確認する(警告を出力)
python3 skills/soul-guardian/scripts/soul_guardian.py check --output-format alert
- 差分がなければ何も出力しません
- 差分を検出すると、人が読める警告を出力します
- ハートビートとの統合に最適です
監視モード(継続的な監視)
python3 skills/soul-guardian/scripts/soul_guardian.py watch --interval 30
継続的に実行され、30 秒ごとに確認します。
意図的な変更を承認する
python3 skills/soul-guardian/scripts/soul_guardian.py approve --file SOUL.md --actor user --note "intentional update"
ステータスを表示する
python3 skills/soul-guardian/scripts/soul_guardian.py status
監査ログの整合性を検証する
python3 skills/soul-guardian/scripts/soul_guardian.py verify-audit
警告の形式
差分が検出されると、--output-format alert は次のような出力を生成します。
==================================================
🚨 SOUL GUARDIAN SECURITY ALERT
==================================================
📄 FILE: SOUL.md
Mode: restore
Status: ✅ RESTORED to approved baseline
Expected hash: abc123def456...
Found hash: 789xyz000111...
Diff saved: /path/to/patches/drift.patch
==================================================
Review changes and investigate the source of drift.
If intentional, run: soul_guardian.py approve --file <path>
==================================================
この出力は、TUI/チャットでユーザーに直接伝えることを想定しています。
セキュリティモデル
できること:
- 承認済みのベースラインと比較して、ファイルシステムの差分を検出します(sha256)
- 確認用の統合差分を生成します
- ハッシュチェーンによる改ざん検知可能な監査ログを維持します
- シンボリックリンクに対する操作を拒否します
- 復元時にアトミック書き込みを使用します
できないこと:
- 誰が変更したかを証明することはできません(変更者情報はベストエフォートのメタデータです)
- 攻撃者がワークスペースと状態ディレクトリの両方を制御している場合、保護できません
- バックアップの代わりにはなりません
推奨事項: 耐障害性を高めるため、状態ディレクトリはワークスペースの外に保存してください。
デモ
soul-guardian の動作を確認するには、デモを最初から最後まで実行してください。
bash skills/soul-guardian/scripts/demo.sh
次の処理が実行されます。
- クリーンな状態を確認します(何も出力しないチェック)
- SOUL.md に悪意のあるコンテンツを挿入します
- ハートビートチェックを実行します(警告を出力)
- SOUL.md が復元されたことを確認します
トラブルシューティング
「Not initialized」エラーが表示される:
まず init を実行して、ベースラインを設定してください。
差分が繰り返し発生する: ファイルを変更しているものを確認してください。監査ログとパッチを確認します。
変更を承認したい場合:
変更を確認した後、approve --file <path> を実行してください。