chrootとは?
chrootはルートディレクトリを変更する技術(コマンド)です。chroot = change rootという意味です。そのままですね。chrootは1982年にBill joyによってBSDに追加したのが始まりとされます。
ルートディレクトリを変更することでその後のコマンド操作が及ぶ範囲を限定したり(テスト環境として使用)、別のユーザーからのアクセスの範囲を限定してセキュリティを高めるといった使い方ができます。
chrootはなぜ監獄と呼ばれる?
ルートディレクトリを変更するといって理解できる人は情報技術に精通している方だと思います。
chrootを理解するためにはルートディレクトリに関する知識が必要です。必要ならこちらのリンクでディレクトリについて理解してください。
ルートィレクトリとは頂点に来るディレクトリです。SDカードやUSBメモリを使ったことはありますか?使い始めはUSBをクリックすると何もフォルダ(ディレクトリ)が無い状態だと思います。その開いた場所がルートディレクトリです。
このルートディレクトリを変更するというのはどういうことでしょうか?これはルートディレクトリの中のディレクトリたちを新たにルートディレクトリとするということです。USBメモリの中にUSBメモリを仮想的に作るイメージです。下記の図のようにhomeディレクトリを新たにルートディレクトリ / に変更してしまうのがchrootです。homeが頂点になるので、元のルートディレクトリにはアクセスできません。こうした性質を例えて監獄と呼ぶことがあります。
chrootは任意のプロセスに対して設定できます。例えばchrootしたbash(シェル中)ではルートディレクトリはhomeにする(そのbashを終了したらもとの本来のルートディレクトリに戻る)などです。
他にもsshでリモートログインしてきた人やsftpでファイル操作をしてきた人たち(プロセス)に対して関係のないディレクトリにアクセスしてほしくない場合などにもchrootは使えます。
chrootが仮想化の基礎と呼ばれる理由
仮想化の目的の一つに「みんなでひとつのパソコンを使用する」があります。
PCも高性能化しているので一人一台のPCではもったいない。実際に家庭、職場でも共用のPCはありませんか?
共用のPCは実際には一台しかないので、誰かが使用中では他の人は使えません。仮想化とはこのPCを仮想的に二台にするということです。そうすることで一台のPCを二人で使えるようになります。
一台のPCを複数の人で使えるようにするにはどのような機能が必要でしょうか?
共用のPCを利用する時は、個人のデータや履歴などを別々にしておきたいと思いませんか?データや履歴はHDDなどのディスクに保存されています。これを仮想的に分割することができれば個人ごとの環境が用意できますね。
chrootはHDDを複数に分けるという考え方に近いです。chrootはユーザーごとにアクセスできる領域を設定することもできるからです。chrootが仮想化と呼べるかはよくわかりませんが、ルートディレクトリを仮想的に設定することでストレージのアクセス領域を制限するという点で、シンプルな仮想化とも言えそうですよね?ルートディレクトリ「/」以下にユーザー名の「komeyan」「chickenman」などのフォルダをつくって、彼らにはそのディレクトリをルートディレクトリとして利用してもらうという感じの使い方ですユーザーkomeyanはchickenmanのディレクトリには移動できないので見られません。
昔は一つ屋根の下サザエさん一家のように複数世帯が住んでいることもありますが、最近は家はひとつでも玄関は1つという二世帯住宅も多くなっていますね。これもひとつの家を複数の家に分割しているという点で仮想化っぽいですね。
chrootで家の例で考えるとどうなるんでしょうね?ここの部屋は○○の部屋だと家長が宣言したようなものでしょうか?もっと仮想化レベル(?)を上げると鍵付きの部屋にするとか、玄関別でもトイレやふろ、キッチンは共用とか、壁一枚でつながっているけど別々の家とか、もはや敷地は一緒だけど二棟の家が建っているとかまで考えられますね。あくまでイメージですが…。PCの場合は実態がない部分が多いのでソフトウェア的にそれを分割できるので仮想化と呼ぶにふさわしい気がしますがなんとなくイメージがつかめれば良いです
chrootはセキリュティ的には意味がない
chrootは二段階chrootで簡単に突破出来てしまうのでセキリュティの観点からは意味がないという話があります。FreeBSDなど一部のOSではこれを回避しているものもあるようです。
参考
仙石浩明の日記: chroot されたディレクトリから脱出してみる仙石浩明の日記
chrootのやり方
chrootは $ sudo chroot directory で設定できます。
しかし新しくルートディレクトリとする場合はそのディレクトリにルートディレクトリとして必要なファイルを置く必要があります。
- /bin/bash
- /lib
などです。
chrootするとbashが立ち上がります。このシェルの中ではtestがルートディレクトリになっています。このなかでは/binなどにアクセスできないのでコマンドが使えなくなっています。必要なものはchrootディレクトリ内のbin/に移動する必要があります。必要なライブラリも同時に移動する必要があります。