Пока что я могу понять, что 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от имени обычного пользователя создаст тарбол, содержащий evilbinaryroot и 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.