2026-05-11 OpenClaw ワークスペース根、リポジトリ許可リスト、モノレポ ガードレール——ヘッドレス リース Apple Silicon クラウド Mac(香港 / 東京 / ソウル / シンガポール / 米国)
ヘッドレス ゲートウェイは、ツールが編集したいはずのリポジトリの外へ出るまで「見えない」ものに感じられる。香港・東京・ソウル・シンガポール・米国でリースした Mac mini M4 では、同一 UID に OpenClaw、xcodebuild レーン、長寿命の署名素材が同居しがち——「ワークスペース」は雰囲気ではなくセキュリティ特性です。この 2026-05-11 のプレイブックは、ファイル転送のパス方針、launchd 環境と秘密情報の衛生、セッション checkpoint の規律、並列レーン分離をつなぎ、明示的な許可ルート・解決済みシンボリックリンク、~/Library や隣接 CI ツリーへ手を伸ばしたときにフェイルクローズするオペレータ演習へ落とし込みます。
共有リース ホストでワークスペース ガードレールが爆発半径を決める理由
根の取り違えは無害に見える読み取りをキーチェーン近傍の驚きに変えます:モデルが相対パスを追い、launchd 下で shell が ~ を異なるように展開する、あるいは古いシンボリックリンクが「許可された」部分木から他テナントのチェックアウトへ飛ぶ、といった具合です。本番ゲートウェイはファイルシステム根のポジティブリストを公開します——「モデルの常識」だけに頼らないでください。インフラ設定のマージごとに OpenClaw 方針と隣接 CI ラッパーをレビューするよう、チケットと紐付けましょう。
構造:OPENCLAW_STATE_DIR、CI チェックアウト、DerivedData の隣接
アシスタントの永続状態はデータ面のストレージとして扱い、短命の /tmp クローンや、ジョブ途中で清掃される Xcode DerivedData と同居させない。三つの輪——state(checkpoint と方針)、workspace(許可する git 根)、scratch(捨てられるエクスポート)——を文書化し、cron が境界を越えないようにする。CI とアシスタントが UID を共有する場合は並列レーン記事の分離指針に従い、ロック孤児を避ける。
- State 輪 — 許可リストの版管理スニペット+必要なら封印 JSON。
- Workspace 輪 — リポジトリ/サービスラインごとの絶対ルートを 1 つ以上。
- Scratch 輪 — ジョブごとの TMP プレフィックス配下の TTL ディレクトリ。
ファイル転送+ shell ツール方針と統合した許可リスト
2026-05-07 の転送プラグイン既定は拒否寄り。ワークスペース根もそれに揃え、fetch/dir-list がシンボリックリンクの跳躍でしか存在しない親へ登れないようにする。環境(staging と prod)ごとに根を Git に保持し、PR で昇格——SSH の場当たり編集は避ける。モノレポ内のマイクロサービスはパッケージ単位で名前空間根を分け、「ただ見ている」ふりの横読みを防ぐ。
readlink -f。APFS firmlink や企業 VPN マウントはディスク上の設定文字を変えずにパスを付け替えることがあります。
モノレポのエッジ:SwiftPM の入れ子、Xcode workspace、git サブモジュール
大規模モノレポは複数の Package.swift とハイブリッド Xcode プロジェクトでアシスタントを誘惑する。所有境界でチームが割れるなら根を分ける——例:/build/mobile/ios と /platform/android——第二の許可項目がない限り横移動を禁止。サブモジュールはセキュリティ審査済みのときだけ親の権限を継承し、それ以外は狭いスコープの明示ルートとしてネストした .git を扱う。
# 新しい根を承認する前にシンボリックリンクを解決
/usr/bin/python3 - <<'PY'
import os
roots = ["/var/ci/job123/acme"]
for r in roots:
print(os.path.realpath(r))
PY
対話アシスタントの横で CI がクローンする場所
短命 CI は /var/tmp 下のハッシュ付きフォルダや専用ボリュームへクローンし、SSH 起動のアシスタントは ~/workspace を既定にすることが多い。規約を揃え、地域ごとに ASSISTANT_WORKSPACE_ROOT をエクスポートし、オーケストレータに許可プレフィックス配下だけへマウントさせる。GitHub Actions セルフホスト ラベルが OpenClaw と同一 Mac に流す場合はパスを分離し、PR クリーンアップがアシスタント関連 scratch と同時削除しないようにする。
launchd:非対話ゲートウェイへ根をエクスポート
対話 shell は profile を読むがデーモンは読まない。plist の EnvironmentVariables かチェックサム付きの参照 env ファイルへ許可リストをミラーする。更新後は制御された launchctl kickstart で再読み込みし、ヘルス プローブの指針に沿って stdout を取得——HTTP 準備と禁止パスへのファイルシステム プローブの両方を検証する。
意思決定マトリクス:パス意図と強制層
| シナリオ | リスク | 推奨緩和 |
|---|---|---|
アシスタントがリポを読み ../ を追う |
隣接サービス秘密への脱出 | 正のプレフィックス検査+正規化後に .. セグメントを拒否 |
| デスクトップ/書類へのシンボリックリンク | ヘッドレスと GUI で TCC 期待が異なる | リンク先を解決し、macOS プライバシー文書と突合 |
| UID 共有の CI とアシスタント | 重なるツリー上の削除レース | オーケストレーション ID ごとに TMPDIR 名前空間を分離 |
| 緊急ホットフィックス ブランチ | ロールバック計画なしの一時拡張 | 期限付き許可チケット+自動失効 |
ワークスペース統制の 8 ステップ展開
- 監査ログから過去 30 日にアシスタントが触れた全パスを棚卸し。
- 最小許可リストをコード化。拡張は VPEng+セキュリティ審査。
- 方針を Git にマージし、自動化バンドルにチェックサムを添付。
- plist/env を地域ごとに展開しヘルス curl を実施。
- シンボリックリンク脱出をカバーする拒否テストをスクリプト化。
- オンコールが許可リスト PR を迅速に戻せるよう訓練。
- 清掃スクリプトを scratch の TTL 契約に合わせる。
- 四半期ごとに拒否/許可操作の振り返り指標を公開。
ワークスペース統制の SLO シグナル
| シグナル | しきい値 | アクション |
|---|---|---|
| 未承認パス試行 | ゲートウェイあたり週 > 3 | 設定変更を凍結しインシデント痕跡を再生 |
| Git との許可リストドリフト | 未デプロイの手編集が 1 件でも | ホストをロールバックし PR のみ運用を強制 |
| シンボリックリンク監査失敗 | 重大所見 > 0 | リリースをブロックし解決済み根マップを再構築 |
FAQ
| 質問 | 実務的な答え(2026-05-11) |
|---|---|
根に /Users/ci を丸ごと含めてよいか |
いいえ——パイプラインまたはテナント単位で分割。丸ごとでは許可リストが無意味になる。 |
| キャッシュのためワークスペース外へ書けるか | 宣言した scratch プレフィックス内のみ。クォータと自動退避を付ける。 |
Mac mini M4 リースがファイルシステム統制を簡素化する理由
高速 NVMe と予測しやすいユニファイド メモリにより、シンボリックリンク監査・三リポ同時クローン・ゲートウェイ同時ヘルスをスワップを押し上げずに回せる——インシデント中に許可リストを反復するときに効く。地域キャパは 料金 で計画し、根を広げる前に迷うエンジニアを SSH/VNC ガイド へ誘導する。