これまでのところ、fakerootを使用して、unzip / tarされたときにルートである必要があるファイルに所有権を与えるということを収集できます。私の質問は、なぜあなたはchownでそれができないのですか?
chown
少なくともを使ってそれを行うことはできないので、少なくとも非rootユーザーとしてはできません。(また、rootとして実行している場合は、必要ありませんfakeroot
。)これfakeroot
が、rootを必要とする操作が成功するふりをしながら、rootとして実行されるプログラムを通常のユーザーとして実行できるようにするためのポイントです。
これは通常、パッケージをビルドするときに使用され、インストールされているパッケージのインストールプロセスがエラーなしで実行できるようにします(実行する場合でもchown root:root
、またはinstall -o root
など)。fakeroot
ファイルを与えるふりをした偽の所有権を覚えているので、所有権を見る後続の操作は、実際の所有権の代わりにこれを見る。これによりtar
、たとえば、rootが所有するファイルを以降の実行で保存できます。
Linuxでfakerootはどのようにして不要な特権エスカレーションを阻止しますか?fakerootがtarをだましてrootが所有するファイルを作成できる場合、SUIDで同様のことをしてみませんか?
fakeroot
だましていないtar
何もに、それはビルドがこれらの変更は、ビルドをホストしているシステムに影響を取るせることなく行いたい変更内容を保存します。fakeroot
rootとsuidが所有するファイルを含むtarballを作成する必要はありません。バイナリを持っている場合、通常のユーザーとしてをevilbinary
実行するとtar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
、を含むtarballが作成evilbinary
されます。ただし、rootとして実行しない限り、そのtarballを抽出してそれらの権限を保持することはできません。ここには特権の昇格はありません。fakeroot
権限のあるデ-エスカレーションツール:通常のユーザーとしてビルドを実行できますが、ビルドがルートとして実行された場合の効果を保持し、それらの効果を後で再生できます。「本当の」効果を適用するには、常にルート権限が必要です。fakeroot
それらを取得する方法を提供しません。
の使用をfakeroot
より詳細に理解するために、一般的なディストリビューションビルドには次の操作が含まれることを考慮してください(他の多くの操作と同様)。
- ルートが所有するインストールファイル
- ...
- まだルートが所有しているファイルをアーカイブし、抽出されたときにルートが所有するようにします
ルートでない場合、最初の部分は明らかに失敗します。ただし、fakeroot
通常のユーザーとしてで実行すると、プロセスは次のようになります。
- ルートが所有するインストールファイル—これは失敗しますが、
fakeroot
成功するふりをして、変更された所有権を記憶します
- ...
- まだルートが所有しているファイルをアーカイブします—
tar
(または使用されているアーカイバが)ファイルの所有権をシステムに尋ねるとき、fakeroot
以前に記録した所有権と一致するように回答を変更します
したがって、実際にルートとして実行している場合と同じ結果を取得しながら、ルートにならずにパッケージビルドを実行できます。使用する方fakeroot
が安全です。システムはユーザーが実行できないことを実行できないため、不正なインストールプロセスがシステムに損害を与えることはありません(ファイルに触れる以外)。
Debianでは、これを必要としないようにビルドツールが改善されており、なしでパッケージをビルドfakeroot
できます。これはdpkg
、Rules-Requires-Root
ディレクティブを使用して直接サポートされます(を参照rootless-builds.txt
)。
の目的fakeroot
、およびルートとして実行するかどうかのセキュリティの側面を理解するには、パッケージングの目的を検討すると役立つ場合があります。システム全体で使用するためにソースからソフトウェアをインストールする場合、次の手順を実行します。
- ソフトウェアをビルドします(特権なしで実行できます)
- ソフトウェアをインストールします(rootとして、または少なくとも適切なシステムの場所への書き込みを許可されたユーザーとして実行する必要があります)。
ソフトウェアをパッケージ化すると、2番目の部分が遅れます。しかし、そうするためには、システムではなくパッケージにソフトウェアを「インストール」する必要があります。したがって、ソフトウェアをパッケージ化すると、プロセスは次のようになります。
- ソフトウェアをビルドします(特別な特権なし)
- ソフトウェアをインストールするふりをする(これも特別な特権なし)
- ソフトウェアのインストールをパッケージとしてキャプチャする(同上)
- パッケージを利用可能にする(同上)
これで、ユーザーはパッケージをインストールしてプロセスを完了します。これは、rootとして実行する必要があります(または、適切な場所に書き込むための適切な特権を持つユーザー)。これは、遅延特権プロセスが実現される場所であり、特別な特権を必要とするプロセスの唯一の部分です。
fakeroot
ルートとして実行せずにソフトウェアインストールプロセスを実行し、その動作をキャプチャできるようにすることで、上記の手順2および3を支援します。