ランナー分離とは何か? CIジョブが互いに干渉しないようにする
ランナー分離は各CIジョブを独自の分離された環境で実行することを保証し、あるジョブが別のジョブを読み取ったり、改ざんしたり、痕跡を残したりできないようにします。
複数のジョブが1つのランナーを共有すると、リスクも共有されます。あるジョブから残ったファイル、居座るsecret、悪意のあるプロセスが次のジョブに影響を与える可能性があります。ランナー分離は各ジョブに独自の境界を与えることで、そのつながりを断ち切ります。これはbuildプラットフォームの最も基本的で、最も見過ごされがちなセキュリティ特性の1つです。
分離が防ぐこと
- あるジョブが別のジョブの残したsecretを読み取ること。
- 侵害されたジョブが後続のbuildを改ざんすること (汚染)。
- あるジョブのstateやcacheが別のジョブの出力に漏れること。
- 悪意のあるプロセスが同じホスト上でジョブをまたいで存続すること。
共有ランナーの問題
同じマシン上でジョブを次々と実行する永続的なself-hostedランナーは、stateと露出を蓄積します。あるジョブが侵害されると、攻撃者は次の価値あるジョブを待ってそのsecretを収集したり結果を書き換えたりできます。共有ランナーは1つの侵害を多数に変えてしまいます。
分離の実現方法
最も強力な分離は各ジョブに新しい専用の環境、つまり何も実行したことのない新しいVMやコンテナを与え、ジョブが終わるとそれを破棄します。より弱い形式はホストを再利用しつつコンテナやユーザーでジョブを分離しますが、完全な分離は何も再利用しません。
分離とエフェメラル性の組み合わせ
分離はジョブが分離されていることを意味し、エフェメラル性は環境が後で破棄されることを意味します。両者を合わせると、毎回クリーンな開始と残留物なしが保証されます。これはまさにセキュリティと再現性の両方が求めるものです。
デフォルトで分離
self-hostedのフリートで厳格な分離を維持するのは本当に手間がかかります。設計上分離されエフェメラルな管理型ランナー (Latchkeyのような) は、各ジョブに新しいプライベートな環境を与え、後で取り壊すので、ジョブ間攻撃には悪用するものが何もありません。
重要なポイント
- ランナー分離は各ジョブに独自の環境を与え、ジョブが互いに影響し合わないようにします。
- 共有された永続的なランナーは、1つの侵害が後続のジョブを収集または汚染することを許します。
- ジョブごとの新しいエフェメラルな環境が最も強力な分離を提供します。