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を作成するには:
  1. chroot jailのrootディレクトリとなるディレクトリを作成します。次に例を示します:

    sudo mkdir /home/oracle/jail
  2. 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内で再作成する必要があります。

  3. chroot jailのルート・ディレクトリのサブディレクトリを作成します。このサブディレクトリの相対パスは、コマンド・バイナリとその必須ライブラリの実際のルート・ディレクトリからの相対パスと同じです。次に例を示します:

    sudo mkdir -p /home/oracle/jail/usr/bin
    sudo mkdir -p /home/oracle/jail/usr/lib64
  4. バイナリおよびライブラリ・ディレクトリにリンクするシンボリック・リンクは、実際のルート・ディレクトリに存在するシンボリック・リンクと同じ方法で作成します。次に例を示します:

    sudo ln -s /home/oracle/jail/usr/bin /home/oracle/jail/bin
    sudo ln -s /home/oracle/jail/usr/lib64 /home/oracle/jail/lib64
  5. バイナリと共有ライブラリを、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                     

コマンド引数が指定されていない場合、chrootSHELL環境変数の値で実行し、SHELLが設定されていない場合は/usr/bin/shを実行します。

たとえば、次のように、chroot jailで/usr/bin/bashコマンドを実行できます:

sudo chroot /home/oracle/jail

このシェルでpwdなどの組込みのシェル・コマンドを実行することはできますが、バイナリおよび必要な共有ライブラリをChroot jailにコピーしないかぎり、他のコマンドは実行できません。

詳細は、chroot(1)マニュアル・ページを参照してください。