ランナーサンドボックスとは? ジョブができることを封じ込める
ランナーサンドボックスとは、CI ジョブがアクセスできるもの - filesystem、ネットワーク、システムコール - を限定された環境に制限し、ジョブが割り当てられた境界を越えられないようにする仕組みです。
isolation がジョブ同士を分離するのに対し、サンドボックスは単一のジョブを内側から制約します。何に触れられるか、どこに接続できるか、何を許可されているか。サンドボックス化は、ジョブが信頼できないコードやサードパーティのコードを実行する場合に最も重要になります。
isolation とサンドボックス
isolation はジョブ同士を離しておくことです。サンドボックスは 1 つのジョブの capability を制限すること - ネットワーク egress、filesystem アクセス、特権操作を限定することです。両者は補完的なセキュリティレイヤーです。
サンドボックスが制限するもの
- ネットワーク: 外向き接続を制限または拒否して exfiltration を制御する。
- Filesystem: 書き込みをスクラッチ領域に限定し、残りを保護する。
- 特権: capability を drop してジョブが昇格できないようにする。
なぜ重要か
CI は依存関係、fork、pull request など、完全には制御していないコードを実行します。サンドボックスは、そのコードが悪意あるものや侵害されたものだった場合に被害を限定し、潜在的な侵害を封じ込められた失敗に変えます。
実践でのサンドボックス化
サンドボックス化は ephemeral なランナーと自然に組み合わさります。使い捨てマシン上の限定されたジョブは、到達範囲が限られており、かつ永続性もありません。両者を合わせることで、信頼できない CI ワークロードがセキュリティ問題になるのを防ぎます。
使いやすさとのトレードオフ
サンドボックスがきつすぎると正当なジョブが壊れます - 拒否されたネットワーク呼び出しやブロックされた syscall は、本来通るべき build を失敗させます。目標は、実際の作業を実行できる範囲での最小権限であり、だからこそサンドボックス化は一律のロックダウンとしてではなく、ワークロードに合わせて調整されます。
重要なポイント
- ランナーサンドボックスは、単一のジョブがアクセスまたは実行できることを制限する。
- ジョブ同士を分離する isolation を補完する。
- ネットワーク、filesystem、特権操作を制限する。
- サンドボックス化と ephemeral 性を組み合わせることで、信頼できない CI コードを封じ込める。