ルートにならずにプロセスを「投獄」する方法


26

ルートだったら、ダミーのユーザー/グループを作成し、それに応じてファイルのアクセス許可を設定し、そのユーザーとしてプロセスを実行できます。しかし、私はそうではないので、ルートにならずにこれを達成する方法はありますか?


1
@alex:複数のシミュレーションを(異なるディレクトリで)実行するスクリプトがあり、プログラミングがどれほど悪くても自分のディレクトリ内のファイルにしかアクセスできず、他のシミュレーションの出力を誤って変更しないようにしたい
Tobias Kienzler

2
@トビアス:私はあなたのポイントを得た。 chroot自然にそこに収まるでしょうが、それでもあなたはルートではありません。
アレックス

1
selinux、apparmor、およびgrsecurity がこれを実行できる可能性があると思いますが、私にはわかりません。しかし、それらがシステム管理者によって利用可能または設定されていない場合、あなたはそれでsolです。
xenoterracide

4
このような質問は、長年にわたって私が疑問に思うものでした。rootになることなく、ユーザーの許可の一部を破棄してプロセスを実行できるようにする、つまり、プロセスをユーザー設定の「jail」に制限して、プロセスを均等にするユーザーが持っているよりも少ない権利。通常のユニックスがこれを標準的に提供していないのは残念です!
imz-イヴァンザカリヤシェフ

2
システム管理者に2番目のユーザーアカウントの作成を依頼してください。
ローレンス

回答:


23

注目に値するより多くの回答を持つより類似したQ:

注:回答のいくつかは、ここでまだ言及されていない特定の解決策を示しています。

実際には、異なる実装にかなりの数の投獄のツールがありますが、それらの多くは、いずれかの設計によって確保されていない(ようにfakerootLD_PRELOADベース)、または完了していない(ようにfakeroot-ngptraceベース)、または(ルートを必要とするchroot、またはplashで述べたfakechroot警告ラベル)。

これらは単なる例です。オペレーティングシステムレベルの仮想化の実装で、これら2つの機能(「信頼できる」、「設定するのにルートが必要ですか?」)を示して、それらをすべて並べて表示することを考えました。

一般に、そこの答えは、記述された可能性の範囲全体をカバーしています。

仮想マシン/ OS

カーネル拡張(SELinuxなど)

  • (ここのコメントに記載)、

chroot

Chrootベースのヘルパー(ただし、chrootrootが必要なため、setUID rootである必要があります。またはchroot、分離されたネームスペースで動作する可能性があります。以下を参照してください):

[それらについてもう少し説明します!]

既知のchrootベースの分離ツール:

  • そのコマンドhsh-runハッシュhsh-shell。(Hasherは、安全で繰り返し可能な方法でソフトウェアを構築するために設計されました。)
  • 別の答えで言及されたschroot
  • ...

ptrace

別の信頼できる分離ソリューション(ベースのソリューションに加えseccomp)はptrace、次のマンページで説明されているように、完全なsyscall-interception through ですfakeroot-ng

以前の実装とは異なり、fakeroot-ngは、fakeroot-ngの「サービス」を使用するかどうかに関してトレースされたプロセスに選択肢を残さないテクノロジーを使用します。プログラムを静的にコンパイルし、カーネルを直接呼び出し、独自のアドレス空間を操作することはすべて、LD_PRELOADベースのプロセス制御をバイパスするために簡単に使用できる手法であり、fakeroot-ngには適用されません。理論的には、追跡されたプロセスを完全に制御できるようにfakeroot-ngを成形することができます。

理論的には可能ですが、まだ行われていません。Fakeroot-ngは、トレース対象のプロセスに関する特定の「適切に動作する」前提を想定しています。これらの前提を破るプロセスは、完全にエスケープしない場合でも、fakeroot-によって課される「偽」環境の少なくともng。そのため、fakeroot-ngをセキュリティツールとして使用することは強く警告されます。プロセスが(誤ってではなく)意図的にfakeroot-ngの制御を逃れることができると主張するバグレポートは、「バグではない」として閉じられるか、または優先度が低いとしてマークされます。

このポリシーは将来再考される可能性があります。ただし、当面は警告されています。

それでも、それを読むことができるように、fakeroot-ngそれ自体はこの目的のために設計されていません。

(ところで、なぜ彼らはseccomp-basedでなくChromium の-basedアプローチを使うことを選んだのだろうptrace...)

上記に挙げられていないツールの中で、私はGeordiを自分で書きました。これは、制御プログラムがHaskellで書かれていることが好きだったからです。

既知のptraceベースの分離ツール:

seccomp

分離を実現する1つの既知の方法は、Google Chromiumで使用されいるseccompサンドボックスアプローチです。しかし、このアプローチでは、「インターセプトされた」ファイルアクセスおよび他のシステムコールの一部(許可されたもの)を処理するヘルパーを記述することを想定しています。また、もちろん、syscallsを「インターセプト」してヘルパーにリダイレクトするように努力します(おそらく、制御されたプロセスのコードでインターセプトされたsyscallsを置き換えるようなことさえ意味するでしょう;それで、それは聞こえません非常にシンプルにするために、あなたが興味を持っているなら、あなたは私の答えよりも詳細を読む方が良いでしょう。

関連情報(ウィキペディアから):

(最後の項目はseccomp、Chromium以外の一般的なソリューションを探している場合に興味深いようです。「seccomp-nurse」の著者から読む価値のあるブログ投稿もあります:サンドボックスソリューションとしてのSECCOMP?

「seccomp-nurse」プロジェクトのこのアプローチの図:

                      ここに画像の説明を入力してください

Linuxの将来で可能な「柔軟な」seccomp?

2009年には、Linuxカーネルにパッチを適用してseccompモードの柔軟性を高めるための提案も表示されていました。つまり、「現在必要な多くのアクロバットを回避できるようにする」ためです。(「アクロバット」は投獄され、プロセスのと投獄過程で、おそらく無実のシステムコールを置き換えるの代わりに、多くの可能性が無実のシステムコールを実行するために持っているヘルパーを書くの合併症を参照)アンLWNの記事はここまで書きました:

出てきた提案の1つは、seccompに新しい「モード」を追加することでした。APIは、アプリケーションごとにセキュリティ要件が異なる可能性があるという考えで設計されました。適切な制限を指定する「モード」値が含まれます。元のモードのみが実装されていますが、他のモードを確実に追加できます。開始プロセスで許可するシステムコールを指定できる新しいモードを作成すると、Chromeサンドボックスなどの状況で機能がより便利になります。

GoogleのAdam Langleyが、まさにそれを行うパッチを公開しました。新しい「モード2」実装は、アクセス可能なシステムコールを記述するビットマスクを受け入れます。それらの1つがprctl()である場合、サンドボックスコードはそれ自体のシステムコールをさらに制限できます(ただし、拒否されたシステムコールへのアクセスを復元することはできません)。すべては、サンドボックス開発者の作業を楽にする合理的なソリューションのように見えます。

とはいえ、議論が他の可能性に移ったため、このコードは決してマージされないかもしれません。

この「柔軟なseccomp」は、複雑なヘルパーを作成する必要なく、Linuxの可能性をOSに必要な機能を提供することに近づけます。

(基本的にこの回答と同じ内容のブログ投稿:http : //geofft.mit.edu/blog/sipb/33。)

名前空間(unshare

名前空間を介した分離(- unshareベースのソリューション)-ここでは言及しません-たとえば、マウントポイントの共有解除(FUSEと組み合わせますか?)

実装が完了すると、名前空間の詳細がわかります(この分離手法はnme "Linux Containers"または "LXC"でも知られていますよね?..):

「名前空間の全体的な目標の一つは、コンテナの実装、軽量仮想化(だけでなく、他の目的)のためのツールをサポートすることです」

新しいユーザー名前空間を作成して、「プロセスがユーザー名前空間の外部で通常の非特権ユーザーIDを持ち、同時に名前空間内でユーザーIDが0になるようにすることも可能です。これは、プロセスが完全なルート特権を持つことを意味しますユーザー名前空間内の操作には使用できますが、名前空間外の操作には権限がありません」。

これを行う実際の作業コマンドについては、以下の回答を参照してください。

および特別なユーザー空間のプログラミング/コンパイル

しかし、もちろん、望ましい「jail」保証は、ユーザー空間でのプログラミングによって実装可能です(OSからこの機能を追加サポートすることなく、多分、この機能がOSの設計の最初の場所に含まれていないのかもしれません) ); 多かれ少なかれ合併症を伴う。

前述のptrace-または-seccompベースのサンドボックス化は、他のプロセスを制御するサンドボックスヘルパーを記述することにより、「ブラックボックス」、任意のUnixプログラムとして扱われることにより、保証を実装するいくつかのバリエーションと見ることができます。

別のアプローチとして、禁止する必要のある効果を考慮できるプログラミング手法を使用することもできます。(これは、その後、プログラムの書き込み、誰でなければならない。彼らはもうブラックボックスではありません。)1に言及するには、使用して純粋なプログラミング言語のような(副作用なしにプログラムにあなたを強制する)Haskellのは、単純に、すべての影響を行います明示的なプログラムであるため、プログラマは、許可されていない効果がないことを簡単に確認できます。

おそらく、Javaなどの他の言語でのプログラミングにはサンドボックス機能が利用できると思います。


このトピックに関する情報を蓄積しているページのいくつかは、そこの回答でも指摘されています。


Rootless GoboLinuxもオプションの可能性があります...
トバイアスKienzler

@tobiasしかし、Rootless Gobolinuxは、ユーザーが作成したプログラムが外部環境にアクセスしないことを保証しますか?..
imz-Ivan Zakharyaschev

1
そうではありません-私は何らかの方法で「ローカル」ルートユーザーになり、そのようなプロセスの仮想ユーザーを単純に作成できるという誤解の下にありました-それを使用することは可能かもしれませんがchroot、それはおそらく必要です本当のroot権限...
トビアスKienzler

8

これは、unix許可モデルの基本的な制限です。rootのみが委任できます。

仮想マシンを実行するためにrootになる必要はありません(すべてのVMテクノロジーに当てはまるわけではありません)が、これは重いソリューションです。

ユーザーモードLinuxは、比較的軽量のLinux-on-Linux仮想化ソリューションです。設定はそれほど簡単ではありません。ルートパーティション(ディレクトリ内)に、少なくともブートに必要な最小限のもの(ディレクトリ内のいくつかのファイル/etc/sbin/initおよびその依存関係、ログインプログラム、シェル、ユーティリティ)を設定する必要があります。


1

LD_PRELOAD特定のファイルへのアクセスをインターセプトすることである程度の運が得られると思いますが、これは本当に難しいかもしれません。


Google Chromiumのseccompサンドボックスは、より信頼性の高いこと、つまり、syscallインターセプトを効果的に行います。- unix.stackexchange.com/questions/6433/...
IMZ -イワンZakharyaschev

何かを傍受しようとすることと(Chromiumの場合のように)サンボックス化との違いは、隔離の保証です。
imz-イヴァンザカリヤシェフ

1
傍受はLD_PRELOAD信頼できません(回避可能)が、傍受はptrace可能です。
imz-イヴァンザカリヤシェフ

1
簡単な例を< joey.kitenet.net/blog/entry/fakechroot_warning_label >に示します。これは、LD_PRELOADベースのソリューションがセキュリティ対策として信頼できないことを示しています。
imz-イヴァンザカリヤシェフ

0

完全なリストから追加するだけです:

  • fakeroot(debian package maintenerから):「フレンドリーな」ツールでパッケージを構築することを目指しています。これは完全な分離ではありませんが、異なるユーザー、偽のデバイス、およびその他の特別な擬似ファイルでパッケージを構築するのに役立ちます。

  • fakechroot(fakerootを使用)。このプログラムには多くのバグがあります。たとえば、「/ etc / hosts」はglibcでハードコーディングされています。このツールでは変更できません。

  • qemu:Linuxカーネルをコンパイルする必要がありますが、結果は非常に高速であり、これは実際のルート特権を持つ「偽の」(つまり仮想)マシンです。任意のブートイメージをビルドおよびマウントできます。


0

Firejailは、多くのオプションと非常に柔軟なルートアクセスの有無にかかわらず、あらゆるプロセスを投獄するための素晴らしいツールです。


2
firejailの使用方法についてもう少し詳しく説明してください。そのリンクが機能しなくなると、回答情報の内容はユーティリティの名前だけになります。(ディストリビューションで利用可能なパッケージである場合、ここで使用方法などを含めてください)。
アントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.