Jusqu'à présent, ce que je peux comprendre, c'est que fakeroot est utilisé pour donner la propriété à un fichier qui doit être root lorsqu'il est décompressé / taré. Ma question, est pourquoi ne pouvez-vous pas simplement faire ça avec chown?
Parce que vous ne pouvez pas le faire avec chown
, du moins pas en tant qu'utilisateur non root. (Et si vous exécutez en tant que root, vous n'avez pas besoin fakeroot
.) C'est tout l'intérêt de fakeroot
: permettre aux programmes qui s'attendent à être exécutés en tant que root de s'exécuter en tant qu'utilisateur normal, tout en prétendant que les opérations nécessitant la racine réussissent.
Ceci est généralement utilisé lors de la construction d'un package, afin que le processus d'installation du package en cours d'installation puisse se poursuivre sans erreur (même s'il s'exécute chown root:root
, ou install -o root
, etc.). fakeroot
se souvient de la fausse propriété qu'il prétendait donner aux fichiers, donc les opérations ultérieures qui regardent la propriété voient cela au lieu de la vraie; cela permet aux tar
exécutions suivantes, par exemple, de stocker des fichiers appartenant à root.
Comment fakeroot arrête-t-il les escalades de privilèges indésirables sur Linux? Si fakeroot peut inciter tar à créer un fichier appartenant à root, pourquoi ne pas faire quelque chose de similaire avec SUID?
fakeroot
ne tar
fait rien pour faire quoi que ce soit, il préserve les modifications que le build veut faire sans laisser ces changements prendre effet sur le système hébergeant le build. Vous n'avez pas besoin fakeroot
de produire une archive tar contenant un fichier appartenant à root et suid; si vous avez un binaire evilbinary
, l'exécution tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
, en tant qu'utilisateur normal, créera une archive tar contenant evilbinary
, détenue par root et suid. Cependant, vous ne pourrez pas extraire cette archive tar et conserver ces autorisations à moins que vous ne le fassiez en tant que root: il n'y a pas d'escalade de privilèges ici. fakeroot
est un privilège de-outil d'escalade: il vous permet d'exécuter une build en tant qu'utilisateur normal, tout en préservant les effets que la build aurait eu si elle avait été exécutée en tant que root, permettant à ces effets d'être rejoués plus tard. L'application des effets «pour de vrai» nécessite toujours des privilèges root; fakeroot
ne fournit aucune méthode pour les acquérir.
Pour comprendre l'utilisation de fakeroot
plus en détail, considérez qu'une génération de distribution typique implique les opérations suivantes (parmi beaucoup d'autres):
- installer des fichiers, appartenant à root
- ...
- archiver ces fichiers, toujours détenus par root, de sorte que lorsqu'ils seront extraits, ils appartiendront à root
La première partie échoue évidemment si vous n'êtes pas root. Cependant, lors de l'exécution sous fakeroot
, en tant qu'utilisateur normal, le processus devient
- installer des fichiers, appartenant à root - cela échoue, mais
fakeroot
prétend qu'il réussit et se souvient du changement de propriétaire
- ...
- archiver ces fichiers, toujours détenus par root - lorsque
tar
(ou quel que soit l'archiveur utilisé) demande au système quelle est la propriété du fichier, fakeroot
modifie la réponse pour correspondre à la propriété enregistrée précédemment
Ainsi, vous pouvez exécuter une génération de package sans être root, tout en obtenant les mêmes résultats que si vous exécutiez vraiment en tant que root. L'utilisation fakeroot
est plus sûre: le système ne peut toujours rien faire que votre utilisateur ne puisse pas faire, donc un processus d'installation non autorisé ne peut pas endommager votre système (au-delà de toucher vos fichiers).
Dans Debian, les outils de construction ont été améliorés afin de ne plus en avoir besoin, et vous pouvez construire des paquets sansfakeroot
. Ceci est supporté par dpkg
directement avec la Rules-Requires-Root
directive (voir rootless-builds.txt
).
Pour comprendre l'objectif fakeroot
et les aspects de sécurité de l'exécution en tant que root ou non, il peut être utile de considérer l'objectif de l'empaquetage. Lorsque vous installez un logiciel à partir de la source, pour une utilisation à l'échelle du système, vous procédez comme suit:
- construire le logiciel (ce qui peut se faire sans privilèges)
- installer le logiciel (qui doit être fait en tant que root, ou au moins en tant qu'utilisateur autorisé à écrire dans les emplacements système appropriés)
Lorsque vous empaquetez un logiciel, vous retardez la deuxième partie; mais pour le faire avec succès, vous devez toujours «installer» le logiciel, dans le package plutôt que sur le système. Ainsi, lorsque vous empaquetez un logiciel, le processus devient:
- construire le logiciel (sans privilèges spéciaux)
- faire semblant d'installer le logiciel (là encore sans privilèges spéciaux)
- capturer l'installation logicielle sous forme de package (idem)
- rendre le package disponible (idem)
Maintenant, un utilisateur termine le processus en installant le package, qui doit être fait en tant que root (ou encore, un utilisateur avec les privilèges appropriés pour écrire aux emplacements appropriés). C'est là que le processus privilégié retardé est réalisé, et c'est la seule partie du processus qui nécessite des privilèges spéciaux.
fakeroot
aide aux étapes 2 et 3 ci-dessus en nous permettant d'exécuter des processus d'installation de logiciels et de capturer leur comportement, sans exécuter en tant que root.