サンドボックス化されたbuildとは何か? 施錠された箱の中でbuildを実行する
サンドボックス化されたbuildは、filesystem、ネットワーク、ホストへのアクセスが正当に必要なものに意図的に制限された、閉じ込められた環境の中で実行されます。
buildは多くの信頼できないコードを実行します。依存関係のインストールスクリプト、ダウンロードされたツール、生成されたartifactなどです。サンドボックス化されたbuildは、そのコードが誤動作するかもしれないと想定し、それを囲い込みます。サンドボックスはbuildが読み取り、書き込み、到達できる範囲を制限するので、あるステップが敵対的になっても、自由に動き回るのではなく壁にぶつかります。
サンドボックスが制限するもの
- filesystemへのアクセス、workspaceに限定。
- ネットワークアクセス、制限またはフィルタリング。
- プロセスが利用できるシステムコールと権限。
- ホストや他のjobへのアクセス。
なぜbuildにサンドボックスが必要か
インストールする各依存関係と実行する各ツールは、あなたのbuildの権限で動作します。悪意のあるpost-installスクリプト、typosquatされたパッケージ、汚染されたaction、そのいずれもがsecretを読み取ったり外部へ通信したりしようとする可能性があります。サンドボックスは、その敵対的なコードがどこまで到達できるかを制限します。
サンドボックスとhermetic build
サンドボックスは、宣言されていないネットワークとfilesystemへのアクセスを禁止するhermetic buildと自然に組み合わさります。サンドボックス内のhermetic buildは、build時に悪意のある依存関係を密かに取得できません。攻撃が必要とするアクセスをサンドボックスがブロックするからです。
封じ込めの層
サンドボックスはしばしば層状になっています。コンテナがプロセスを制限し、制限されたユーザーが権限を制限し、egressフィルタリングがネットワークを制限し、分離されたVMがホストへのアクセスを制限します。各層は、敵対的なコードが乗り越えなければならないもう1つの壁です。
管理型ランナーでのサンドボックス
自前のフリートで本物のサンドボックスを実現するには、コンテナ、namespace、ネットワークルールを慎重に設定する必要があります。各jobを分離された、エフェメラルな、閉じ込められた環境で実行する管理型ランナー (Latchkeyのような) は、自分で組み立てるものではなく、組み込みの特性としてサンドボックスを提供します。
重要なポイント
- サンドボックス化されたbuildは、アクセスが制限された閉じ込められた環境で実行されます。
- 悪意のある依存関係やスクリプトが到達できる範囲を制限します。
- サンドボックスはhermetic build、分離、egressフィルタリングと層をなして組み合わされます。