軽量コンテナによる仮想環境の構築
初級者がプログラム作成に挑戦する記事の第二段の第三回です。
今回は、前回作成したHTTPプロキシを禁獄するための監獄を作成しました。
対象OS
これまでのプログラムは、汎用性を持たせるために、POSIXという規格の範囲内で作成していました。しかし、今回の監獄は、POSIXの機能だけでは実現できません。実現のためには、LinuxというOSに独自の機能が必要になります。したがって、今回のプログラムはLinuxに依存しています。
Linuxは、ブサイクなペンギンがマスコットのOSであり、C言語で書かれています。一般的には、「アセンブラを使ってでも無理やり動かす実装がなされており、BSD系に比べて行儀が悪いパチモノのUnix」として知られています。
監獄
なぜ、WebプロキシやTorなどを動かすのに監獄が必要なのか?それは心配だからです。これらのプログラムは、外部と通信しています。そのため、乗っ取られるかもしれません。
乗っ取られたときの対策として、被害を最小限に止めるために、プロキシを閉じ込めてしまうことが考えられます。そのための仕組みが監獄です。
今回のプログラムでは、監獄を構築するために、仮想環境と権限制御(capability)という二つの技術を組み合わせました。
仮想環境
本記事でいう仮想環境は、所謂コンテナ型の仮想環境です。コンテナ型の仮想環境は、プロセス(広義のプロセス)の生成時に、共有情報の一部を非共有とすることで、プロセスの環境を分離します。その非共有となる情報を(Linuxでは)名前空間と呼びます。
名前空間
名前空間には、複数の種類があります。例えば、マウントポイントの情報に関するマウント名前空間や、ネットワークスタックに関するネットワーク名前空間があります。
名前空間は、その種類によって、新規に作成されるか(ネットワーク等)、または元の複製として作成されます(マウント等)。作成された名前空間は、プロセス(およびその子孫)に固有の情報として独立して管理されます。
以上の説明から分かるように、名前空間は、プロセスの存在が前提となっています。そのため、プロセスが終了すると、基本的には名前空間は消滅します。例外は、名前付き(ネットワーク)名前空間の場合です。名前付き名前空間は、それに対する参照が形成されている名前空間であり、その参照がなくなるまで存続します。
今回のプログラムでは、マウント、IPC、PIDおよびネットワークの名前空間を用いて監獄を構成しました。
ここから先は
¥ 300
古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。