第5章 プログラム配置対策
chroot, jail の利用
制限された環境への封じ込め
攻撃を受けて外部から操られるプログラム、あるいは初めから悪意をもってコンピュータに送り込まれたプログラムが、ファイルやネットワーク接続等、そのコンピュータ内のリソースへ無制限にアクセスが許されていると、侵害の被害が増大する。
プログラムの動作にシステム管理者アカウント(root)を用いない、ファイルに必要最小限のアクセス許可設定しか行わない等の対策も考えられるが、Unix系およびGNU/Linux系のプラットフォームでは、これらに加えてもうひとつの手段を利用できる。
それはプロセスの「制限された環境への封じ込め」である。システムコールのレベルで、プロセスがアクセスできるシステムリソース、主にファイル、にあらかじめ制限をかける。

封じ込めが効果を発揮する状況
この「封じ込め」が効果を発揮すると考えられる状況には、次のふたつが考えられる。
- ネットワークデーモン侵害時の被害不拡大
サーバとしてインターネットにサービスを提供するためのプログラムが、外部から侵害されたときの被害を最小限にくいとめたい、という状況。 - 外来プログラムの動作制限
外部から入手したソフトウェアを自分のコンピュータで動作させる際、そのプログラムが十分には信用しかねるものであるとき、そのプログラムの悪意の動作の被害を最小限にくいとめたい、という状況。
利用できるツール
「封じ込め」に利用できるツールには次のものがある。
- UnixおよびGNU/Linux の chroot
- FreeBSD の jail
- そのほかの封じ込めツール
- OpenBSDおよびNetBSD の sysjail
- JMC Research の Jail Project
chroot
chrootは、Unix系およびGNU/Linux系のシステムで利用できるシステムコール、および同名のコマンドである。これらを使うとプロセスから見えるファイルシステムのルートディレクトリの位置を特定のサブディレクトリに変更できる。
int error;
error = chroot ("新しいルートディレクトリ");
---- 現在のプロセスのルートディレクトリを変更する
# chroot [ option ] new-directory command args ...
---- ルートディレクトリを限定してコマンドを実行する
# chroot [ option ] new-directory
---- ルートディレクトリを限定してシェルを動かす
(コマンドを明示しない形式)
プログラムは、chrootで指定されたディレクトリよりも上のディレクトリ階層へのアクセスができなくなる。
コマンドの方の chroot は、システムコールの chroot (2) を用いて実装されている。プラットフォームにもよるが、システムコール、コマンドとも、使用に際して root 権限が必要である場合が多い。
chroot 呼び出しが組み込まれている例として、named デーモンがある。ドメインネームサーバ named では -t オプションを用いてルートディレクトリの制限ができる。このオプションを指定した場合、内部で chroot システムコールが行われて、デーモンは限られたファイルリソースのみを用いて動作するようになる。
named -t new-directory other-args ...
FreeBSD の jail
利用できるプラットフォームが FreeBSD のみに限られるが、FreeBSD では chroot をさらに拡張した jail という名のシステムコールおよび同名のコマンドを利用できる。
jail が chroot と違うところは、ファイルへのアクセス制限に加えて、プロセスが利用できるネットワークアドレスと他プロセスへのアクセスについても制限を加えられるようにしたところである。
jailの「中」のプロセスは、与えられたホスト名およびIPアドレスでのみネットワーク通信を行うことができ、同じjail環境内のプロセスにのみアクセスできる。
#include <sys/types.h>
#include <sys/jail.h>
struct jail myjail; // 封じ込め環境 構造体
struct in_addr myaddr; // IPアドレス 構造体
int jid; // Jail ID
myjail.version = 0; // バージョンフィールドはいまのところ0
myjail.path = "/my/new/root/";// 新しいルートディレクトリ
myjail.hostname = "myhost"; // 使用可能なホスト名
inet_aton("192.168.11.222", &myaddr);
myjail.ip_number = ntohl(&myaddr); // 使用可能なIPアドレス
jid = jail(&myjail); // このプロセスを封じ込め環境に入れる
jail [ option ] new-directory host-name IP-address command args ...
「オプション」には次のものがある。
- -i
新たに作られたjailの識別子(JID)を表示する - -l
次のものを除くすべての環境変数を消去する- HOME 使用されるアカウントのデフォルトの値に設定される
- SHELL 使用されるアカウントのデフォルトの値に設定される
- USER 使用されるアカウントのログイン名に設定される
- TERM 現在の環境からインポートされる
- -u username
コマンド実行に使用するアカウントをホスト環境のアカウントで指定する - -U username
コマンド実行に使用するアカウントを「封じ込め環境」のアカウントで指定する
chrootと同様、jailコマンドもjailシステムコールを用いて実装されている。
そのほかの封じ込めツール
上記以外にも次のような封じ込めツールが提案されている。
(1) OpenBSD/NetBSD用のsysjail
OpenBSDおよびNetBSD用にも、FreeBSDのjailと同様な機能をもつsysjailというツールが提案されている。sysjailは、プログラムの動作の封じ込めに加えて、監査機能とリソース消費制限機能をもつといわれている。
(2) JMC research の Jail Chroot Project
JMC research の Jail Chroot Projectは、GNU/Linux, Solaris, IRIX 等に封じ込め環境を提供してくれるツールである。
このツールを用いると、/etc/passwd にログインシェルを「jail」と記述することで、そのアカウントのプログラム動作が封じ込め環境で行われるようになる。
JMC research の封じ込め環境は概ね次の手順で構築する。
- 封じ込め環境を新規作成し初期化する(mkjailenv)
- 封じ込め環境の中に必要なプログラムファイルをコピーする(addjailsw)
- ホスト環境のアカウントのログインシェルを /usr/local/bin/jail に設定
- ホスト環境のアカウントのホームディレクトリを封じ込め環境のホームディレクトリに設定する
- 封じ込め環境の中にアカウントを作る(addjailuser)
まとめ
chroot を利用すると、プロセスがアクセスするファイルの範囲を特定のディレクトリ下に制限することができる。また FreeBSD の jail が利用できるなら、ネットワークアクセスやプロセスアクセスにも一定の制限をかけることができる。
これらは、デーモンが外部から侵害されたときの被害の拡大させたくないとき、信頼の置けないプログラムからコンピュータ資源を守りたいときに有用である。