公開日:2007年9月26日
独立行政法人情報処理推進機構
セキュリティセンター
本ページの情報は2007年9月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。
攻撃を受けて外部から操られるプログラム、あるいは初めから悪意をもってコンピュータに送り込まれたプログラムが、ファイルやネットワーク接続等、そのコンピュータ内のリソースへ無制限にアクセスが許されていると、侵害の被害が増大する。
プログラムの動作にシステム管理者アカウント(root)を用いない、ファイルに必要最小限のアクセス許可設定しか行わない等の対策も考えられるが、Unix系およびGNU/Linux系のプラットフォームでは、これらに加えてもうひとつの手段を利用できる。
それはプロセスの「制限された環境への封じ込め」である。システムコールのレベルで、プロセスがアクセスできるシステムリソース、主にファイル、にあらかじめ制限をかける。
この「封じ込め」が効果を発揮すると考えられる状況には、次のふたつが考えられる。。
「封じ込め」に利用できるツールには次のものがある。
chrootは、Unix系およびGNU/Linux系のシステムで利用できるシステムコール、および同名のコマンドである。これらを使うとプロセスから見えるファイルシステムのルートディレクトリの位置を特定のサブディレクトリに変更できる。
[例 chrootシステムコールの呼び出し(C言語ソースコード]
int error;
error = chroot ("新しいルートディレクトリ");
---- 現在のプロセスのルートディレクトリを変更する
[例 chrootコマンドの使用(シェルコマンド)]
# chroot [ option ] new-directory command args ...
---- ルートディレクトリを限定してコマンドを実行する
# chroot [ option ] new-directory
---- ルートディレクトリを限定してシェルを動かす
(コマンドを明示しない形式)
プログラムは、chrootで指定されたディレクトリよりも上のディレクトリ階層へのアクセスができなくなる。
コマンドの方の chroot は、システムコールの chroot (2) を用いて実装されている。プラットフォームにもよるが、システムコール、コマンドとも、使用に際して root 権限が必要である場合が多い。
chroot 呼び出しが組み込まれている例として、named デーモンがある。ドメインネームサーバ named では -t オプションを用いてルートディレクトリの制限ができる。このオプションを指定した場合、内部で chroot システムコールが行われて、デーモンは限られたファイルリソースのみを用いて動作するようになる。
[例 namedの-tオプション]
named -t new-directory other-args ...
利用できるプラットフォームが FreeBSD のみに限られるが、FreeBSD では chroot をさらに拡張した jail という名のシステムコールおよび同名のコマンドを利用できる。
jail が chroot と違うところは、ファイルへのアクセス制限に加えて、プロセスが利用できるネットワークアドレスと他プロセスへのアクセスについても制限を加えられるようにしたところである。
jailの「中」のプロセスは、与えられたホスト名およびIPアドレスでのみネットワーク通信を行うことができ、同じjail環境内のプロセスにのみアクセスできる。
[例 jailシステムコールの呼び出し(C言語ソースコード)]
#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コマンドの使用]
jail [ option ] new-directory host-name IP-address command args ...
「オプション」には次のものがある。
-i
新たに作られたjailの識別子(JID)を表示する
-l
次のものを除くすべての環境変数を消去する
-u username
コマンド実行に使用するアカウントをホスト環境のアカウントで指定する
-U username
コマンド実行に使用するアカウントを「封じ込め環境」のアカウントで指定する
chrootと同様、jailコマンドもjailシステムコールを用いて実装されている。
上記以外にも次のような封じ込めツールが提案されている。
OpenBSDおよびNetBSD用にも、FreeBSDのjailと同様な機能をもつsysjailというツールが提案されている。sysjailは、プログラムの動作の封じ込めに加えて、監査機能とリソース消費制限機能をもつといわれている。
JMC research の Jail Chroot Projectは、GNU/Linux, Solaris, IRIX 等に封じ込め環境を提供してくれるツールである。
このツールを用いると、/etc/passwd にログインシェルを「jail」と記述することで、そのアカウントのプログラム動作が封じ込め環境で行われるようになる。
JMC research の封じ込め環境は概ね次の手順で構築する。
chroot を利用すると、プロセスがアクセスするファイルの範囲を特定のディレクトリ下に制限することができる。また FreeBSD の jail が利用できるなら、ネットワークアクセスやプロセスアクセスにも一定の制限をかけることができる。
これらは、デーモンが外部から侵害されたときの被害の拡大させたくないとき、信頼の置けないプログラムからコンピュータ資源を守りたいときに有用である。