Solución:
Hasta ahora, lo que puedo deducir es que fakeroot se usa para otorgar propiedad a un archivo que debe ser root cuando se descomprime / tar’e. Mi pregunta es ¿por qué no puedes hacer eso con chown?
Porque no puedes hacer eso con chown
, al menos no como usuario no root. (Y si está ejecutando como root, no necesita fakeroot
.) Ese es el objetivo de fakeroot
: para permitir que los programas que esperan ser ejecutados como root se ejecuten como un usuario normal, mientras se pretende que las operaciones que requieren root tengan éxito.
Esto se utiliza normalmente al crear un paquete, de modo que el proceso de instalación del paquete que se está instalando pueda continuar sin errores (incluso si se ejecuta chown root:root
, o install -o root
, etc.). fakeroot
recuerda la propiedad falsa que pretendía dar a los archivos, por lo que las operaciones posteriores que miran la propiedad ven esto en lugar de la real; esto permite posteriores tar
se ejecuta, por ejemplo, para almacenar archivos como propiedad de root.
¿Cómo detiene fakeroot las escaladas de privilegios no deseados en Linux? Si fakeroot puede engañar a tar para que cree un archivo que es propiedad de root, ¿por qué no hacer algo similar con SUID?
fakeroot
no engaña tar
para hacer cualquier cosa, conserva los cambios que la compilación desea realizar sin permitir que esos cambios surtan efecto en el sistema que aloja la compilación. No necesitas fakeroot
para producir un tarball que contenga un archivo propiedad de root y suid; si tienes un binario evilbinary
, corriendo tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary
, como usuario habitual, creará un tarball que contenga evilbinary
, propiedad de root y suid. Sin embargo, no podrá extraer ese tarball y conservar esos permisos a menos que lo haga como root: aquí no hay escalada de privilegios. fakeroot
es un privilegio Delaware-Herramienta de escalado: le permite ejecutar una compilación como un usuario regular, al tiempo que conserva los efectos que la compilación habría tenido si se hubiera ejecutado como root, lo que permite que esos efectos se reproduzcan más tarde. Aplicar los efectos “de verdad” siempre requiere privilegios de root; fakeroot
no proporciona ningún método para adquirirlos.
Para entender el uso de fakeroot
con más detalle, considere que una compilación de distribución típica implica las siguientes operaciones (entre muchas otras):
- instalar archivos, propiedad de root
- …
- Archivar esos archivos, que aún son propiedad de root, para que cuando se extraigan, sean propiedad de root
La primera parte obviamente falla si no eres root. Sin embargo, cuando se ejecuta bajo fakeroot
, como usuario normal, el proceso se convierte en
- instalar archivos, propiedad de root – esto falla, pero
fakeroot
finge que tiene éxito, y recuerda el cambio de propiedad - …
- archivar esos archivos, que aún son propiedad de root, cuando
tar
(o cualquier archivador que se esté utilizando) pregunta al sistema cuál es la propiedad del archivo,fakeroot
cambia la respuesta para que coincida con la propiedad que registró anteriormente
Por lo tanto, puede ejecutar la compilación de un paquete sin ser root, mientras obtiene los mismos resultados que obtendría si realmente estuviera ejecutando como root. Utilizando fakeroot
es más seguro: el sistema aún no puede hacer nada que su usuario no pueda hacer, por lo que un proceso de instalación no autorizado no puede dañar su sistema (más allá de tocar sus archivos).
En Debian, las herramientas de compilación se han mejorado para que ya no lo requieran, y puede compilar paquetes sin fakeroot
. Esto es apoyado por dpkg
directamente con el Rules-Requires-Root
directiva (ver rootless-builds.txt
).
Para comprender el propósito de fakeroot
, y los aspectos de seguridad de ejecutar como root o no, podría ser útil considerar el propósito del empaquetado. Cuando instala una pieza de software desde la fuente, para su uso en todo el sistema, procede de la siguiente manera:
- construir el software (que se puede hacer sin privilegios)
- instalar el software (que debe hacerse como root, o al menos como un usuario con permiso para escribir en las ubicaciones apropiadas del sistema)
Cuando empaqueta una pieza de software, está retrasando la segunda parte; pero para hacerlo correctamente, todavía necesita “instalar” el software en el paquete en lugar de en el sistema. Entonces, cuando empaqueta software, el proceso se convierte en:
- construir el software (sin privilegios especiales)
- pretender instalar el software (nuevamente sin privilegios especiales)
- capturar la instalación del software como un paquete (ídem)
- hacer que el paquete esté disponible (ídem)
Ahora un usuario completa el proceso instalando el paquete, que debe hacerse como root (o nuevamente, un usuario con los privilegios apropiados para escribir en las ubicaciones apropiadas). Aquí es donde se realiza el proceso privilegiado retrasado, y es la única parte del proceso que necesita privilegios especiales.
fakeroot
ayuda con los pasos 2 y 3 anteriores al permitirnos ejecutar procesos de instalación de software y capturar su comportamiento, sin ejecutar como root.
NO. La raíz falsa le permite ejecutar herramientas de informes y manipulación de permisos, informará de manera consistente. Sin embargo, en realidad no otorgará estos permisos. Parecerá que los tienes (falsos). No cambiará nada fuera del medio ambiente.
Es útil, si desea crear una estructura de directorio, que contenga la propiedad y los permisos, que su usuario no pudo establecer, que luego use tar, zip u otro paquete.
Eso no realmente eleva los permisos, es falso. No le permite hacer nada (borrar, escribir, leer) que no podría hacer de otra manera. Podría producir el paquete (en teoría) sin él. Podrías obtener un informe falso (ls
) sin ello.
No es una falla de seguridad, porque no permitir el acceso, o cualquier cosa que no pueda hacer sin él. Funciona sin privilegios. Todo lo que necesita es interceptar llamadas a chown
, chmod
, etc. Los convierte en una no operación, excepto que registra lo que habría sucedido. También intercepta llamadas a stat
etc. para que informe los permisos y la propiedad, desde su propia base de datos interna, como si se hubieran realizado los otros comandos. Esto es útil, porque si luego comprime el directorio, tendrá los permisos falsos. Si luego descomprime, como root, los permisos se harán reales.
Cualquier archivo que no sea legible / escribible antes, seguirá siendo no legible / escribible. Cualquier archivo especial (por ejemplo, dispositivos) creado no tendrá poderes especiales. Cualquier set-uid (para otro usuario), los archivos no se establecerán-uid. Cualquier otra escalada de privilegios no funcionará.
Es un tipo de máquina virtual: Una máquina virtual, en general, puede simular cualquier entorno / SO, pero no puede hacerle nada al host que ninguna otra aplicación podría hacer. Dentro de la máquina virtual, puede parecer que hace cualquier cosa. Puede reinventar el sistema de seguridad para que sea el mismo o diferente. Sin embargo, todo esto existirá en el host, como recursos propiedad del usuario / grupo del proceso que ejecuta el entorno virtual.
Ya hay dos respuestas buenas y muy detalladas aquí, pero solo señalaré que el párrafo introductorio de la original fakeroot
página man1 en realidad lo explica de forma bastante clara y concisa:
fakeroot ejecuta un comando en un entorno en el que parece tener privilegios de root para la manipulación de archivos. Esto es útil para permitir a los usuarios crear archivos (tar, ar, .deb, etc.) con archivos con permisos / propiedad de root. Sin fakeroot uno necesitaría tener privilegios de root para crear los archivos constitutivos de los archivos con los permisos y la propiedad correctos, y luego empaquetarlos, o uno tendría que construir los archivos directamente, sin usar el archivador.
Fakeroot permite que un usuario no root cree archivos que contengan archivos propiedad de root, lo cual es una parte crítica de la generación y distribución de paquetes de software binarios en Linux. Sin fakeroot
, los archivos de paquete tendrían que generarse mientras se ejecuta como raíz real, para que contengan la propiedad y los permisos correctos del archivo. Ese haría ser un riesgo para la seguridad. La creación y el empaquetado de software potencialmente no confiable es una gran exposición si se realiza con root privs. Gracias a fakeroot
, un usuario sin privilegios con archivos sin privilegios aún puede generar archivos que contengan archivos con propiedad raíz.2
Pero no es un riesgo de seguridad, porque nada en el archivo es Realmente propiedad de root hasta que los archivos estén EXTRAÍDO. E incluso entonces, los archivos solo se extraerán con sus permisos de root intactos si lo hace un usuario privilegiado. Ese paso, donde un fakeroot
-el archivo asistido que contiene archivos “raíz” es extraído por un usuario privilegiado – es donde la raíz “falsa” finalmente se vuelve real. Hasta ese momento, no se obtienen ni se omiten los privilegios reales de root.
Notas
- Fakeroot ha generado algunos competidores / imitadores que se harán pasar por
fakeroot
si está instalado, incluyendofakeroot-ng
ypseudo
. Pero en mi humilde opinión, ninguna de las páginas de manual del “imitador” es tan clara acerca de ir directo al grano en esta pregunta. Quédate con el original, único y únicofakeroot
OG -
Otras distribuciones / sistemas de empaquetado superan esto simplemente no utilizando la propiedad raíz en sus archivos de paquetes. En Fedora, por ejemplo, el software puede ser compilado, instalado y empaquetado por un usuario sin privilegios sin necesidad de
fakeroot
. Todo se hace dentro del usuario$HOME/rpmbuild/
espacio, y pasos normalmente privilegiados comomake install
ser redirigido (a través de mecanismos como--prefix
yDESTDIR
) a un$HOME/rpmbuild/BUILDROOT/
jerarquía que podría considerarse una especie de espacio “fakechroot” (sin utilizar realmentefakechroot
).Pero incluso durante
make install
, todo se ejecuta y es propiedad del usuario sin privilegios. La propiedad y los permisos de los archivos extraídos se establecerán enroot,root
y0644
(o0755
para ejecutables) de forma predeterminada, a menos que se anule en la definición del paquete (.spec
), en cuyo caso se almacenan como metadatos dentro del paquete final. Debido a que en realidad no se aplican permisos o propiedad hasta el proceso de instalación (privilegiado) del paquete rpm, ni root nifakeroot
es necesario durante el envasado. Perofakeroot
es solo un camino diferente hacia el mismo resultado.