2026年 OpenClaw プラグインの fail-closed と manifest 強制を、リモート物理 Mac の 7×24 ゲートウェイで運用する——openclaw doctor 監査チェックリスト、ACP dispatch スイッチ、管理ロールバック Runbook(grep 断片+FAQ)
プラットフォーム/セキュリティ担当が 無人のリモート物理 Mac をゲートウェイとして借りるとき、各プラグインはサプライチェーンの一部だとすぐに分かります。深夜 3 時に、許容リストをすり抜けて未宣言のネットワークやファイルシステムアクセスが走る余地を残さないために、本稿は 有効な manifest がなければロードしない 方針と、検証失敗時は黙って許可に落ちない fail-closed を組み合わせます。誰がどの厳格さを選ぶかの二枚のマトリクス、七ステップのロールバック Runbook、コピペ可能な grep 検収断片、FAQ をまとめます。
はじめにとスコープ
ラック上のヘッドレス Mac では、プラグインは攻撃面の一部です。2026 年の主流パターンは、manifest 強制(準拠 manifest がなければロードしない)に fail-closed(検証失敗は実行を拒否し、黙って許可に降格しない)を重ねることです。
本稿はその姿勢を openclaw doctor でチェックリスト化し、変更票に貼れる grep に落とし込み、ACP(Agent Client Protocol)dispatch を「誰がプラグインスケジューラに届くか」のマスタースイッチとして扱います。スナップショットとペアでロールバックすれば、メンテナンスウィンドウ内の RTO を守りやすくなります。スコープはベンダーのモデル契約外とし、launchd がサービスユーザと WorkingDirectory を固定している前提です。長接続と企業外向き方針の文脈では OpenClaw と飛書/Lark・Teams の Runbook、JSONL とバックアップの運用では Cron・openclaw backup・JSONL の 7×24 記事 と併読すると証跡が揃いやすいです。
痛点の整理
- 制約:暗黙の権限と「動いたから出す」。
fsやnetwork、subprocessを manifest から落としたまま fail-open だと、監査では何が許されたか証明できません。 - 隠れコスト:doctor が緑でもポリシーが生きていない。
openclaw doctorがランタイムやポートを見ても、ホットリロードが manifest 強制フラグを取り込んでおらず、外向きにはレガシー挙動のまま、というズレが起きます。 - 安定性と監査:ペア無しのロールバックは机上の空論。 fail-closed を強くしすぎると正当な自動化が夜間に止まります。設定とプラグインバンドルをセットで戻せなければ、7×24 の SLO を pager 上の手編集 JSON で守ることになります。
fail-closed × manifest の意思決定マトリクス
一枚目は「どこまで厳しくするか」、二枚目は「どんな変更シグナルで何を増やして検収するか」です。
| 環境 | manifest | fail-closed | ACP dispatch |
|---|---|---|---|
| 本番 7×24 ゲートウェイ | 必須 | オン | clientId/ワークスペースの許可リストのみ |
| ステージング統合 | 必須 | オン(プラグイン単位の shadow 可) | テナント緩和は JSONL 全文で |
| 開発者ノート PC | 本番ミラー推奨 | 高速反復のため任意オフ | ローカル全開またはループバック拘束 |
| 変更シグナル | 推奨アクション | 追加検収 |
|---|---|---|
| 新規プラグインまたは大版本アップ | カナリアノード+二重 manifest の diff | doctor と宣言スキーマ版の grep |
| 外部 ACP/エージェントクライアントの増加 | dispatch 許可リストとレート制限を締める | requestId 単位でプラグイン span を追跡 |
| ログの denied 急増 | まず shadow 件数、次にロールバック判断 | ロールバック前後の 5 分窓を diff |
openclaw doctor 監査チェックリスト
doctor は「ポリシーが実際にロードされた証拠」として扱い、変更票の各項目にチェックを付けます(キー名は配布ドキュメントに合わせ openclaw.json または環境変数へマッピング)。
- ランタイムと PATH: launchd ユーザと一致し、
which openclawが plist のバイナリパスと一致する。 - manifest 解決: 実効プラグインルートが表示され、強制オン時は manifest のないディレクトリを拒否する。
- fail-closed フラグ: 真偽値と由来ファイルが doctor に出る。WARN はリリースブロッカー扱い。
- ACP dispatch: スイッチ状態と許可リスト件数。dispatch オンで許可リスト空なら「誰も入れない」警告が出るべき。
- 外部ヘルス: ローカルホストの
curlと/ready(ある場合)の両方で、「自己診断だけ緑・逆プロキシ赤」を避ける。
ACP dispatch スイッチ
ここでの ACP dispatch は、エージェントクライアント(IDE、CLI、外部オーケストレータ)からのリクエストがプラグインスケジューラに入れるかを決める層です。fail-closed と併用する場合の順序は、まず manifest でプラグイン集合を検証し、次に dispatch で正面玄関を守ることで、侵害されたクライアントが高リスクフックへ直行する経路を狭めます。
イメージ用 JSON(本番では配布スキーマのキーに置き換え):
{
"plugins": {
"requireManifest": true,
"failClosed": true,
"manifestSchemaVersion": "2026-05"
},
"acp": {
"dispatchEnabled": true,
"allowedClientIds": ["ci-runner-prod", "vscode-workspace-ops"],
"denyByDefault": true
}
}
allowedClientIds を社内 OAuth または mTLS の主体と揃え、JSONL では clientId × pluginId の直積をフォレンジック用に残します。
検受用 grep 断片
アーカイブまたは稼働ワークスペースで実行(パスは環境に合わせて調整):
# fail-closed / requireManifest の明示フラグ
grep -RniE 'failClosed|fail_closed|requireManifest|require_manifest' \
~/.config/openclaw ./openclaw.json 2>/dev/null
# 各プラグインディレクトリに manifest があるか(欠落=ロード不可のはず)
find "$OPENCLAW_PLUGIN_ROOT" -maxdepth 2 -type f \( -name 'manifest.json' -o -name 'plugin.yaml' \) | wc -l
# 本番では ACP の許可リストが空でないこと
grep -Rni 'dispatchEnabled|allowedClientIds|denyByDefault' ~/.config/openclaw ./openclaw.json 2>/dev/null
最初の grep が何も返さない場合、暗黙の fail-open のままの可能性が高いです。慣れで本番サインオフしないでください。
七ステップ管理ロールバック Runbook
- フリーズ: メンテ告知後、cron など呼び面を広げるジョブを一時停止。
- スナップショット:
openclaw.json、プラグインツリー、launchd の plist、doctor 標準出力を tar。 - manifest 強制オン: 再読み込み後に grep で確認し、「ロード拒否」カウンタを監視。
- fail-closed オン: 未宣言 capability は統一エラーで拒否。5 分間の JSONL ベースラインを取得。
- ACP dispatch 締め: まず shadow(ログのみ)、次に deny-by-default。
- ロールバック条件: SLO 逸脱なら ペア化した スナップショットを復元し、
launchctl kickstartのうえ doctor を再実行。 - RCA: grep チェックリストとチケットを更新し、次のカナリアを計画。
引用しやすい数値・方針
- 観測窓: ポリシー編集後は少なくとも 5 分のスライディング窓で維持/ロールバックを判断する。起動直後のスパイクだけではインシデントにしない。
- スナップショット保持: 本番では復元可能な設定リビジョンを 3 世代、それぞれプラグイン tarball のチェックサムと紐付ける。
- 監査保管: doctor 全文出力と grep キャプチャをチケットに添付し、社内コンプラのスポットチェックに備え 30 日以上保持するのが一般的な目安。
FAQ
manifest に capability を書いているのに「未宣言」と出る
doctor が表示する 解決済みパス と編集したファイルを突き合わせ、スキーマ版とフィールドの大文字小文字を確認します。必要ならステージングで同一バンドルをフルロードログ付きで再現してください。
dispatch を切ったあとも古いセッションからプラグインが呼ばれる?
キューと実装次第です。再読み込みし、SLO が許せば未確認の作業を落とし、読み取り専用スモークでクリティカルパスを確認します。
fail-closed と shadow モードは共存できる?
可能です。shadow は HTTP ステータスを変えずに「拒否していたはずの件数」を増やすだけなので、メトリクスが平坦になったら hard deny に昇格します。
他言語版:English: OpenClaw plugins fail-closed & manifest / 简体中文:OpenClaw 插件 fail-closed 与 manifest
まとめ:プラグイン統制と Mac mini の相性
プラグイン統制は、暗黙知から 機械的に検証できるポリシーへ信頼を移す作業です。manifest が能力を縛り、fail-closed が失敗時の姿勢を決め、ACP dispatch が入口を狭め、doctor と grep が監査人が期待する証跡チェーンを供します。
その積み上げは macOS では launchd、Unified Logging、Gatekeeper、SIP と噛み合わせやすいです。Apple Silicon の Mac mini M4 は待機時でもおおよそ 4 W 前後に抑えられるため、常時稼働ゲートウェイとヘルス用プローブ載せに向きます。同価格帯の汎用ミニ PC と比べると、OpenClaw・メトリクスエクスポーター・軽量 CI を同居させた長セッションで挙動が荒れにくいことが多いです。
自前ラックではなく 専用ホスト型のリモート Mac でこの Runbook を再現したい場合も、2026 年時点では Mac mini M4 が費用対効果の高い出発点の一つです。専用リモート物理 Mac の案内から容量とリージョンを確認し、manifest 強制とロールバックを手順化してください。
OpenClaw のプラグイン統制を載せる専用リモート Mac が必要?
7×24 ゲートウェイ、manifest 強化、監査可能なロールバックに向けた Apple Silicon ノードを ZoneMac で用意できます。