chroot linux
¿Cómo ejecutar un comando en una jaula chroot no como root y sin sudo? (5)
Podría usar los Contenedores de Linux para crear un entorno chroot que esté en un espacio de nombres totalmente diferente (IPC, filesytem e incluso red)
Incluso hay LXD que puede administrar la creación de contenedores basados en imágenes y configurarlos para que se ejecuten como usuarios sin privilegios, de modo que si el código no confiable logra escapar del contenedor, solo podrá ejecutar el código como usuario sin privilegios y No como la raíz del sistema.
Busque ''Contenedores de Linux'' y ''LXD'' en su motor de búsqueda favorito;)
Estoy configurando un chroot mínimo y quiero evitar tener sudo o su en él pero aún así ejecutar mis procesos como no root. Esto es un poco truco ya que ejecutar root de chroot requiers. Podría escribir un programa que haga esto que se vería como:
uid = LookupUser(args[username]) // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])
¿Es esa mi mejor apuesta o hay una herramienta estándar que hace eso por mí?
Rodé mi propio here :
Puede hacer uso de las capacidades de Linux para dar a su binario la capacidad de llamar a chroot () sin ser root. Como ejemplo, puede hacer esto al binario chroot
. Como no root, normalmente obtendrías esto:
$ chroot /tmp/
chroot: cannot change root directory to /tmp/: Operation not permitted
Pero después de ejecutar el comando setcap
:
sudo setcap cap_sys_chroot+ep /usr/sbin/chroot
Te dejará hacer la llamada chroot.
No te recomiendo que hagas esto al chroot
del sistema, sino que lo haces a tu propio programa y llamas a chroot. De esa manera, tiene más control sobre lo que está sucediendo e incluso puede abandonar el privilegio cap_sys_chroot después de llamarlo, por lo que las llamadas sucesivas a chroot en su programa fallarán.
Si invoca chroot
desde la raíz, la opción chroot
--userspec=USER:GROUP
ejecutará el comando bajo el UID / GID no root.
Por cierto, la opción ''--userspec'' se introduce por primera vez en coreutils-7.5 de acuerdo con un repositorio git://git.sv.gnu.org/coreutils
.
Un chrooter personalizado no es nada difícil de escribir:
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
const char newroot[]="/path/to/chroot";
int main(int c, char **v, char **e) {
int rc; const char *m;
if ( (m="chdir" ,rc=chdir(newroot)) == 0
&& (m="chroot",rc=chroot(newroot)) == 0
&& (m="setuid",rc=setuid(getuid())) == 0 )
m="execve", execve(v[1],v+2,e);
perror(m);
return 1;
}
Haga que setuid root y sea propiedad de un grupo personalizado al que agregue su usuario favorito (y no haya ''otro'' acceso).
fakechroot , en combinación con fakeroot , te permitirá hacer esto. Harán que todos los programas que se ejecutan actúen como si se estuvieran ejecutando en un chroot como root, pero en realidad se ejecutarán como usted.
Véase también la página del manual de fakechroot .