Пока что я могу понять, что fakeroot используется для передачи прав на файл, который должен быть root, когда он распакован / tar-файл. Мой вопрос, почему ты не можешь просто сделать это с Чоуном?
Потому что вы не можете просто сделать это chown
, по крайней мере, не как пользователь без полномочий root. (И если вы работаете от имени пользователя root, вам это не нужно fakeroot
.) В этом весь смысл fakeroot
: позволить программам, которые ожидаются от имени пользователя root, запускаться от имени обычного пользователя, в то же время делая вид, что операции, требующие root, успешны.
Обычно это используется при сборке пакета, так что процесс установки устанавливаемого пакета может продолжаться без ошибок (даже если он выполняется chown root:root
, и install -o root
т. Д.). fakeroot
запоминает поддельное владение, которое он притворял, чтобы передать файлы, поэтому последующие операции, проверяющие владение, видят это вместо реального; это позволяет при последующих tar
запусках, например, сохранять файлы как принадлежащие пользователю root.
Как fakeroot останавливает нежелательные повышения привилегий в Linux? Если fakeroot может заставить tar создать файл, который принадлежит root, почему бы не сделать что-то похожее с SUID?
fakeroot
ничего не обманывает tar
, он сохраняет изменения, которые хочет внести сборка, не позволяя этим изменениям влиять на систему, в которой находится сборка. Вам не нужно fakeroot
создавать тарбол, содержащий файл, принадлежащий root и suid; если у вас есть бинарный файл evilbinary
, работающий tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
от имени обычного пользователя создаст тарбол, содержащий evilbinary
root и suid. Однако вы не сможете извлечь этот tarball и сохранить эти разрешения, если вы не сделаете это от имени root: здесь повышение привилегий не происходит. fakeroot
это привилегия де- инструмент эскалации: он позволяет запускать сборку как обычный пользователь, сохраняя при этом эффекты, которые сборка имела бы, если бы она была запущена от имени пользователя 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 или нет, это может помочь рассмотреть назначение упаковки. Когда вы устанавливаете часть программного обеспечения из источника, для использования в масштабе всей системы, вы делаете следующее:
- собрать программное обеспечение (что можно сделать без прав)
- установить программное обеспечение (которое должно быть выполнено от имени пользователя root или, по крайней мере, от имени пользователя, которому разрешено писать в соответствующие места системы)
Когда вы упаковываете часть программного обеспечения, вы откладываете вторую часть; но чтобы сделать это успешно, вам все равно нужно «установить» программное обеспечение в пакет, а не в систему. Поэтому, когда вы упаковываете программное обеспечение, процесс становится:
- собрать программное обеспечение (без особых привилегий)
- делать вид, что установил программное обеспечение (опять же без особых привилегий)
- захватить установку программного обеспечения как пакет (то же самое)
- сделать пакет доступным (то же самое)
Теперь пользователь завершает процесс, устанавливая пакет, что необходимо сделать от имени пользователя root (или опять же, пользователя с соответствующими правами для записи в соответствующие места). Именно здесь реализуется отложенный привилегированный процесс, и это единственная часть процесса, которая требует специальных привилегий.
fakeroot
помогает с шагами 2 и 3, описанными выше, позволяя нам запускать процессы установки программного обеспечения и фиксировать их поведение, не работая от имени пользователя root.