chroot Jailとは何ですか?
Unixオペレーティングシステム上のchrootは、現在実行中のプロセスとその子プロセスの見かけのルートディレクトリを変更する操作です。 この変更された環境で実行されるプログラムは、指定されたディレクトリツリー外のファイルにアクセスできません。 これは基本的にディレクトリツリーへのアクセスを制限するため、”chroot jail”という名前になります。
アイデアは、プロセスの実行に必要なすべてのシステムファイルをコピーまたはリンクするディレクトリツリーを作成することです。 次に、chrootシステムコールを使用して、ルートディレクトリをこの新しいツリーのベースに変更し、そのchroot環境で実行されているプロセスを開始します。 変更されたルートの外側のパスを実際に参照することはできないので、それらの場所に悪意を持って読み書きすることはできません。
なぜ必要なのか、仮想マシンとどのように違うのですか?
これはオペレーティングシステムレベルの仮想化であり、ホストOSの複数の分離インスタンスを作成するために仮想マシンの代わりに使用される これはカーネルレベルの仮想化であり、アプリケーション層の仮想化である仮想マシンと比較して実質的にオーバーヘッドがないため、同じハードウェア上に複数の分離されたインスタンスを作成するための非常に優れた方法を提供します。 仮想マシン(VM)は、マシンのソフトウェア実装であり、彼らは多くの場合、作業オペレーティングシステムの仮想イメージをレンダリングするために、ハードウ
chroot jailを作成するための基本的なコマンドは次のとおりです:
chroot /path/to/new/root command OR chroot /path/to/new/root /path/to/server OR chroot /path/to/new/root /path/to/server
メモ: Root/特権ユーザーのみがchrootシステムコールを使用できます。 コマンドへのアクセス権を持つ特権のないユーザーは、chroot jailをバイパスできます。
‘bash’と’ls’コマンドのミニジェイルを作成する手順
1. コマンドのルートとして機能するディレクトリを作成します。
$ mkdir jailed $ cd jailed
2. コマンドを実行するために必要なすべてのディレクトリを作成します:オペレーティングシステムによっては、必要なディレクトリが変更される可能性があります。 論理的には、必要なライブラリのコピーを保持するために、これらすべてのディレクトリを作成します。 すべてのディレクトリが必要かどうかを確認するには、手順4を参照してください。
$ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu
3.’Which’コマンドを実行します:’which’コマンドを実行して、lsとbashコマンドの場所を見つけます。 Whichコマンドを実行した後、それらのバイナリをjailの’bin’ディレクトリにコピーします。 これらのコマンドがエイリアスされていないことを確認してください。 今から、私達は便宜上’投獄された’登録簿として私達の登録簿を参照する。
$ unalias ls # Required only if you have aliased ls command $ unalias bash # Required only if you have aliased bash command $ cp $(which ls) ./bin/ $ cp $(which bash) ./bin/
4. 適切なライブラリ/オブジェクトをコピーする:Jailedディレクトリ内の実行可能ファイルが機能するには、JAILEDディレクトリ内の適切なライブラリ/オブジェク デフォルトでは、実行可能ファイルは’/’で始まる場所を調べます。 依存関係を見つけるには、コマンド’ldd’を使用します’
$ ldd $(which bash) linux-vdso.so.1 => (0x00007ffc75dd4000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000) /lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)
次のコマンドを実行して、適切なディレクトリを作成します。
$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/$ cp /lib64/ld-linux-x86-64.so.2 lib64/
,
$ ldd $(which ls) linux-vdso.so.1 => (0x00007fff4f05d000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000) /lib64/ld-liux-x86-64.so.2 (0x000055e836c69000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/$ cp /lib64/ld-linux-x86-64.so.2 lib64/$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/
最終的なディレクトリ構造は、
5. Sudo chroot:シェルへのパスと一緒に、投獄されたディレクトリにルートを変更するには、このコマンドを実行します。 デフォルトでは、’/bin/sh’シェルをロードしようとします。
$ cd .. $ sudo chroot jailed /bin/bash
chrootコマンドの実行中にこのエラーが発生する可能性があります,
chroot: failed to run command `/bin/bash': No such file or directory
これは、ファイルが存在しない(明らかである)か、ライブラリのロードが失敗したか利用できない2つの理由が原因である可能性があります。 Libariesが正しい場所にあるかどうかを再確認します。
6. 新しいシェルがポップアップする必要があります:その私たちの投獄されたbash。 現在、bashとlsの2つのコマンドしかインストールされていません。 幸いなことに、cdとpwdはbashシェルの組み込みコマンドなので、それらも使用できます。
ディレクトリの周りを歩き回り、’cd/にアクセスしてみてください。./’または似たようなもの。 刑務所を壊そうとすると、おそらくあなたはできなくなります。 ▲
刑務所から出るには,
$ exit
最も重要で興味深い部分は、あなたが実行するとき、ということです,
$ ps aux
そして、プロセスを見つけると、あなたは一つだけのプロセスがあることがわ,
root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash
興味深いことに、jailedシェルのプロセスは、このシェルの単純な子プロセスとして実行されます。 投獄された環境内のすべてのプロセスは、ホストOSの単純なユーザーレベルのプロセスであり、カーネルが提供する名前空間によって分離されているため、オーバヘッドが最小限に抑えられ、追加の利点として分離が得られます。
ここで説明したjailed-bash-directoryのコピーはここからダウンロードできます。
同様に、仮想投獄された環境にさらにコマンドを追加することができます。 より複雑なプログラムを追加するには、’/proc’や’/dev’のように、より多くのディレクトリを作成する必要があるかもしれません。 これらは、プロセスの複雑さを増加させます。 うまくいけば、私たちは私たちの目的のためにそれを必要としません。
chrootとディレクトリの投獄について知る必要があるのはこれだけです。 私たちの究極の目的は、コンテナとは何か、AWS(Amazon Web Services)、Google Cloud、Dockerなどのサービスが、オンデマンドで非常に多くのオペレーティングシステムの仮想インスタンス また、sys-adminは、単一の物理マシン上の複数のドメインに対して複数のwebサーバーをどのように実行しますか。 これはそれを理解するための一歩に過ぎませんでした🙂
- https://help.ubuntu.com/community/DebootstrapChroot
- https://wiki.archlinux.org/index.php/Install_from_existing_Linux
- http://serverfault.com/questions/162362/chroot-fails-cannot-run-command-bin-bash-no-such-file-or-directory
- https://wiki.archlinux.org/index.php/change_root
著者について:
Pinkesh BadjatiyaはIIITハイデラバードから出身。 彼は捜す価値がある十分なプロジェクトとの中心にオタクである。 彼のプロジェクトの仕事はここで見ることができます。
ここであなたのブログを紹介したい場合は、GeeksforGeeksに書いているゲストブログについてはGBlogを参照してください。