chroot
コマンドを使用すると、ユーザーを刑務所に送ったり、開発環境やテスト環境を隔離したり、システムのセキュリティを向上させることができます。最も簡単な使用方法を紹介します。
chroot とは何ですか? chroot ジェイルとは何ですか?
chroot
を使用すると、通常のファイル システムとの対話が妨げられているカプセル化されたファイル システム内で
プログラムや Bash などの対話型シェルをセットアップして実行
できます。
chroot
環境内のすべてが書き込まれ、含まれています。
chroot
環境では、root 権限に昇格することなく、独自の特別なルート ディレクトリを越えて参照することはできません。そのため、この種の環境は
chroot
刑務所というニックネームで呼ばれています。 「jail」という用語を、通常の
chroot
環境より
も安全な
chroot
環境を作成する
FreeBSD の
jail
コマンドと混同しないでください。
コマンドの有用性を評価しようとする場合は、コマンドが提供する機能と使いやすさを考慮する必要があります。人々が使用するには複雑すぎたり、長回しすぎて使いたくなるようなものであれば、その機能はゼロと同じかもしれません。誰も使用しない場合、機能は提供されません。
Linux ユーザーとの直接の議論やフォーラムでの議論では、
chroot
コマンドは使いにくい、または設定が面倒で面倒すぎると固定されているようです。この素晴らしいユーティリティは、思ったほど活用されていないようです。
しかし、実際には、
chroot
使用する非常に簡単な方法があり、chroot の使用方法の具体的な例を示します。すべてのディストリビューションで動作する通常の Linux コマンドを使用しています。一部の Linux ディストリビューションには、Ubuntu の
debootstrap
など、
chroot
環境をセットアップするための専用ツールがありますが、ここではディストリビューションに依存しません。
chroot を使用する必要があるのはどのような場合ですか?
chroot
環境は仮想マシンと同様の機能を提供しますが、より軽量なソリューションです。キャプティブ システムでは、
VirtualBox
や
Virtual Machine Manager
などのハイパーバイザーをインストールして構成する必要はありません。また、キャプティブ システムにカーネルをインストールする必要もありません。キャプティブ システムは既存のカーネルを共有します。
ある意味、
chroot
環境は仮想マシンよりも
LXC
などのコンテナに近いものです。これらは軽量で、迅速に展開でき、作成と起動は自動化できます。コンテナーと同様に、コンテナーを構成する便利な方法の 1 つは、必要な作業を実行するのに十分なオペレーティング システムをインストールすることです。 「何が必要か」という質問は、
chroot
環境をどのように使用するかを検討することで答えられます。
一般的な使用例は次のとおりです。
ソフトウェア開発と製品検証
。開発者がソフトウェアを作成し、製品検証チーム (PV) がそれをテストします。場合によっては、開発者のコンピュータでは再現できない問題が PV によって検出されることがあります。開発者は、平均的なユーザー (および PV) が持たないようなあらゆる種類のツールやライブラリを開発用コンピューターにインストールしています。開発者にとっては機能しても、他の人にとっては機能しない新しいソフトウェアが、ソフトウェアのテスト リリースには含まれていない開発者の PC 上のリソースを使用していることが判明することがよくあります。
chroot
使用すると、開発者は自分のコンピュータ上に、ソフトウェアを PV に渡す前にシープディップできるプレーンなバニラのキャプティブ環境を構築できます。キャプティブ環境は、ソフトウェアに必要な最小限の依存関係を使用して構成できます。
開発リスクの軽減 。開発者は専用の開発環境を作成して、そこで何が起こっても実際の PC が台無しになることを防ぐことができます。
非推奨のソフトウェアを実行しています
。場合によっては、何かの古いバージョンを実行しなければならないこともあります。古いソフトウェアに、使用している Linux のバージョンと競合する要件や互換性がない要件がある場合は、問題のあるソフトウェアの環境を
chroot
ことができます。
リカバリとファイルシステムのアップグレード
: Linux インストールが動作不能になった場合、
chroot
使用して破損したファイルシステムを Live CD 上のマウント ポイントにマウントできます。これにより、破損したシステムで作業し、root / に通常どおりマウントされているかのように修復を試みることができます。これは、破損したシステム内の予期されるファイル パスが、Live CD のマウント ポイントからではなく、ルート ディレクトリから正しく参照されることを意味します。 Linux ファイルシステムを ext2 または ext3 から ext4 に移行する方法を説明した記事でも、同様の手法が使用されています。
リングフェンシング アプリケーション
。 FTP サーバーまたはその他のインターネットに接続されたアプライアンスを
chroot
環境内で実行すると、外部の攻撃者による被害が制限されます。これは、システムのセキュリティを強化するための貴重なステップとなる可能性があります。
chroot環境の作成
chroot
環境のルート ディレクトリとして機能するディレクトリが必要です。そのディレクトリを簡単に参照できるように、変数を作成し、その中にディレクトリの名前を格納します。ここでは、「testroot」ディレクトリへのパスを保存する変数を設定しています。このディレクトリがまだ存在していなくても問題ありません。すぐに作成します。ディレクトリが存在する場合は、空である必要があります。
chr=/ホーム/デイブ/テストルート
ディレクトリが存在しない場合は、作成する必要があります。このコマンドを使用してそれを行うことができます。
-p
(parent) オプションを使用すると、不足している親ディレクトリが同時に作成されるようになります。
mkdir -p $chr
chroot
環境に必要なオペレーティング システムの部分を保持するディレクトリを作成する必要があります。 Bash を対話型シェルとして使用する最小限の Linux 環境をセットアップします。
touch
、
rm
、および
ls
コマンドも含めます。これにより、Bash のすべての組み込みコマンドと
touch
、
rm
、および
ls
を使用できるようになります。ファイルの作成、一覧表示、削除、および Bash の使用ができるようになります。そして、この単純な例では、それだけです。
作成する必要があるディレクトリを
{}
中
括弧展開
内にリストします。
mkdir -p $chr/{bin,lib,lib64}
次に、ディレクトリを新しいルート ディレクトリに変更します。
cd $chr
ミニマリスト Linux 環境に必要なバイナリを、通常の “/bin” ディレクトリから
chroot
“/bin” ディレクトリにコピーしましょう。
-v
(冗長) オプションを使用すると、
cp
各コピー アクションの実行時に何を行っているかを通知します。
cp -v /bin/{bash,touch,ls,rm} $chr/bin
ファイルがコピーされます。
これらのバイナリには依存関係があります。それらが何であるかを見つけて、それらのファイルを環境にコピーする必要があります。そうしないと、
bash
、
touch
、
rm
、および
ls
機能できなくなります。選択したコマンドごとにこれを順番に実行する必要があります。最初に Bash を実行します。
ldd
コマンドを使用すると
、依存関係が一覧表示され
ます。
ldd /bin/bash
依存関係が特定され、ターミナル ウィンドウにリストされます。
これらのファイルを新しい環境にコピーする必要があります。そのリストから詳細を選択して一度に 1 つずつコピーすると、時間がかかり、間違いが発生しやすくなります。
ありがたいことに、それを半自動化できます。依存関係を再度リストし、今回はリストを作成します。次に、リストをループしてファイルをコピーします。
ここでは、
ldd
を使用して依存関係をリストし、その結果をパイプ経由で
egrep
に送ります。
egrep
を使用することは、
-E
(拡張正規表現) オプションを指定して
grep
を使用することと同じです。
-o
(一致のみ) オプションは、出力を行の一致部分に制限します。
[0-9]
で終わる一致するライブラリ ファイルを探しています。
list="$(ldd /bin/bash | egrep -o '/lib.*\.[0-9]')"
echo
を使用してリストの内容を確認できます。
$listをエコーする
リストを取得したので、次のループでリストをステップ実行し、ファイルを 1 つずつコピーします。変数
i
を使用してリストをステップ実行します。リストの各メンバーについて、ファイルを
chroot
ルート ディレクトリにコピーします。これは、
$chr
に保持されている値です。
-v
(冗長) オプションを使用すると、
cp
各コピーを実行するときに通知します。
--parents
オプションを使用すると、不足している親ディレクトリが
chroot
環境に確実に作成されます。
$list の私にとって; do cp -v --parents "$i" "${chr}";終わり
そしてこれが出力です:
この手法を使用して、他の各コマンドの依存関係を取得します。そして、ループ手法を使用して実際のコピーを実行します。幸いなことに、依存関係を収集するコマンドを少し編集するだけで済みます。
Up Arrow
キーを数回押してコマンド履歴からコマンドを取得し、編集します。ループ コピー コマンドはまったく変更する必要がありません。
ここでは、
Up Arrow
キーを使用してコマンドを検索し、
bash
の代わりに
touch
なるように編集しました。
list="$(ldd /bin/touch | egrep -o '/lib.*\.[0-9]')"
これで、前とまったく同じループ コマンドを繰り返すことができます。
$list の私にとって; do cp -v --parents "$i" "${chr}";終わり
そして、ファイルがコピーされます。
これで、
ls
の
list
コマンド ラインを編集できるようになりました。
list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
もう一度、同じループ コマンドを使用します。リストにどのようなファイルがあるかは関係ありません。リストを盲目的に処理してファイルをコピーします。
$list の私にとって; do cp -v --parents "$i" "${chr}";終わり
そして、
ls
の依存関係がコピーされます。
最後に
list
コマンド ラインを編集して、
rm
で機能するようにします。
list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
最後にもう一度ループ コピー コマンドを使用します。
$list の私にとって; do cp -v --parents "$i" "${chr}";終わり
最後の依存関係が
chroot
環境にコピーされます。いよいよ
chroot
コマンドを使用する準備が整いました。このコマンドは、
chroot
環境のルートを設定し、シェルとして実行するアプリケーションを指定します。
sudo chroot $chr /bin/bash
chroot
環境がアクティブになりました。ターミナル ウィンドウのプロンプトが変更され、この環境では対話型シェルが
bash
シェルによって処理されます。
環境に導入したコマンドを試すことができます。
ls
ls /ホーム/デイブ/ドキュメント
ls
コマンドは、環境内で使用すると期待どおりに機能します。環境外のディレクトリにアクセスしようとすると、コマンドは失敗します。
touch
を使用してファイルを作成し、
ls
を使用してリストし、
rm
使用して削除できます。
タッチサンプルファイル.txt
ls
rm サンプルファイル.txt
ls
もちろん、Bash シェルが提供する組み込みコマンドを使用することもできます。コマンドラインで
help
と入力すると、Bash がリストを表示します。
ヘルプ
exit を使用して
chroot
環境を終了します。
出口
chroot
環境を削除したい場合は、単に削除することができます。
rm -r テストルート/
これにより、
chroot
環境内のファイルとディレクトリが再帰的に削除されます。
chroot を自動化して便利にする
chroot
環境は便利かもしれないが、セットアップが少し面倒だと思っている場合は、エイリアス、関数、スクリプトを使用すれば、いつでも反復的なタスクの負担とリスクを軽減できることを思い出してください。





