Chroot

chroot
Raspberry Pi OSでのchrootの使用例。特別なルートディレクトリ内でインタラクティブシェルを実行している。
作者 ビル・ジョイ, AT&Tベル研究所
開発元 多くのオープンソースソフトウェアと商用ソフトウェアの開発者・組織
初版 1979年(47年前) (1979)
対応OS UNIX, Unix系, Plan 9, Inferno
プラットフォーム クロスプラットフォーム
種別 コマンド
テンプレートを表示

chrootとは、UNIXオペレーティングシステム (OS) において、現在のプロセスとその子プロセス群に対してルートディレクトリを変更する操作である。ルートディレクトリを別のディレクトリに変更されたプロセスは、その範囲外のファイルにはアクセスできなくなるため、この操作をchroot監獄や模擬ルートなどとも呼ぶ。"chroot" は chroot(2) システムコールおよび chroot(8) コマンドを意味する。

chroot システムコールは、Unix Version 7 (1979) に新機能として加えられ、1982年3月18日(4.2BSDリリースの17ヶ月前)、ビル・ジョイがインストールおよびビルドシステムのテスト用にBSDに導入したのが起源である。

用途

chroot はOSの仮想化され分離されたコピーを作るのに使われる。これには、以下のような用途がある。

テストと開発
実際に使用中のシステムで評価するには危険と思われる開発中ソフトウェアのテスト環境構築に chroot を使う。
依存関係制御
ソフトウェアの開発において、ビルドに最低限必要なものだけを用意した環境に chroot して実施することもできる。これにより、意図しないライブラリがリンクされてしまうのを防ぐことができる。
互換性
古いソフトウェアや異なるABIを使っているソフトウェアは、場合によっては chroot した環境で実行する必要がある。これは例えば、動的リンクされるライブラリが同じ名前で異なる内容を必要とされる場合があるためである(名前空間の衝突の回避)。
復旧
ブートできなくなったシステムの復旧において、別のブート媒体(Live CD など)で立ち上げておいて、ダメージのある環境に chroot することがある。UNIXのインストールでも、最初はインストール媒体で立ち上げておいて、最小限インストールした時点で chroot でディスクをルートディレクトリとすることもある。
権限不要の仮想化(一部の限定的なシステム)
仮想化のためには通常、rootが必要だがrootが取れない場合などに利用される。主にAndroidアプリのUserLandやtermuxはこの技術を採用している。
特権分離
chroot されたプロセスのオープンしているファイル記述子(ファイル、パイプ、ネットワーク接続など)はそのまま保持されるので、chroot したディレクトリ内に作業用ファイルを残す必要がなく、chroot監獄の設計が簡略化される。これを応用して、特権プログラムの脆弱性のある部分だけを chroot して実行することで不正なファイルアクセスを防ぐことができる。しかし、chroot したとしてもシステムコールができなくなるわけでもなく、ブロックデバイスへのアクセスを拒否するわけでもないため、特権を得た攻撃者にはあまり効果がない。
ハニーポット
chroot はネットワークサービスを実行する実システムのシミュレートにも使われる。しかし、chroot はシステムコールを仮想化しないし、ブロックデバイスや仮想ファイルシステム(Linux の /proc や /sys)へのアクセスをブロックしないので、ハニーポットに捉われた攻撃者がハニーポットであることに気づく可能性はある。

制限

一部のUNIXはこれらの制限の一部に対処した拡張を用意している(OSレベルの仮想化と呼ばれる)。

特筆すべき応用

fakechroot

chroot は root 権限が必要だが、LD_PRELOAD を使い、open() などにフックをかけて root 権限なしで chroot と同等のことを行う fakechroot がある。

関連項目

脚注

  1. ↑ How to break out of a chroot() jail
  2. ↑ “sshd_config(5) manual page” (2008年4月5日). 2008年4月27日閲覧。
  3. ↑ “Live upgrading many thousand of servers from an ancient Red Hat distribution to a 10 year newer Debian based one.” (2013年). 2018年8月13日閲覧。
  4. ↑ fakechroot/fakechroot - GitHub

参考文献