macOS 上の OpenClaw ゲートウェイが Slack や GitHub からのコールバックを受けるとき、2026 年に最初に燃えるのはモデル遅延ではなく署名検証のズレです。ミドルウェアが先に JSON.parse してから再シリアライズすると空白やキー順が変わり、X-Hub-Signature-256 が一致しません。逆に署名は通るのにリプレイ制御が無いと、ベンダー再送で同じ HTML デプロイが二重に走ります。本稿では raw body に対する HMAC、秒単位で監査可能な リプレイ許容、NTP ずれと Slack タイムスタンプの結合、そして 冪等キーと重複排除 までを一気通貫で整理します。合わせて読むと良いのは Webhook→Ollama 配線、doctor 診断、NTP と JWT のずれ対策 です。
具体的な数字として、チャット系はまず 300 秒、GitHub のように遅延再送があり得る相手は 600 秒 を第一候補にし、観測した p95 投递遅延で調整してください。検証用に本番同等の launchd 挙動が欲しい場合、MacHTML の公開価格帯で概ね 1 日 16.9 US ドル 前後から借りられる Apple Silicon Mac mini をステージング専用に置くと、ノート PC のスリープ設定と切り離して夜間リハーサルが回せます。
脅威モデル
OpenClaw がリポジトリ書き換えやビルド起動まで担うと、未認証の POST はサプライチェーン攻撃面になります。署名は必須ですが秘密漏えいには無力なため、シークレットローテーション、ツール最小権限、IP 制限を同時に運用してください。外部スキャナ、インシデント調査での正当トラフィック再送、侵害された上流からの再送の三類型を想定し、監査ログに配送 ID を残します。
ブラウザ向け CORS トラフィックと Webhook を同一ポートに混在させない方が安全です。別サブドメインに mTLS を重ねると運用コストは上がりますが、許容される組織も増えています。
raw body と JSON の順序
アルゴリズムはバイト列に対して定義されます。フレームワーク設定で rawBody を公開し、検証後にだけ JSON.parse してください。nginx 側で body を変形するモジュールが無いかも確認します。二重 gzip があると、ハッシュ対象のバイト列が GitHub 側と一致しなくなります。
ログには本文全体ではなく長さとハッシュ指紋だけを残し、顧客 HTML を平文で出さない運用を徹底します。
GitHub / Slack / 汎用 HMAC
GitHub は X-Hub-Signature-256 に sha256= 接頭辞付きの十六進を載せます。X-GitHub-Delivery を冪等キーにすると再送吸収が容易です。Slack は v0:{timestamp}:{body} を HMAC し Base64 で X-Slack-Signature に載せます。タイムスタンプ検証が厳しいためホスト時計と強く結合します。自社連携では弱いダイジェストを拒否するホワイトリストを設定します。
リプレイ許容のマトリクス
| ソース | 初期値 | メモ |
|---|---|---|
| Slack Events | 300 秒 | NTP 監視とセット |
| GitHub | 600 秒 | Delivery ID で重複排除 |
| 社内ジョブ | 120 秒 | 低遅延 LAN |
| SLA 不明の SaaS | 900 秒 | Redis メモリに注意 |
proxy_read_timeout が 120 秒なのにリプレイ許容が 300 秒だけだと、パートナーは再送ループに入りやすくなります。単一の真実のソースとして秒数表を社内公開してください。
時計ずれ
Slack 署名は数分の時計ずれで失敗します。Mac mini で 2 秒を超える偏移が連続したらアラートするなど、厳しめの閾値を推奨します。詳細は NTP 記事 を参照してください。ノート PC のスリープと常時電源のミニでは挙動が異なる点にも留意します。
Redis TTL
SET NX EX で配送フィンガープリントを保存し、TTL はリプレイ許容とベンダー再送ポリシーの大きい方に合わせます。冪等記事 の TTL 議論と整合させてください。百万キー×百バイトは概算 100MB 超の圧力になり得ます。
nginx と TLS 終端
TLS を nginx で終端し 127.0.0.1:8787 へ中継する構成では、Webhook ロケーションに不要な body 変換を掛けないでください。client_max_body_size を余裕持って設定し、合成ヘルスチェックとレート制限を分離します。
curl プローブ
非公開リポジトリにフィクスチャを置き、curl --data-binary @file で再現します。正常・改ざん・期限切れの三波を必ず回し、失敗理由を別メトリクスに分けます。doctor の出力と同じダッシュボードに載せると当番が楽です。
curl -sS -X POST 'https://hooks.staging.example/openclaw/github' \
-H 'Content-Type: application/json' \
-H 'X-GitHub-Delivery: test-delivery-001' \
-H 'X-Hub-Signature-256: sha256=REPLACE' \
--data-binary @fixtures/push-main.json
ロールアウトチェックリスト
- バージョン固定と doctor JSON スナップショット
- 1000 件の合成投递で p95 を測定
- 24 時間の監査のみモード
- 強制モードへ切替とロールバック手順の確認
- 15 分以上の新旧シークレット併存
- 変更票への証跡添付
FAQ
SPA と同じポートで良い?
分離推奨です。レート制御と WAF ルールを独立させられます。
失敗時の HTTP コードは?
401/403 を基本に、ベンダー再送特性を確認してください。
Apple Silicon Mac mini は静音で低消費電力、常時稼働のゲートウェイに向きます。macOS ネイティブ挙動を保ったまま SSH で自動検証、必要なら VNC で画面操作も可能なクラウド環境として MacHTML のレンタルは短期スパイクに適しています。HTML/CSS 監査とチャット承認を束ねるなら、退屈なくらい堅牢な Webhook パイプラインを先に固めるのが近道です。
夜間に大量再送が来ても、冪等ストアと秒単位の許容窓が整っていればオペレータは眠れます。OpenClaw を本番インフラとして扱うチームほど、この地味な層に投資してください。