chroot jailを使用したルート・ディレクトリの保護
chrootコマンドは、実行中のプロセスとその子の表示可能なルート・ディレクトリを変更するため、/
以外のルート・ディレクトリでプログラムを実行するために使用できます。プログラムは、構成済のディレクトリ・ツリー外部にあるファイルを表示することも、これにアクセスすることもできません。このような人為的なルート・ディレクトリを"chroot jail"と呼びます。その目的は、悪意のあるプロセスやハッカーのディレクトリへのアクセスを制限することです。chroot jailは、各プロセスおよびプロセスを使用しているすべてのユーザーIDをロック・ダウンするため、それらがアクセスできるのは、プロセスを実行しているディレクトリです。プロセスは、実行されているディレクトリがルート・ディレクトリであると認識するようになります。
ノート:
chrootメカニズムでは、意図的な改ざんや特権ユーザーによるシステム・デバイスへの低レベルのアクセスを防ぐことはできません。たとえば、chroot root
ユーザーはデバイス・ノードを作成し、その上にファイル・システムをマウントできます。また、root
権限を取得し、chroot()
を使用して現在の作業ディレクトリを実際のroot
ディレクトリに変更できた場合、プログラムはchroot jailの外部のリソースにアクセスできます。このため、chroot jailにroot
が所有するsetuid
またはsetgid
実行可能ファイルが含まれていないことを確認することは、適切なセキュリティ・プラクティスとみなされます。
chrootプロセスを正常に開始するには、必要なすべてのプログラム・ファイル、構成ファイル、デバイス・ノードおよび共有ライブラリを、chrootディレクトリの下の想定されているそれぞれの場所に(chrootディレクトリのレベルからの相対位置で)移入する必要があります。
Chroot JailでのDNSおよびFTPサービスの実行
DNSネーム・サービス・デーモン(named
)がchroot jailで実行されている場合、BINDエクスプロイトを使用してシステムにアクセスするハッカーは、chroot jailディレクトリの下のファイルに分離されます。bind-chroot
パッケージをインストールすると、/var/named/chroot
ディレクトリが作成され、これがすべてのBINDファイルのchroot jailとなります。
クライアントに対して自動的にchroot jailを起動するように、vsftpd
FTPサーバーを構成できます。デフォルトでは、匿名ユーザーはchroot jailに配置されます。ただし、vsftpd
FTPサーバーにアクセスしたローカル・ユーザーはそれぞれのホーム・ディレクトリに配置されます。ローカル・ユーザーをそれぞれのホーム・ディレクトリに基づいてchroot jailに配置するには、/etc/vsftpd/vsftpd.conf
ファイルでchroot_local_user=YES
オプションを指定します。
Chroot Jailの作成
-
chroot jailの
root
ディレクトリとなるディレクトリを作成します。次に例を示します:sudo mkdir /home/oracle/jail
-
lddコマンドを使用して、/usr/bin/bashなど、chroot jail内の実行予定のコマンドで必要となるライブラリを特定します:
sudo ldd /usr/bin/bash
次のような出力結果が表示されます。
linux-vdso.so.1 (0x00007fffa5726000) libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f29127fa000) libc.so.6 => /lib64/libc.so.6 (0x00007f29125f1000) /lib64/ld-linux-x86-64.so.2 (0x00007f291298c000)
ノート:
パスが
/lib64
として表示されていても、/lib64
は/usr/lib64
へのシンボリック・リンクのため、実際のパスは/usr/lib64
です。同様に、/bin
は/usr/bin
へのシンボリック・リンクです。このようなシンボル・リンクはchroot jail内で再作成する必要があります。 -
chroot jailのルート・ディレクトリのサブディレクトリを作成します。このサブディレクトリの相対パスは、コマンド・バイナリとその必須ライブラリの実際のルート・ディレクトリからの相対パスと同じです。次に例を示します:
sudo mkdir -p /home/oracle/jail/usr/bin
sudo mkdir -p /home/oracle/jail/usr/lib64
-
バイナリおよびライブラリ・ディレクトリにリンクするシンボリック・リンクは、実際のルート・ディレクトリに存在するシンボリック・リンクと同じ方法で作成します。次に例を示します:
sudo ln -s /home/oracle/jail/usr/bin /home/oracle/jail/bin
sudo ln -s /home/oracle/jail/usr/lib64 /home/oracle/jail/lib64
-
バイナリと共有ライブラリを、chroot jailのルート・ディレクトリの下のディレクトリにコピーします。たとえば:
sudo cp /usr/bin/bash /home/oracle/jail/usr/bin
sudo cp /usr/lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /home/oracle/jail/usr/lib64
Chroot Jailの使用
既存のディレクトリ内のchroot jailでコマンドを実行するには(chroot_jail)、次のコマンドを使用します:
sudo chroot chroot_jail command
コマンド引数が指定されていない場合、chrootはSHELL
環境変数の値で実行し、SHELL
が設定されていない場合は/usr/bin/sh
を実行します。
たとえば、次のように、chroot jailで/usr/bin/bashコマンドを実行できます:
sudo chroot /home/oracle/jail
このシェルでpwdなどの組込みのシェル・コマンドを実行することはできますが、バイナリおよび必要な共有ライブラリをChroot jailにコピーしないかぎり、他のコマンドは実行できません。
詳細は、chroot(1)
マニュアル・ページを参照してください。