見出し画像

獄に禁する プログラム作成挑戦記その3

 初級者がプログラム作成に挑戦する記事の第二段の第三回です。
 今回は、前回作成したHTTPプロキシを禁獄するための監獄を作成しました。

対象OS

 これまでのプログラムは、汎用性を持たせるために、POSIXという規格の範囲内で作成していました。しかし、今回の監獄は、POSIXの機能だけでは実現できません。実現のためには、LinuxというOSに独自の機能が必要になります。したがって、今回のプログラムはLinuxに依存しています。
 Linuxは、ブサイクなペンギンがマスコットのOSであり、C言語で書かれています。一般的には、「アセンブラを使ってでも無理やり動かす実装がなされており、BSD系に比べて行儀が悪いパチモノのUnix」として知られています。

監獄

 なぜ、WebプロキシやTorなどを動かすのに監獄が必要なのか?それは心配だからです。これらのプログラムは、外部と通信しています。そのため、乗っ取られるかもしれません。
 乗っ取られたときの対策として、被害を最小限に止めるために、プロキシを閉じ込めてしまうことが考えられます。そのための仕組みが監獄です。

 今回のプログラムでは、監獄を構築するために、仮想環境と権限制御(capability)という二つの技術を組み合わせました。

仮想環境

 本記事でいう仮想環境は、所謂コンテナ型の仮想環境です。コンテナ型の仮想環境は、プロセス(広義のプロセス)の生成時に、共有情報の一部を非共有とすることで、プロセスの環境を分離します。その非共有となる情報を(Linuxでは)名前空間と呼びます。

名前空間
 名前空間には、複数の種類があります。例えば、マウントポイントの情報に関するマウント名前空間や、ネットワークスタックに関するネットワーク名前空間があります。
 名前空間は、その種類によって、新規に作成されるか(ネットワーク等)、または元の複製として作成されます(マウント等)。作成された名前空間は、プロセス(およびその子孫)に固有の情報として独立して管理されます。
 以上の説明から分かるように、名前空間は、プロセスの存在が前提となっています。そのため、プロセスが終了すると、基本的には名前空間は消滅します。例外は、名前付き(ネットワーク)名前空間の場合です。名前付き名前空間は、それに対する参照が形成されている名前空間であり、その参照がなくなるまで存続します。

 今回のプログラムでは、マウント、IPC、PIDおよびネットワークの名前空間を用いて監獄を構成しました。

ここから先は

3,689字

¥ 300

期間限定 PayPay支払いすると抽選でお得に!

古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。