Linux名前空間でchrootを実行する方法は?


14

Linuxの名前空間について読んだ後、他の多くの機能の中でも、chrootに代わるものであるという印象を受けました。たとえば、この記事では

[名前空間の]その他の用途には、単一ディレクトリ階層の一部へのプロセスの[...] chroot()スタイルの分離が含まれます。

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

unshare --mount -- /bin/bash

元のネームスペースと共有されていない新しいネームスペースで追加のマウントを実行できるようになったことを理解しているため、これにより分離が可能になりますが、ルート/etcは同じです。たとえば、両方のネームスペースで同じです。chrootルートを変更する必要がありますか、それとも代替手段がありますか?

私はこの質問が答えを提供することを期待していましたが、答えはchroot再びのみを使用します。

編集#1

に言及した削除済みのコメントがありましたpivot_root。これは実際にはの一部でlinux/fs/namespace.cあるため、実際には名前空間の実装の一部です。これはのみでルートディレクトリを変更することを示唆しているunsharemount、より巧妙な- -のバージョンで可能ではありませんが、名前空間は自身を提供しますchroot。それでもchroot、ソースコードを読み取った後でも(セキュリティやより良い分離などの意味で)、それと根本的に異なるこのアプローチの主要なアイデアは得られません。

編集#2

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


違いについてpivot_rootchroot:私はドッカーソースを見ていたし、それが実行に失敗した場合ことを発見しpivot_root、それがバックに落ちchroot、すなわちこれらのメカニズムは、コンテナ化の目的のために機能的に少なくとも類似していると考えられています。
ダニラカイバー

回答:


13

を設定する前にマウント名前空間を入力するchrootと、たとえば、などの追加のマウントでホスト名前空間が乱雑になるのを避けることができます/procchrootマウントネームスペース内で、素敵でシンプルなハックとして使用できます。

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

pivot_rootの使用方法

マウント名前空間を入力した直後に、必要なものmount --make-rslave /または同等のものも必要です。それ以外の場合、すべてのマウント変更は、を含む元のネームスペースのマウントに伝播しますpivot_root。あなたはそれを望まない:)。

unshare --mountコマンドを使用した場合mount --make-rprivate、デフォルトで適用されるように文書化されていることに注意してください。AFAICSこれは不適切なデフォルトであり、本番コードではこれは望ましくありません。たとえば、この時点ejectで、ホスト名前空間にマウントされたDVDまたはUSBでの作業が停止します。DVDまたはUSBはプライベートマウントツリー内にマウントされたままになり、カーネルではDVDを取り出すことができません。

それが済んだら、/proc使用するディレクトリなどをマウントできます。あなたと同じ方法chroot

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

使用pivot_root-その後、umount古いルートファイルシステム、-l/ MNT_DETACHオプション。(必要ありませんumount -R。これには時間がかかります。

技術的には、pivot_root一般的に使用することも使用する必要がありchrootます。「どちらでもない」ではありません。

によると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を使用する理由

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

chrootプロセスルートのみを設定しますが、プロセスはまだ完全なマウント名前空間を参照します。プロセスが実行する特権を保持している場合、プロセスはchrootファイルシステムの名前空間を遡って戻ることができます。で詳しく説明されているようにman 2 chroot、「スーパーユーザーは...によって「chroot jail」から脱出できます」。

元に戻す別の考えられる方法chrootnsenter --mount=/proc/self/ns/mntです。これはおそらく、原理に対するより強力な議論です。 nsenter/ setns()マウントネームスペースのルートからプロセスルートを必ず再ロードします ... 2つが異なる物理ディレクトリを参照している場合に機能するという事実は、カーネルバグと見なされる場合があります。(テクニカルノート:複数のファイルシステムがルートで互いの上にマウントされる可能性があります; setns()一番上に、最近マウントされたものを使用します)。

これは、マウント名前空間を「PID名前空間」と組み合わせる利点の1つを示しています。PID名前空間内にいると、制限のないプロセスのマウント名前空間に入ることができなくなります。また、制限のないプロセスのルートに入ることも防ぎます(/proc/$PID/root)。そしてもちろん、PID名前空間は、その外部にあるプロセスを強制終了することも防ぎます:-)。


これはすでに大いに役立ちます。それでも、「名前空間の最上部のマウント」とはどういう意味かわかりません。それを変更する方法はありますか?
コアロ

1
@koalo編集:-)。ps「make-rslave」/「make-rprivate」にfstabが必要な理由がわかりません。systemdにのスイッチroot.cだけでないmount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL)
sourcejedi

1
@koalo、そしてLinuxカーネル開発者は、4番目の名前を付けたときに「rootfs」を使用しました:-P。unix.stackexchange.com/questions/152029/…–
sourcejedi

1
@sourcejediによるこの答えと他の人が非常に役立っている、私は尋ねただろう「はpivot_rootを:忙しくないようumountのput_oldが缶」が、答えはすでにここにいた、力は動作しませんように怠惰にumount -l ./oldroot
earcam

1
最近、pivot_root(2)のマニュアルページが更新され、いくつかの明確化が行われ、現在ではサンプルプログラムが含まれています。これを反映するように回答を更新する必要がありますか?マニュアルページでは、ナイスpivot_root(".", ".")トリックについても説明しています。これはpivot_root、ほとんどの状況で実際に使用する最も簡単な方法です(chroot不要)。
フィリップウェンドラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.