技術ノート Linux Linux で chroot コマンドを使用する方法

Linux で chroot コマンドを使用する方法

Linux で chroot コマンドを使用する方法

chroot コマンドを使用すると、ユーザーを刑務所に送ったり、開発環境やテスト環境を隔離したり、システムのセキュリティを向上させることができます。最も簡単な使用方法を紹介します。

chroot とは何ですか? chroot ジェイルとは何ですか?

Linux で chroot コマンドを使用する方法

chroot を使用すると、通常のファイル システムとの対話が妨げられているカプセル化されたファイル システム内で プログラムや Bash などの対話型シェルをセットアップして実行 できます。 chroot 環境内のすべてが書き込まれ、含まれています。 chroot 環境では、root 権限に昇格することなく、独自の特別なルート ディレクトリを越えて参照することはできません。そのため、この種の環境は chroot 刑務所というニックネームで呼ばれています。 「jail」という用語を、通常の chroot 環境より も安全な chroot 環境を作成する FreeBSD の jail コマンドと混同しないでください。

Linux で chroot コマンドを使用する方法

コマンドの有用性を評価しようとする場合は、コマンドが提供する機能と使いやすさを考慮する必要があります。人々が使用するには複雑すぎたり、長回しすぎて使いたくなるようなものであれば、その機能はゼロと同じかもしれません。誰も使用しない場合、機能は提供されません。

Linux ユーザーとの直接の議論やフォーラムでの議論では、 chroot コマンドは使いにくい、または設定が面倒で面倒すぎると固定されているようです。この素晴らしいユーティリティは、思ったほど活用されていないようです。

しかし、実際には、 chroot 使用する非常に簡単な方法があり、chroot の使用方法の具体的な例を示します。すべてのディストリビューションで動作する通常の Linux コマンドを使用しています。一部の Linux ディストリビューションには、Ubuntu の debootstrap など、 chroot 環境をセットアップするための専用ツールがありますが、ここではディストリビューションに依存しません。

Linux で 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 環境内で実行すると、外部の攻撃者による被害が制限されます。これは、システムのセキュリティを強化するための貴重なステップとなる可能性があります。

Linux で 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 環境内のファイルとディレクトリが再帰的に削除されます。

Linux で chroot コマンドを使用する方法

chroot を自動化して便利にする

chroot 環境は便利かもしれないが、セットアップが少し面倒だと思っている場合は、エイリアス、関数、スクリプトを使用すれば、いつでも反復的なタスクの負担とリスクを軽減できることを思い出してください。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · グループ · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

「 Linux で chroot コマンドを使用する方法」に関するベスト動画選定!

Linuxのコマンドを勉強するよ! (Beginner 004)
私はLinuxのコマンドをどうやって覚えたのか?!