質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

3回答

3478閲覧

Chrootを使う理由、意図、ユースケースを知りたい

yukisilky

総合スコア0

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2021/05/19 07:15

前提

Linuxを勉強しています。
初歩的な質問で申し訳ありませんが、以下の疑問点がわからず、chrootを理解しきれずにいます。
同僚にも聞きましたが、Linux経験者でなく、わからなかったので質問させていただきました。
質問自体もふんわりしているようでしたら、申し訳ございません。
よろしくお願いいたします。

例題

--ルートディレクトリを変更 chroot /usr --ルートディレクトリを変更してコマンドを実行 chroot /usr /bin/ls

疑問点

・ルートディレクトリを変更(chroot /usr)したとき exitで解除できるとありますが、手でexitしない限り、変更はそのまま(chrootされっぱなし)なのでしょうか? ・ルートディレクトリを変更してコマンドを実行 chroot /usr /bin/ls ルートディレクトリ変更後、コマンド実行し、その後元のルートディレクトリに戻る…という実行内容とすると、わざわざディレクトリを一時的に離してコマンド実行する理由は何でしょうか? 元に戻るなら、chrootしなくてもよいのでは?と思いました。 ・ルートディレクトリをただ変更するときの意図と、変更してコマンド実行するときの意図は全く別物でしょうか? ・どんなときにchrootを使いますか?

参考にしたサイト

https://wa3.i-3-i.info/word13814.html
他にいくつか見て回りましたが、上記のサイトをメインに参考にしました。
例題はここに載っている例です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

・ルートディレクトリを変更(chroot /usr)したとき
exitで解除できるとありますが、手でexitしない限り、変更はそのまま(chrootされっぱなし)なのでしょうか?

はい、お考えの通りです。
環境にもよると思いますが、最近の Linux であれば chroot /usr コマンドの実行は、 chroot /bin/bash を実行したのと同じ状態になります(元々は /bin/sh -i の実行でした。詳しくは chroot --helpman chroot をご覧ください)。

そのため、シェルが起動する状態になりますので、 exit になるまでは、そのシェルが chroot されている状態で実行されています。

シェルでは無い任意のコマンドも実行可能です。その場合は、 exit は不要です。

たとえば、 pwd という、現在のディレクトリを表示するコマンドを実行する場合は、処理を行い、自動的に終了します。

shell

1# chroot /usr /bin/pwd 2/

この場合、 exit は発生しません。 chroot された環境下で /bin/pwd (サーバ上の実体としては /usr/bin/pwd です)を実行して、 / を表示(ホスト上では /usr/)して終了します。

・ルートディレクトリを変更してコマンドを実行
chroot /usr /bin/ls
ルートディレクトリ変更後、コマンド実行し、その後元のルートディレクトリに戻る…という実行内容とすると、わざわざディレクトリを一時的に離してコマンド実行する理由は何でしょうか?
元に戻るなら、chrootしなくてもよいのでは?と思いました。

chroot は、指定したディレクトリを / (ルート)としてプロセス実行する、という意図があります。

理由としては、

  • 歴史的な経緯として、1つのホスト上で複数のプロセスを実行したい
  • 実行するプロセスを、ホスト上の他のプロセス(が参照するディレクトリ)の影響を受けたくない

があります。

確かに理由が無ければ、処理して戻るのであれば全く意味がありません。

ですが、1つのホスト上で、例えばバージョンの違うプログラムを実行したい場合もあるでしょう。

たとえば、異なるバージョンのプログラミング言語を動かしたい時、既にホスト上で動いているバージョンに影響を与えず、違う環境を試したいときに chroot を使うこともできます。

chroot 機能を使えば、ホスト上の「/tmp/example/」 というディレクトリの中にファイルを配置しておき、そこで実行するテスト用のプログラムを走らせることも簡単です。たとえばchroot して「/usr/bin/」 というディレクトリで動いているつもりでも、ホスト上では「/tmp/example/usr/bin」という場所で動いているように動作させることもできます。

・ルートディレクトリをただ変更するときの意図と、変更してコマンド実行するときの意図は全く別物でしょうか?

同じ場合もありますし、異なる場合も有りえます。

単純に、そのプロセスが参照できるディレクトリ(正確にはファイルシステム)のルートを限定する方法として chroot を使う時が考えられます。

chroot の簡単な例としては、ホスト上のどこパス上に存在していようが、プロセス実行時には chrootすることによって、どこのディレクトリにあっても同じ設定ファイルで実行できる、といった手軽さがあるでしょう。

・どんなときにchrootを使いますか?

今日では、インターネット用のサーバとして動作するプロセス(デーモン)が、標準的な機能として chroot を使っています。理由はセキュリティ対策です。

インターネットに公開しているサーバ、たとえばウェブサーバや DNS サーバとして動くプロセスは、常にインターネット上に公開する必要があります。そして、プロセスは日々バージョンアップを重ねており、意図しないセキュリティ上の脆弱性も発生しうるリスクがあります。

仮に、インターネット上に公開しているプロセスに何らかの脆弱性があったとしても、 chroot の指定があれば、脆弱性によってサーバにアクセス可能になったと仮にしても、 chroot で制限されている場所以外のディレクトリは参照できません。

何かあったとしても、ホスト上の他の場所にはアクセスできないような環境、というのを用意することもできます(完全ではなく、処理内容によってはアクセスできうる可能性も潜在的にはあるかもしれませんが、一般的な脆弱性であればこれで回避できうることを期待できます)。

また、ホスト上で複数の環境をお互い影響与えずに実行したいう場合は、 chroot よりも環境の再現性や再利用性の高い Docker が近年では多く導入されています。 Docker はファイルシステムとしての chroot の概念のほか、プロセスやネットワーク、ホスト名などもホスト上のプロセスと分けることができます。

投稿2021/05/19 11:51

編集2021/05/19 12:03
zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず最初に

https://wa3.i-3-i.info/word13814.html

他にいくつか見て回りましたが、上記のサイトをメインに参考にしました。

「『分かった』気になれる」と謳ってる上記サイトを参考にするのは、正直やめた方が良いです。

で、そもそものお話として、LinuxというかUNIX系のシステムでは、各プロセス(実行中のプログラム)の属性の一つに「ルートディレクトリ」があります。
ファイルアクセスの起点を表す「作業ディレクトリ(CWD)」に似ていますが、こちらは「そのプロセスがどこを最上位のディレクトリと見るか」を制御する属性です。
あくまで起点の意味しかない作業ディレクトリと違って、このルートディレクトリ属性は一旦設定するとそれより上の階層に再設定はできませんし、下の階層以外へのアクセスもできなくなります。
そのため、ファイルシステム全体の中で部分的に隔離された「牢屋」のように機能させることができます。

このルートディレクトリ属性は、Linuxであれば "/proc/プロセスID/root" という仮想的なシンボリックリンクの指す先として見ることができます。

イメージ説明

このルートディレクトリを変更するには、作業ディレクトリを変更するchdir(2)ならぬchroot(2)というシステムコール(OSへの依頼を行うAPI)を使います。
chrootコマンドは、このAPIを使って「ルートディレクトリを変更した状態で」なんらかのプログラムを実行するためのものです。
※コマンド省略時はシェルを実行します。

で、各疑問についてですが、

・ルートディレクトリを変更(chroot /usr)したとき

exitで解除できるとありますが、手でexitしない限り、変更はそのまま(chrootされっぱなし)なのでしょうか?

「exitで解除できる」のではなく、chrootにより起動されたシェルがexitで終了するだけです。chrootコマンドを起動した元のシェル(非chroot状態)はバックグラウンドで終了や一時停止を待ち続けています。
「変更はそのまま」という表現だと、あたかも「非chroot状態→chroot状態→非chroot状態」と状態が切り替わってるように見えますが、単にフォアグラウンドにいるプログラムがどれかが切り替わっているに過ぎません。

わざわざディレクトリを一時的に離してコマンド実行する理由は何でしょうか?

元に戻るなら、chrootしなくてもよいのでは?と思いました。

上述の通り「状態が切り替わっている」のではなく、「ルートディレクトリ属性を変更した状態でプログラムを実行させる」のが主眼です。

・ルートディレクトリをただ変更するときの意図と、変更してコマンド実行するときの意図は全く別物でしょうか?

一般のプログラムは、自分自身でルートディレクトリを変更するような機能をわざわざ実装していませんから、外部から既に変更した状態で起動させてあげる、という意味があると見ていただければ良いかと思います。

・どんなときにchrootを使いますか?

まず1つには、DVD起動してからOSの入ったディスクをマウントしてchroot、レスキュー時の鉄板です。

他に関してはchrootコマンドではなく、OSの機能としてのchroot(2)の方で言いますが、やはり他の領域にアクセスできない「牢屋」としての意味合いが強いです。
昔は (root乗っ取りに発展するバグがそこそこの頻度で見つかっていたとは言え) サーバーアプリでもあまりchrootする習慣はなかったと記憶しています。一番多かったのは匿名でのファイル公開に使うFTPサービスが、内部的にchrootする使い方だったと思います。
それが20世紀末頃に、DJBという研究者の方が「今のソフトセキュリティがダメダメだよね」と qmail や djbdns を出した時にこの chroot(2) を積極的に活用しており、その影響がBIND等他のソフトへも波及した、という印象があります。

投稿2021/05/19 15:05

angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おっしゃる通り、単純な Linux 操作をするだけの状況では、 chroot プログラムを必要とするケースは、滅多に無いことでしょう。

これは、Chroot プログラムそのものが、”ソフトウェア開発”や”サーバー運用”での利用シーンを想定して作られたためです。

chroot について疑問を持ったのでしたら、「chroot 監獄」という言葉も検索すると、さらに理解が広がると思います。

なお、teratail の過去の質問と回答にありましたので、一緒にご紹介しておきます。

 teratail : chrootとは何でしょうか?

投稿2021/05/19 08:51

Yoshi88

総合スコア623

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問