web-dev-qa-db-ja.com

Linuxのユーザースペースで(rootでなくても)chrootの効果を実現するにはどうすればよいですか?

目標は、ホストLinuxシステム内の置き換えられた(再配置された)ディストリビューション(/がグローバル/と一致してはならない)にプログラムをインストールして実行することです。プログラムは、別の/を使用するようには適合されていません。

fakechrootは、システムコールのレベルで動作する代わりにライブラリ置換を採用しているため、完全なソリューションではありません(したがって、静的にリンクされたバイナリには適していません)。

解決策は、おそらくptraceまたは namespaces(unshare) のいずれかに基づいている必要があります。

ptraceベースのソリューションは、おそらく名前空間/非共有ベースよりも効率が低くなります(ただし、後者のテクノロジは最先端であり、十分に検討されていない可能性があります)。

ptraceベース

UMView

Ptrcedベースのソリューションに関しては、 https://stackoverflow.com/a/1019720/94687 のコメントのおかげで、UMViewを発見しました:

リンクされたドキュメントでは、ホストfsの「コピーオンライトビュー」を作成する方法について説明しています。これは、chrootを実行するのとまったく同じではありません。 umviewで/ -substitutionを達成する方法についての正確な説明は、私の質問への回答に含まれていると便利です(これを行う方法がわかったら、1つ書いてください!)。

umviewはUbuntuとDebianに含まれているため、オープンソースである必要があります-- http://packages.ubuntu.com/lucid/umview

「制限プログラム」

別の実装については、 http://www.cs.vu.nl/~rutger/publications/jailer.pdfhttp://www.cs.vu.nl/~)で説明されています。 guido/mansion/publications/ps/secrypt07.pdf

それらには、ルート変更ポリシールールCHRDIRがあり、その効果はchrootと同様です。 (セクション「投獄方針」)

ただし、ソースコードを公開していない可能性があります(部分的に変更されたstraceに基づいています http://www.liacs.nl/~wichert/strace/ -セクション「実装」)...

ジョーディ

Geordi( http://www.eelis.net/geordi/https://github.com/Eelis/geordi )は、おそらく、必要な書き換えを行うために変更できます。投獄されたプログラムのシステムコールへのファイル引数の。

プルート

PRoot は、このためにすぐに使用できるptraceベースのツールです。 http://proot.me/

chroot相当

特定のLinuxディストリビューション内でコマンドを実行するには、ゲストrootfsへのパスをprootに指定し、その後に目的のコマンドを指定します。以下の例では、プログラムcatを実行して、ファイルの内容を出力します。

proot -r /mnt/slackware-8.0/ cat /etc/motd

Welcome to Slackware Linux 8.0

何も指定されていない場合、デフォルトのコマンドは/ bin/shです。したがって、インタラクティブシェルとそのすべてのサブプログラムを制限する最短の方法は次のとおりです。

proot -r /mnt/slackware-8.0/

$ cat /etc/motd
Welcome to Slackware Linux 8.0

非共有ベース

Linuxカーネルでのuser_namespacesのサポート 質問があったときから、より成熟しています。これで、次のようにchrootを使用して、通常どおりunshareを実行して遊ぶことができます nshareでchrootをシミュレート

unshare --user --map-root-user --mount-proc --pid --fork
chroot ......
su - user1

ser-Mode Linux を試すことができます。このようなカーネルをビルドするためのコードは現在主流のソースにあり、リンクしたページで(古い)プリコンパイル済みビルドを見つけることができます。

1
Billy