これまでのところ、fakeroot を使用して、解凍/tar されたときにルートになる必要があるファイルに所有権を与えることができます。 私の質問は、どうして chown でそれができないのですか?
chown
だけではできないからです。 、少なくとも非ルートユーザーとしてではありません。 (また、root として実行している場合は、fakeroot
は必要ありません .) これが fakeroot
の要点です :root として実行されることを期待するプログラムを、root を必要とする操作が成功したふりをしながら、通常のユーザーとして実行できるようにします。
これは通常、パッケージをビルドするときに使用され、インストールされるパッケージのインストール プロセスがエラーなしで続行できるようにします (たとえ chown root:root
が実行されていても)。 、または install -o root
など)。 fakeroot
ファイルを与えるふりをした偽の所有権を記憶しているため、所有権を調べる後続の操作では、実際の所有権ではなくこれが表示されます。これにより、後続の tar
が許可されます たとえば、ルートが所有するファイルを保存するために実行されます。
Linux でフェイクルートは不要な権限昇格をどのように停止しますか? fakeroot が tar をだまして root が所有するファイルを作成できるのなら、SUID で同様のことをしてみませんか?
fakeroot
tar
をだまさない 何かを行う際に、ビルドをホストしているシステムにそれらの変更を反映させずに、ビルドが行いたい変更を保持します。 fakeroot
は必要ありません root と suid が所有するファイルを含む tarball を生成します。バイナリ evilbinary
がある場合 、tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
を実行中 、通常のユーザーとして、evilbinary
を含む tarball を作成します 、ルート所有者、および suid です。ただし、root として実行しない限り、その tarball を抽出してそれらの権限を保持することはできません。ここでは権限昇格はありません。 fakeroot
特権です de -エスカレーション ツール:通常のユーザーとしてビルドを実行できますが、ビルドが root として実行された場合の効果を保持し、それらの効果を後で再生できるようにします。効果を「実際に」適用するには、常に root 権限が必要です。 fakeroot
それらを取得する方法は提供していません。
fakeroot
の使い方を理解する より詳細には、一般的なディストリビューション ビルドには次の操作が含まれていると考えてください (他にも多数あります):
- root が所有するインストール ファイル
- ...
- まだ root が所有しているこれらのファイルをアーカイブして、抽出されたときに root が所有するようにします
root でない場合、最初の部分は明らかに失敗します。ただし、fakeroot
で実行している場合 、通常のユーザーとして、プロセスは次のようになります
- root が所有するインストール ファイル — これは失敗しますが、
fakeroot
成功したふりをして、変更された所有権を覚えている - ...
- まだ root が所有しているファイルをアーカイブします —
tar
の場合 (または使用されているアーカイバ) は、システムにファイルの所有権を尋ねますfakeroot
以前に記録した所有権に一致するように回答を変更します
したがって、実際に root として実行している場合と同じ結果を取得しながら、root にならずにパッケージのビルドを実行できます。 fakeroot
の使用 より安全です:システムはユーザーができないことは何もできないため、不正なインストール プロセスがシステムに損害を与えることはありません (ファイルに触れることを超えて)。
Debian ではビルド ツールが改善され、これが不要になり、fakeroot
なしでパッケージをビルドできるようになりました。 .これは dpkg
でサポートされています Rules-Requires-Root
で直接 ディレクティブ (rootless-builds.txt
を参照) ).
fakeroot
の目的を理解する 、および root として実行するかどうかのセキュリティ面を考慮すると、パッケージ化の目的を検討するのに役立つ場合があります。システム全体で使用するためにソースからソフトウェアをインストールする場合は、次の手順に従います。
ソフトウェアの一部をパッケージ化すると、2 番目の部分が遅れます。ただし、これを成功させるには、ソフトウェアをシステムではなくパッケージに「インストール」する必要があります。したがって、ソフトウェアをパッケージ化すると、プロセスは次のようになります。
<オール>ここで、ユーザーはパッケージをインストールしてプロセスを完了します。これは、root (または、適切な場所に書き込むための適切な特権を持つユーザー) として実行する必要があります。これは、遅延特権プロセスが実現される場所であり、特別な特権を必要とするプロセスの唯一の部分です。
fakeroot
上記のステップ 2 と 3 を支援するために、root として実行することなく、ソフトウェア インストール プロセスを実行し、その動作をキャプチャできるようにします。
番号。偽のルートを使用すると、アクセス許可の操作とレポート ツールを実行できます。一貫してレポートされます。ただし、実際にはこれらのアクセス許可は付与されません。あなたがそれらを持っているように見えます(偽物)。環境以外は何も変更しません。
ユーザーが設定できなかった所有権と許可を含むディレクトリ構造を作成したい場合は、tar、zip、またはその他のパッケージを使用すると便利です。
しない 本当に権限を昇格させますが、それは偽物です。他の方法ではできないこと (削除、書き込み、読み取り) を行うことはできません。それがなくても (理論的には) パッケージを作成できます。偽のレポートを受け取る可能性があります (ls
) なしで。
しないため、セキュリティ上の欠陥ではありません アクセスを許可するか、それなしではできないことをすべて許可します。特権なしで実行されます。 chown
への呼び出しをインターセプトするだけです 、 chmod
、など。何が起こったのかを記録することを除いて、それらを無操作にします。 stat
への呼び出しもインターセプトします。 他のコマンドが実行されたかのように、独自の内部データベースから権限と所有権を報告します。ディレクトリを圧縮すると、偽の権限が付与されるため、これは便利です。その後、root として解凍すると、パーミッションが有効になります。
以前に読み取り/書き込み可能でなかったファイルは、読み取り/書き込み可能のままではありません。作成された特別なファイル (デバイスなど) には、特別な権限はありません。 (別のユーザーへの) set-uid、ファイルは set-uid しません。その他の権限昇格は機能しません。
これは仮想マシンの一種です。一般に、仮想マシンは任意の環境/OS をシミュレートできますが、他のアプリケーションでは実行できないことをホストに対して実行することはできません。仮想マシン内では、何でもできるように見えます。セキュリティ システムを同じにすることも、異なるものにすることもできますが、仮想環境を実行するプロセスのユーザー/グループが所有するリソースとして、これはすべてホスト上に存在します。
ここにはすでに 2 つの優れた非常に詳細な回答がありますが、元のの導入段落を指摘しておきます。 fakeroot
マンページは実際にそれをかなり明確かつ簡潔に説明しています:
フェイクルート ファイル操作のためのルート権限を持っているように見える環境でコマンドを実行します。これは、ユーザーがルート権限/所有権を持つファイルを含むアーカイブ (tar、ar、.deb など) を作成できるようにする場合に役立ちます。 fakeroot なし 適切なパーミッションと所有権でアーカイブの構成ファイルを作成し、それらを圧縮するには、ルート権限が必要です。または、アーカイバーを使用せずにアーカイブを直接構築する必要があります。
Fakeroot を使用すると、root 以外のユーザーが root 所有のファイルを含むアーカイブを作成できます。これは、Linux でバイナリ ソフトウェア パッケージを生成および配布する際の重要な部分です。 fakeroot
なし 、実際のルートとして実行中にパッケージアーカイブを生成して、正しいファイル所有権と権限を含める必要があります。それはする セキュリティ上のリスクになります。信頼できない可能性のあるソフトウェアのビルドとパッケージ化は、root 権限で行うと大きな危険にさらされます。 fakeroot
に感謝 、権限のないファイルを持つ権限のないユーザーは、ルート所有権を持つファイルを含むアーカイブを引き続き生成できます.
しかし、これはセキュリティ リスクではありません。なぜなら、アーカイブには 実際に ファイルが抽出されるまで、ルートが所有します .その場合でも、特権ユーザーによって実行された場合、ファイルは root 権限がそのままの状態でのみ抽出されます。そのステップ — fakeroot
-「ルート」ファイルを含む補助アーカイブは、特権ユーザーによって抽出されます — 「偽の」ルートが最終的に本物になる場所です。その時点まで、実際の root 権限が取得またはバイパスされることはありません。
メモ
<オール>fakeroot
になりすますいくつかの競合他社/模倣者を生み出しました インストールされている場合、fakeroot-ng
を含む と pseudo
.しかし、IMHO どちらの「模倣者」の man ページも、この質問の要点に到達することについてほぼ明確ではありません。オリジナルの唯一無二の fakeroot
にこだわる OG
他のディストリビューション/パッケージング システムは、単純に しない ことでこれを克服しています。 パッケージアーカイブでルート所有権を使用します。たとえば、Fedora では、fakeroot
を必要とせずに、特権のないユーザーがソフトウェアをコンパイル、インストール、およびパッケージ化できます。 .それはすべてユーザーの $HOME/rpmbuild/
内で行われます スペース、および make install
のような通常特権の手順 リダイレクトされる (--prefix
などのメカニズムを介して) と DESTDIR
) $HOME/rpmbuild/BUILDROOT/
に 一種の「fakechroot」スペースと見なすことができる階層 (実際に fakechroot
を使用せずに) ).
しかし make install
の間でも 、すべてが権限のないユーザーとして実行され、所有されます。抽出されたファイルの所有権と権限は root,root
に設定されます と 0644
(または 0755
パッケージ定義でオーバーライドされない限り (.spec
) ファイルの場合、それらは最終的なパッケージ内にメタデータとして保存されます。rpm パッケージの (特権付きの) インストール プロセスまで実際にはアクセス許可または所有権が適用されないため、root も fakeroot
も適用されません。 梱包時に必要です。しかし fakeroot