著者の目的は、Linuxカーネルの最小限のメカニズムのみを使用して、隔離された環境でシェルを実行する小さなプログラムを書くことによってコンテナの隔離を探求することでした。このプログラムはcontained.cと呼ばれ、cloneシステムコールに名前空間フラグを指定して、マウント、PID、IPC、ネットワーク、UTSの名前空間を別々に作成し、オプションでUID/GIDのマッピングのためにユーザー名前空間も作成します。子プロセスを作成した後、コードはほとんどの機能をドロップし、セキュアコンピューティングモード(seccomp)フィルターをインストールして、許可するシステムコールをごく少数に制限し、cgroup(メモリ、CPU、PID、ブロックI/O)および古いsetrlimitインターフェースを介してリソースを制約します。さらに、新しいマウント名前空間を準備し、一時ディレクトリをバインドし、pivot_rootでrootファイルシステムをそのディレクトリに変更した後、要求されたコマンドを実行します。
このメカニズムは、いくつかの補完的なLinux機能に依存しています。名前空間はファイルシステムやプロセス表などのカーネルオブジェクトを隔離し、機能はroot特権を細分化して危険なものをドロップできるようにし、seccompフィルターは子プロセスが呼び出せるシステムコールを制限し、cgroupとsetrlimitはメモリやCPUなどのリソース使用量を制限し、マウント名前空間とpivot_rootの組み合わせによって子プロセスのルートファイルシステムのビューが変わります。著者は、このプログラムが意図的に最小限であることを指摘し、セキュアなサンドボックスを作ることを目的としているのではなく、信頼できないコードに対してカテゴリ的に安全でない権限を示すことを目的としていると述べています。
著者は、この演習がセキュアな境界ではないことを警告しています。ユーザー名前空間はIDのマッピングに役立ちますが、メインストリームのカーネルではデフォルトでオフになっており、歴史的に特権昇格のバグの原因となってきました。最終的なプログラムは約570行となり、元の500行の目標を若干上回っています。これにより、コンテナは複雑な新しい抽象化ではなく、既存のカーネル機能の薄いラッパーであることが示されます。これは、実際のコンテナランタイムがこれらの同じプリミティブの上に追加の安全メカニズムを層状に重ねていることを思い出させるものです。
