Olivares で Claude Code を実行する(co-deployment)
これは Anthropic ファーストのストーリーの Operate(運用) の半分です。Claude Code を単に
観測(observe) し ガバナンス(govern) するだけでなく、それを 指揮(conduct) します。
コントロールプレーンは実際の claude プロセスを起動し、その I/O をガバナンス対象のストリームに
ブリッジし、すべてのライフサイクル遷移を監査台帳(audit ledger)にアンカーし、そして破棄します。
共有ワークスペース上で、API/CLI(そして後にはポータル)から、SSH なしで 行います。
このページは両方の半分を 1 台の Linux ホストに、4 つのトポロジーで、デフォルトでセキュアに
co-deploy します。
協調的な観測(cooperative observe) の経路(OTLP テレメトリ → アクセスマップ)については Claude Code を接続する を、ガバナンス の経路(PEP としての PreToolUse フック)については govern-claude-code の例 を参照してください。このページは co-deployment です。2 つのランタイムを一緒に動かすことを扱います。 ランタイムがある状態で Claude、Codex、Grok をプロバイダープロファイルの下で起動するには プロバイダーセッションを運用する を参照してください。
始める前の 2 つの原則
Section titled “始める前の 2 つの原則”- オプトイン。 Olivares イメージは
claudeを含みません。Docker では、要求したときに Olivares がエージェントツールをデータボリュームにインストールし、製品を通じてサインインします。 ネイティブでは下記のインストールアドオンがそれを行います。ガバナンス対象の Claude Code を実行 しない場合、何もインストールされません。 - 公式ソースから、再配布は決してしない。 Anthropic の利用規約は
claudeバイナリの再配布を 許可しないため、インストール時に Anthropic の公式・GPG 署名済みソース から インストールします(ネイティブでは署名済みの apt/dnf/apk リポジトリ、イメージでは同じ鍵で検証した Anthropic の署名済みリリース)。バージョンは固定(pin)し、 自動アップデーターは無効化します。サードパーティのバイナリは一切同梱しません。独自のclaudeを 持ち込み(BYO)、エンジンにそれを指すこともできます。
4 つのトポロジー一覧
Section titled “4 つのトポロジー一覧”| # | Olivares | Claude Code | エンジンがどう指揮するか | ステータス |
|---|---|---|---|---|
| 1 | Docker | Docker | 同一コンテナ(標準イメージ)、procRunner の子プロセス | 推奨(2 と同じガバナンス経路) |
| 2 | ネイティブ | ネイティブ | 同一ホスト(systemd)、procRunner の子プロセス | 推奨、エンドツーエンドのスモークテスト済み |
| 3 | Docker | ネイティブ(ホスト) | クロス名前空間 — そのままではガバナンス不可 | 代わりに co-locate(下記参照) |
| 4 | ネイティブ | Docker(セッションごと) | Docker API 経由のセッションごとのコンテナ | フォローアップ(文書化済み) |
2 つの co-located(同居) トポロジー(1、2)がセキュアなデフォルトです。トポロジー 2(ネイティブ)は
scripts/smoke-agentops.sh
によってエンドツーエンドでテストされています。トポロジー 1 は 同じ ガバナンス対象 procRunner 経路を
再利用し、CI がイメージのエージェントランタイム検査(scripts/qualify-container-agent-runtime.sh)を実行します。トポロジー 3 と 4 は、
ガバナンスする側とされる側を 別々の コンテナに置こうとします。その境界を越えて stdio をブリッジするには
Docker API へのアクセスが必要です(エンジンが意図的にデフォルトでは 取得しない 特権です)。
それらの正直な経路は 混在トポロジー で詳述します。
トポロジー 1 — 両方とも Docker(推奨)
Section titled “トポロジー 1 — 両方とも Docker(推奨)”標準のエンジンコンテナが claude も実行します。Olivares がエージェントツールをデータボリュームに
インストールし、製品を通じてサインインします。非 root、読み取り専用のルート
ファイルシステム — ベースの compose と同じ姿勢で、2 つ目のイメージもオーバーライドファイルも
ありません。
エンジンを digest で固定し、先に検証します:
# verify the engine image you run (it is cosign-signed)cosign verify docker.io/olivaresai/olivares:0.4 \ --certificate-identity-regexp '^https://github\.com/olivaresai/olivares/\.github/workflows/release\.yml@refs/tags/[0-9]+\.[0-9]+$' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com
export OLIVARES_IMAGE=docker.io/olivaresai/olivares@sha256:<digest>export OLIVARES_BIND=127.0.0.1docker compose -f deploy/compose/docker-compose.yml up -dClaude Code をインストールしてサインインする
Section titled “Claude Code をインストールしてサインインする”コンソールの AI ツール から、または CLI で:
olivares tool install claudeolivares tool login claudeツールはデータボリュームに置かれ、サインインはあなたの組織に属します。セッションがサーバー アカウントのホームに保存されたサインインを使うことはありません。
トポロジー 2 — 両方ともネイティブ(Docker なし)
Section titled “トポロジー 2 — 両方ともネイティブ(Docker なし)”エンジンと claude がホスト上にあり、systemd がエンジンを実行し、それが claude を指揮します。
ワークスペースは /var/lib/olivares/workspaces に置かれます。
ダウンロードし、検証してから実行する
Section titled “ダウンロードし、検証してから実行する”インストーラーをシェルにパイプしないでください。リリースの署名付きチェックサム一覧を検証し、
そこに記載されたコミットをそのままチェックアウトして、そのチェックアウトからインストーラーを
実行します。install.sh とパッケージングファイルはブランチではなく、チェックアウトから読み込まれます。
このブロックは set -eu 付きのサブシェルで実行されるため、最初に失敗した手順で停止し、検証に失敗した後にインストーラーが実行されることはありません。
(set -eucd "$(mktemp -d)"ver=0.4base=https://github.com/olivaresai/olivares/releases/download/$vercurl -fsSLO $base/checksums.txtcurl -fsSLO $base/checksums.txt.sigcurl -fsSLO $base/checksums.txt.pemcurl -fsSLO $base/release-commit.txtcosign verify-blob \ --certificate checksums.txt.pem --signature checksums.txt.sig \ --certificate-identity "https://github.com/olivaresai/olivares/.github/workflows/release.yml@refs/tags/$ver" \ --certificate-oidc-issuer https://token.actions.githubusercontent.com \ checksums.txtgrep ' release-commit.txt$' checksums.txt | sha256sum --checkgit clone https://github.com/olivaresai/olivares.gitcd olivares && git checkout --detach "$(cat ../release-commit.txt)"OLIVARES_TOPOLOGY=native OLIVARES_VERSION=$ver sh scripts/install-agentops.sh)これはネイティブトポロジーを自動検出し、検証済み のエンジンバイナリ(cosign ゲート付きの
install.sh)をインストールし、署名済みの apt/dnf/apk リポジトリから claude をインストールし
(鍵フィンガープリント検証付き — またはスキップするには OLIVARES_CLAUDE_INSTALL=byo)、ログイン不可の
olivares サービスユーザーとワークスペースディレクトリを作成し、ハードニング済みの systemd オーバーライドと
環境変数の例を配置します。ガバナンスプレーンを自動起動は しません — 1 つを実行するのはあなたの
明示的な判断です。
インストーラーが配線するもの(とその理由)
Section titled “インストーラーが配線するもの(とその理由)”packaging/systemd/olivares.service.d/agentops.conf— 指揮されるclaudeに~/.claude用の 書き込み可能なHOMEを与えるドロップイン(/var/lib/olivares配下に保持されます)。 ワークスペースディレクトリの存在を保証し、ベースユニットのファイルシステムポリシーを明示します。ProtectSystem=full、ProtectHome=false、PrivateTmp=false、MemoryDenyWriteExecute=falseです(claudeランタイムは JIT コンパイルを行い、W→X メモリを必要とします)。ホームと/tmpは エンジンから見えたままなので、選んだフォルダーに到達できます。各セッションのclaudeと その stdio MCP サーバーは、代わりに製品のフォルダー単位の Landlock 閉じ込めの下で動きます。 ベースユニットの他のハードニングディレクティブはすべて有効なままです。/etc/olivares/agentops.env— セッションランタイムの設定(トークンファイル、TTL、任意の ゲートウェイベース URL、任意の BYOclaudeパス)。
その後、意図的に次を行います。
sudo nano /etc/olivares/agentops.env # wire the short-lived inference token (refresher)sudo systemctl enable --now olivares # listens on every interface by default最初のガバナンス対象セッションを起動する
Section titled “最初のガバナンス対象セッションを起動する”どちらの co-located トポロジーでも同じ手順です。CLI を認証し、共有ワークスペースを登録し、起動します。
export OLIVARES_SERVER_URL=https://127.0.0.1:8443export OLIVARES_TOKEN=<your-api-token>export OLIVARES_TENANT=<your-tenant-id>
# 1) register the shared workspace (the session's working dir; jailed file API on top)olivares agent workspace add /var/lib/olivares/workspaces/project-x --name project-x --mode rw
# 2) launch a governed session over the stream-json transportolivares agent session create --transport stream-json \ --permission-mode acceptEdits --model opus \ --workspace <workspace-ref> --isolation native
# 3) attach to its live, bridged I/O (lossless replay from a cursor); send input; stopolivares agent session attach <run-ref>olivares agent session input <run-ref> --line '{"type":"user","message":{"role":"user","content":"…"}}'olivares agent session stop <run-ref>すべての遷移(created → launched → … → stopped)は 署名済み監査台帳にアンカー されます
(olivares agent session events <run-ref>)。ワークスペースのファイル API
(olivares agent workspace files|get|put|…)は jail され、監査されます。これらすべての再現性契約は
scripts/smoke-agentops.sh
であり、ハーメチックな偽の claude に対してネイティブの co-deployment を起動し、セッションが
エンドツーエンドでガバナンス可能であることをアサートします。
混在トポロジー(3 と 4)
Section titled “混在トポロジー(3 と 4)”これらはガバナンスする側とされる側をコンテナ境界で分割します。それが何を犠牲にするかを冷静に 認識してください。
トポロジー 3 — Olivares が Docker、Claude がホスト上
Section titled “トポロジー 3 — Olivares が Docker、Claude がホスト上”クリーンなガバナンス経路は存在しません。コンテナ化されたエンジンは、ホストの名前空間にある
プロセスの stdio を所有できず、ガバナンス対象のトランスポートは stdio です。ホスト上の claude に
到達するには、ホストの PID 名前空間とマウントをエンジンコンテナに共有する必要があります — エンジンを
封じ込める意義を打ち消す、大規模で意図的な脱分離です。代わりに co-locate してください。両方を標準
イメージで実行する(それが まさに トポロジー 1 です)か、両方をネイティブで実行する(トポロジー 2)かです。
これは取り繕うのではなく明示する、実在する制限です。
トポロジー 4 — Olivares ネイティブ、Claude はセッションごとのコンテナ
Section titled “トポロジー 4 — Olivares ネイティブ、Claude はセッションごとのコンテナ”これは セッションごとの新鮮なコンテナ分離 の自然な居場所です。各セッションは真新しい
ハードニング済みの claude コンテナ(ワークスペースをバインドマウント、読み取り専用ルート、非 root、
cap-drop)を得て、エンジンが Docker API を通じて作成し破棄し、stdio は Docker の attach/hijack 経由で
ブリッジされます。データモデルのシームはすでにそれを モデル化 しています(--isolation container は
有効な値であり、それが消費するエグゼキューターのマウントプリミティブはすでに出荷されています)— ただし
その背後のランナーはまだ配線されていないので、ネイティブランナーは今日その値を拒否します(上記の注を参照)。
これは文書化されたフォローアップであり、本リリースには出荷されていません。 兄弟コンテナを駆動する
ことは、エンジンに Docker API アクセスを与えることを意味します(理想的には最小権限のソケットプロキシ
経由)— ソケットフリーの標準イメージを優先して本リリースが意図的に避けている信頼サーフェスです。
このトポロジーを選ぶことは、その Docker API 付与 を代償として より強いガバナンス側/される側の分離を
選ぶことです。これは既存の isolation=container シームの背後に到着します。それまでは、セキュアな
デフォルトは co-location です。
セキュリティポスチャ(全トポロジー)
Section titled “セキュリティポスチャ(全トポロジー)”- 公開ポート。 Docker Compose はデフォルトで HTTPS と gRPC をホストのすべての
インターフェース (
0.0.0.0) に公開します。上のコマンドのようにOLIVARES_BIND=127.0.0.1を設定すると、このホストからのみアクセスできます。エンジンはコンテナ内の0.0.0.0で リッスンし、ホストのポートマッピングが公開範囲を制御します。ネイティブ/systemd の リスナーもデフォルトですべてのインターフェースを使用します。アクセスを制限するには リッスンアドレスを設定してください。 - 非 root、最小権限。 uid/gid 65532、読み取り専用ルートファイルシステム、
cap_drop: ALL、no-new-privileges(Docker)/ カーネルと名前空間のProtect*/Restrict*ディレクティブ。ホームと/tmpは見えたままで W^X は許可され、各セッションは Landlock でそのフォルダーに閉じ込められます(systemd)。 - 最小データ、アローリストされた環境。 子の
claudeは明示的なアローリスト(PATH、HOME、ロケール…) に加えてメモリ内の推論トークンのみを継承します —OLIVARES_*署名鍵は なし、発行された クレデンシャルを覆い隠しうる周辺のANTHROPIC_*/CLAUDE_CODE_*も なし です。 - 検証済みサプライチェーン。 エンジンは cosign 署名済みです(検証する / ダイジェストで固定する)。
claudeは鍵フィンガープリントを固定した Anthropic の署名済みリポジトリからインストールされます。 インストーラーは 未検証のエンジンの実行を拒否 し、検証の bypass はありません。 - アンカーされた監査。 すべてのライフサイクル遷移とすべてのワークスペース変更は、ハッシュ連鎖された
署名済み台帳に
PayloadHashによって封印されます — ファイルのバイト列やフレームの内容が永続化される ことは決してありません。
- Claude Code を接続する — 協調的な観測の経路。
- セキュリティとハードニング — エンジンのベースラインポスチャ。
- リリースを検証する — cosign / SBOM / SLSA の検証。
- INSTALL.md — この co-deployment を含むインストールマトリクス。