・ルートディレクトリを変更(chroot /usr)したとき
exitで解除できるとありますが、手でexitしない限り、変更はそのまま(chrootされっぱなし)なのでしょうか?
はい、お考えの通りです。
環境にもよると思いますが、最近の Linux であれば chroot /usr
コマンドの実行は、 chroot /bin/bash
を実行したのと同じ状態になります(元々は /bin/sh -i
の実行でした。詳しくは chroot --help
や man 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
の概念のほか、プロセスやネットワーク、ホスト名などもホスト上のプロセスと分けることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。