web-dev-qa-db-ja.com

ファイルシステムにアクセスできるchrootjail

chroot jailは、実際のファイルシステムとの相互作用がなく、単に別の世界のようです。したがって、環境全体をchroot内で複製する必要があります。つまり、その中にシステムを完全にインストールする必要があります。

ただし、chroot jailにメインファイルシステムへの読み取りアクセス権を持たせる方法はありますか?さらに、chrootが独自のファイルを優先する機能も必要です。たとえば、その中に/usr/bin/wgetが存在する場合、それはシステムの/usr/bin/wgetよりも優先されます。

(私は実際に Sandboxie のように動作するものを探しています。)

上記は実行可能ですか?

5
user2064000

次の方法で、ディレクトリをchrootルートにバインドマウントできます。

mount -o bind /x/y /chroot/x/y

man mount 、セクション「バインドマウント」を参照)。これ以降の/chroot/x/yへのアクセスは、/x/yへのアクセスとまったく同じように機能します。つまり、同じファイルリスト、同じコンテンツ、同じiノードです。

ただし、これによりディレクトリ全体がそのままになることに注意してください。ディレクトリに書き込むことができるchroot内のプロセスは、外部の「実際の」ディレクトリに書き込むことができます。 。 chroot内のマウントを読み取り専用にする場合は、バインド後に明示的に読み取り専用で再マウントする必要があります。

mount -o remount,ro /chroot/x/y

元の/ x/yは読み取り/書き込みのままですが、コピーは読み取り専用になります。

ファイルの内部コピーを優先する、または元のファイルに影響を与えずに既存のファイルまたはディレクトリに書き込むことができるようにするには、 ユニオンファイルシステム を使用できます。これらを使用すると、複数のディレクトリツリーを相互にオーバーレイして、書き込みの送信先と読み取りの解決順序を指定できます。 Linuxの一般的なユニオンファイルシステムには、 aufsnionfs 、および nionfs-Fuse が含まれます。これらの最初の2つはカーネルモジュールであり、最後の2つは Fuse を使用してユーザースペースでファイルシステムを実行します。カーネルモジュールは一般的に高速ですが、とにかくchrootからの外部ユーザースペースツールの使用を避けたい場合でも、Fuseバージョンの方がセットアップが簡単な場合があります。必要なユニオンファイルシステムを準備してから、それらにchrootすることができます。

いずれの場合も、基本的なアプローチは同じで、次のようになります。

unionfs-Fuse -o cow /jail/bin:/other/bin:/bin /chroot/bin

これにより、/chroot/binにユニオンマウントが作成され、/jail/binのファイルが存在する場合は優先され、/other/bin/が試されます。それ以外の場合は、/binのファイルが表示されます。 -o cowはコピーオンライトになります。たとえば、/chroot/bin/fooに書き込もうとすると/bin/foo/jail/bin/fooにコピーされ、そこに変更が保存されます。その動作を望まない場合は、オプションを省略してください。他のファイルシステムの構成はわずかに異なりますが、原則は同じです。

どちらの方法で設定しても、次のことができます。

chroot /chroot

そして、すべてがあなたが望むように機能するようにします。

7
Michael Homer

mount -o bindは、完全なディレクトリに対してそれを行う必要があります。

mount -o bind /bin /chroot/bin
chroot /chroot

Chroot内にシステム/ binのコピーが作成されることになります。

Bashのコピーを/ chroot/bin/bashに置き換えて、今日と同じように処理するには、/ chroot/usr/local/binに配置し、それに応じてPATHを設定します。

2
coteyr