chrootとは
`chroot`は、
[UNIX]]系オペレーティングシステム]における重要な機能の一つで、プロセスが参照するルートディレクトリを変更する操作を指します。この操作により、特定のプロセスとその子プロセスは、システム全体の[[ファイルシステムの一部のみにアクセスを制限されます。`chroot`によって変更されたディレクトリは「chroot監獄」や「模擬ルート」とも呼ばれ、その内部でのみプロセスが動作する環境が作られます。
`chroot`は、
システムコール`chroot(2)`とコマンド`chroot(8)`として実装されており、その起源は1979年のUnix Version 7に遡ります。その後、1982年に
ビル・ジョイによってBSDに導入され、インストールやビルドシステムのテストに利用されるようになりました。
chrootの主な用途
`chroot`は、OSの仮想化された環境を作成するために広く利用されています。以下に主な用途を説明します。
テストと開発
開発中のソフトウェアを、実際のシステムに影響を与えずにテストする環境を構築するのに役立ちます。これにより、安全にソフトウェアの評価やデバッグが可能です。
依存関係制御
ソフトウェアのビルドに必要な最小限の
ライブラリだけを用意した環境でビルド作業を行うことで、意図しない
ライブラリがリンクされるのを防ぎ、ビルド環境をクリーンに保つことができます。
互換性
古いソフトウェアや異なるABIを使用するソフトウェアを動作させる際に、`chroot`環境で実行することで、互換性の問題を解決できる場合があります。特に、動的リンクされる
ライブラリが名前空間の衝突を起こす場合に有効です。
システム復旧
システムが起動できなくなった場合に、別の起動媒体からシステムを起動し、`chroot`を使って破損した環境を復旧することが可能です。また、OSのインストール時にも、初期段階で`chroot`を利用してルートディレクトリを設定します。
権限不要の仮想化
通常、仮想化にはroot権限が必要ですが、`chroot`は一部の限定的なシステム(AndroidアプリのUserLandやtermuxなど)でroot権限なしに利用できます。
特権分離
`chroot`されたプロセスは、開いている
ファイル記述子を引き継ぐため、作業用ファイルを`chroot`したディレクトリ内に置く必要がありません。これにより、特権プログラムの脆弱性のある部分を隔離し、不正なアクセスを防ぐことができます。しかし、`chroot`は
システムコールを制限するものではないため、特権を得た攻撃者に対しては効果が限定的です。
`chroot`は、ネットワークサービスをシミュレートする
ハニーポットの構築にも使用できます。しかし、`chroot`は
システムコールを仮想化しないため、
ハニーポットであると気づかれる可能性があります。
chrootの制限事項
`chroot`には、いくつかの制限事項があります。
ファイル配置の必要性: `chroot`された環境でプログラムを正常に起動するには、一時ファイル、設定ファイル、共有ライブラリなどを、`chroot`されたディレクトリ内に適切に配置する必要があります。これにより、`chroot`を汎用的なサンドボックス機構として使用するのが難しくなります。
root権限が必要: `chroot`を実行できるのは
スーパーユーザーのみです。これは、悪意のあるユーザーが偽の`chroot`環境内で`setuid`プログラムを実行するのを防ぐためです。そのため、一般ユーザーが信頼できないアプリケーションをテストするサンドボックスとしては使用できません。
特権ユーザーへの効果は限定的: `chroot`は、特権ユーザーによる意図的な改変を防ぐものではありません。`chroot`されたスーパーユーザーのプロセスは、特権を制限されません。また、`chroot`のコンテキストが正しくスタックされない場合があり、特権を持つユーザーが`chroot`から抜け出すことが可能です。
リソース制限がない: `chroot`は
入出力、
帯域幅、ディスク容量、CPU時間などのリソースを制限する機能はありません。これらの制限を行うには、
OSレベルの仮想化が必要になります。また、ネットワーキングやプロセス制御も`chroot`されたプログラムから
システムコールを通じて利用できます。
chrootの拡張
これらの制限を一部解決するために、一部の
UNIXシステムでは拡張機能が用意されています。例えば、
Solaris Containers (Solaris)
cgroups, LXC, OpenVZ, Parallels Virtuozzo Containers, Linux-VServer, Linux FreeVPS (Linux)
FreeBSD jail (FreeBSD)
sysjail (NetBSD, OpenBSD)
chrootの応用例
`chroot`は、様々なソフトウェアやシステムで利用されています。
メール転送エージェント Postfix: ヘルパープログラムを個別に`chroot`環境で実行し、パイプライン化しています。
Debian/Ubuntu/SUSEのパッケージビルド: パッケージ間の意図しない依存関係を洗い出すために、ビルド環境を`chroot`で隔離しています。
FTPサーバ: 信頼できないFTPクライアントからのアクセスを`chroot`環境に制限することで、セキュリティを強化しています。
OpenSSHデーモン: 特権分離機能が有効になっている場合、各クライアントの認証前トラフィックを処理する非特権ヘルパープロセスを空のディレクトリに`chroot`で実行します。
Google: アプリケーションを`chroot`内で実行し、親プロセスのrootパーティションの変更がアプリケーションに影響を与えないようにしています。
fakechroot
`chroot`はroot権限が必要ですが、`LD_PRELOAD`を利用して`open()`などのシステムコールをフックすることで、root権限なしに`chroot`と同等の環境を構築する`fakechroot`というツールも存在します。
関連項目
cgroups
参考文献
chroot(2) FreeBSD版システムコールのmanページ
chroot(2) Linux版
システムコールのmanページ (JM Project)
chroot(8) FreeBSD版コマンドのmanページ(英語)
chroot(1L) GNU版コマンドのmanページ (JM Project)
chroot(1M) コマンド Solaris 10 Reference Manual Collection(英語)
chroot(1M) コマンド man page(HP-UX リファレンス)