Linux名前空間を使用してchrootを実行するには?

Linux名前空間を使用してchrootを実行するには?

Linux名前空間について読んだ後に感じたことは、他の多くの機能の中でchrootを置き換えることです。例えば、この記事:

[名前空間] の他の目的には、[...] 単一ディレクトリ階層の一部としてプロセスを chroot() スタイルで分離することがあります。

ただし、たとえば、次のコマンドを使用してマウント名前空間を複製すると、元のルートツリー全体が引き続き表示されます。

unshare --mount -- /bin/bash

これで、元の名前空間と共有されていない新しい名前空間に追加のインストールを実行できることがわかっているため、これは分離を提供しますが、まだ同じルートです。たとえば、/etc2つの名前空間はまだ同じです。それでもルートディレクトリを変更する必要がありますかchroot、それとも他のオプションはありますか?

楽しみにしています。この問題回答は提供されますが、回答にはchroot再び、のみ使用されます。

編集#1

削除されたコメントがありましたpivot_root。なぜならこれは実際にlinux/fs/namespace.c、これは実際には名前空間の実装の一部です。unshareこれはルートディレクトリのみを使用して変更するmountことはできませんが、名前空間はよりスマートな独自のバージョンを提供することを示していますchrootchrootソースコードを読んだ後(例えば、セキュリティまたはより良い分離の観点から)、このアプローチの主なアイデア、つまり。

編集#2

これは重複ではありませんこの問題。答えのすべてのコマンドを実行した後、別の/tmp/tmp.vyM9IwnKuY(または同様)がありますが、ルートディレクトリはまだ同じです!

ベストアンサー1

マウントネームスペースを設定する前に入力すると、ホストchrootネームスペースが他のマウントによって変更されるのを避けることができます(たとえば、マウントネームスペース内で素晴らしく簡単なトリックでこれを使用/procできます。)chroot

理解するとメリットがあると思いますpivot_rootが、若干の学習曲線があります。文書はすべてを完全に説明しているわけではありません。man 8 pivot_root(シェルコマンドの場合)使用例がありますが。man 2 pivot_root(システムコールの場合)同じことを行い、サンプルCプログラムを含めるとより明確になります。

ピボット_ルートの使い方

また、マウントネームスペースを入力した直後に、mount --make-rslave /またはそれに対応する操作を実行する必要があります。それ以外の場合は、すべてのマウント変更を含む元の名前空間のマウントに伝播されますpivot_root。 :)

このコマンドを使用する場合は、基本アプリケーションとして文書化されていることにunshare --mount注意してください。mount --make-rprivateAFAICS これは無効なデフォルト値なので、本番コードでは使用したくありません。たとえば、この時点では、ejectホストネームスペースにマウントされているDVDまたはUSBで動作が停止します。 DVDまたはUSBは専用のインストールツリーにインストールされたままで、カーネルからDVDを取り出すことはできません。

これが完了したら、/proc使用するディレクトリをマウントできます。あなたと同じようにchroot

を使用する場合とは異なり、chroot新しいpivot_rootルートファイルシステムはマウントポイントにする必要があります。まだそうでない場合は、単にバインドマウントを適用してそれを満たすことができますmount --rbind new_root new_root

- を使用してpivot_rootumount以前のルートファイルシステムと-l/MNT_DETACHオプションを使用します。 (その必要はありませんumount -R。時間がかかることがあります。)。

技術的に言えば、使用には通常pivot_rootchroot2つのうちの1つ」は必要ありません。

によると、man 2 pivot_rootスワップマウント名前空間のルートとしてのみ定義されています。プロセスルートが指す物理ディレクトリを変更するように定義されていません。または現在の作業ディレクトリ(/proc/self/cwd)。そんなことが起こるするはい。しかし、カーネルスレッドを扱うためのヒントは次のとおりです。マニュアルページには、これが将来変更される可能性があることが示されています。

通常、次の順序が必要です。

chdir(new_root);            // cd new_root
pivot_root(".", put_old);   // pivot_root . put_old
chroot(".");                // chroot .

このシーケンスの位置はchroot別の微妙な詳細です。。マウントネームスペースを再配置することに焦点をpivot_root当てていますが、カーネルコードは設定された各プロセスのルートを見て、移動するルートファイルシステムを見つけることを示していますchroot

ピボットルートを使用する理由

pivot_root原則として、セキュリティと隔離のために使用するのが合理的です。私は次の理論について考えるのが好きです機能ベースのセキュリティ。必要な特定のリソースのリストを渡すと、プロセスは他のリソースにアクセスできなくなります。この場合、マウントネームスペースに渡されたファイルシステムについて話しています。このアイデアは通常、Linuxの「名前空間」機能に適用されます。たとえ私がうまく表現していませんでした。

chrootプロセスルートのみが設定されていますが、プロセスはまだ完全なマウントネームスペースを参照します。プロセスが実行権限を保持している場合は、chrootバックアップファイルシステムの名前空間を通過できます。で詳しく説明されているように、man 2 chroot「スーパーユーザーは次の方法で「chroot刑務所」から脱出できます。」

思考を刺激するもう一つの元に戻す方法chrootはですnsenter --mount=/proc/self/ns/mnt。これはおそらく原則に対するより強力な主張です。 nsenter/setns()マウントされた名前空間のルートからプロセスルートを再ロードする必要があります。...2つが異なる物理ディレクトリを参照している場合は機能しますが、カーネルのバグと見なすことができます。 (技術上の注意:ルートディレクトリには複数のファイルシステムが重複している可能性があります。最近インストールされた最上位のsetns()ファイルシステムを使用してください。)

これは、インストールネームスペースと「PIDネームスペース」を組み合わせることによって得られる利点の1つを示しています。 PID名前空間内にある場合は、制限されていないプロセスのマウント名前空間に入れることはできません。また、制限されていないプロセス(/proc/$PID/root)のルートディレクトリに入ることを防ぎます。もちろん、PID名前空間は外部プロセスを終了することも防ぎます。 :-).

おすすめ記事