を設定する前にマウント名前空間を入力するchroot
と、たとえば、などの追加のマウントでホスト名前空間が乱雑になるのを避けることができます/proc
。chroot
マウントネームスペース内で、素敵でシンプルなハックとして使用できます。
理解することには利点があると思いますが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」から脱出できます」。
元に戻す別の考えられる方法chroot
はnsenter --mount=/proc/self/ns/mnt
です。これはおそらく、原理に対するより強力な議論です。 nsenter
/ setns()
マウントネームスペースのルートからプロセスルートを必ず再ロードします ... 2つが異なる物理ディレクトリを参照している場合に機能するという事実は、カーネルバグと見なされる場合があります。(テクニカルノート:複数のファイルシステムがルートで互いの上にマウントされる可能性があります; setns()
一番上に、最近マウントされたものを使用します)。
これは、マウント名前空間を「PID名前空間」と組み合わせる利点の1つを示しています。PID名前空間内にいると、制限のないプロセスのマウント名前空間に入ることができなくなります。また、制限のないプロセスのルートに入ることも防ぎます(/proc/$PID/root
)。そしてもちろん、PID名前空間は、その外部にあるプロセスを強制終了することも防ぎます:-)。
pivot_root
とchroot
:私はドッカーソースを見ていたし、それが実行に失敗した場合ことを発見しpivot_root
、それがバックに落ちchroot
、すなわちこれらのメカニズムは、コンテナ化の目的のために機能的に少なくとも類似していると考えられています。