logo

Linux Virtualization -Chroot刑務所

UNIXオペレーティングシステムのChrootは、現在の実行プロセスとその子供の見かけのルートディレクトリを変更する操作です。この変更された環境で実行されるプログラムは、指定されたディレクトリツリーの外側のファイルにアクセスできません。これにより、本質的にディレクトリツリーへのアクセスが制限されるため、「クルート刑務所」という名前が得られます。

アイデアは、プロセスを実行するために必要なすべてのシステムファイルにコピーまたはリンクするディレクトリツリーを作成することです。次に、Chroot System Callを使用して、ルートディレクトリを変更してこの新しいツリーのベースに変更し、そのchrooted環境で実行されているプロセスを開始します。実際に変更されたルートの外側のパスを参照できないため、それらの場所を悪意を持って読み書きすることはできません。



なぜそれが必要なのか、仮想マシンとどのように違うのですか?

これは、システムレベルの仮想化を動作させるものであり、仮想マシンの代わりに使用されることがよくあり、ホストOの複数の孤立したインスタンスを作成します。これはカーネルレベルの仮想化であり、結果としてアプリケーションレイヤー仮想化である仮想マシンと比較して、実際にはオーバーヘッドがありません。仮想マシン(VM)はマシンのソフトウェア実装であり、多くの場合、ハードウェア仮想化と呼ばれるものを活用して、作業オペレーティングシステムの仮想画像をレンダリングします。

クルー刑務所の使用方法

クルート刑務所を作成するための基本的なコマンドは次のとおりです。

Javaでの接続
 chroot /path/to/new/root command  
OR
chroot /path/to/new/root /path/to/server
OR
chroot [options] /path/to/new/root /path/to/server

注:ルート/特権ユーザーのみがChroot System Callを使用できます。コマンドへのアクセスを備えた非主要なユーザーは、Chroot刑務所をバイパスできます。



「バッシュ」と「LS」コマンドのミニジェイルを作成する手順


1.コマンドのルートとして機能するディレクトリを作成します。

 $ mkdir jailed  
$ cd jailed

2。コマンドを実行するためのすべての重要なディレクトリを作成します。 オペレーティングシステムに応じて、必要なディレクトリが変更される場合があります。論理的には、必要なライブラリのコピーを保持するためにこれらすべてのディレクトリを作成します。すべてのディレクトリが必要なものを確認するには、ステップ4を参照してください。

 $ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3.「whis」コマンドを実行します。 LSおよびBASHコマンドの場所を見つけるために「whis」コマンドを実行します。刑務所の「ビン」ディレクトリでそれらのバイナリをコマンドする後の実行後。これらのコマンドがエイリアスされていないことを確認してください。これからは、私たちのディレクトリを次のように参照しています 「投獄」 便利なディレクトリ。



 $ 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.適切なライブラリ/オブジェクトをコピーします :私たちの実行可能ファイル用 投獄 ディレクトリ作業には、投獄されたディレクトリに適切なライブラリ/オブジェクトをコピーする必要があります。デフォルトでは、実行可能ファイルは「/」で始まる場所を見ます。依存関係を見つけるには、コマンド「LDD」を使用します

Cでポインタを逆参照する方法
$ 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/

同様にLSについて 

$ 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-linux-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/


最終的なディレクトリ構造はこれに似ている必要があります

クルート刑務所' title=

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つの理由(明らかな)またはロードライブラリが故障した場合、または使用できない場合の2つの理由が原因である可能性があります。ライブラリが正しい場所にある場合は、ダブルチェックします。

6.新しいシェルがポップアップする必要があります。 その投獄されたバッシュ。現在、BashとLSがインストールされているコマンドは2つしかありません。幸いなことに、CDとPWDはBash Shellにコマンドが組み込まれているため、それらも使用できます。

ディレクトリの周りを歩き回って、「CD /../」または似たようなものにアクセスしてみてください。刑務所を破ってみてください。おそらくあなたはできないでしょう。 :)

刑務所から出る 

 $ exit

最も重要で興味深い部分は、あなたが走るときです 

 $ ps aux

そして、プロセスが1つしかないことがわかります 

root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash

興味深いことに、投獄されたシェルのプロセスは、このシェルの単純な子プロセスとして実行されます。投獄された環境内のすべてのプロセスは、ホストOSの単純なユーザーレベルのプロセスであり、カーネルが提供する名前空間によって分離されているため、オーバーヘッドが最小限に抑えられ、追加の利点として分離が得られます。

タイプスクリプトごとに

同様に、仮想投獄された環境にさらにコマンドを追加できます。より複雑なプログラムを追加するには、「/proc」や「/dev」などのより多くのディレクトリを作成する必要があります。これらはプロセスの複雑さを高めます。うまくいけば、私たちは私たちの目的のためにそれを必要としません。

これは、Chrootとディレクトリの投獄について知っておく必要があるすべてです。私たちの究極の目的は、コンテナとは何か、AWS(Amazon Web Services)Google CloudやDockerなどのサービスのようなサービスを理解することです。また、Sys-Adminは単一の物理マシン上の複数のドメインに対して複数のWebサーバーをどのように実行しますか。これは、それを理解するための1つのステップにすぎませんでした