2010-09-17 15 views
21

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 truco, ya que ejecutar chroot requiers root. Podría escribir un programa que hace esto que sería algo como:¿Cómo ejecutar un comando en una cárcel chroot no como raíz y sin sudo?

uid = LookupUser(args[username]) // no /etc/passwd in jail 
chroot(args[newroot]) 
cd("/") 
setuids(uid) 
execve(args[exe:]) 

es que mi mejor apuesta o hay una herramienta estándar que hace eso para mí?


Rodé mi propia here:

Respuesta

23

Si invoca chroot desde la raíz, la opción chroot le ayudará. El comando chroot tiene una opción --userspec=USER:GROUP para ejecutarse en UID/GID no raíz.

Por cierto, la opción '--userspec' se introdujo por primera vez en coreutils-7.5 según un repositorio de git git://git.sv.gnu.org/coreutils.

+0

Parece exactamente lo que quiero pero no puedo encontrar documentación sobre él. (Estoy mirando páginas de información y de hombres). ¿Tiene un enlace a algunos documentos? – BCS

+0

Lo siento, pero parece que la opción '--userspec' se introduce RHEL> = 6.0 o Fedora> = 13. – kamae

16

fakechroot, en combinación con fakeroot, le permitirá hacer esto. Harán que todos los programas que se ejecutan actúen como si se ejecutaran en un chroot como root, pero en realidad se ejecutarán como usted.

Véase también fakechroot's man page.

+2

que necesitan un verdadero chroot como yo voy a ser compilar y ejecutar código no confiable que podría incluir ASM en línea. – BCS

+1

Desde que tropecé con este hilo, incluso años después, debo agregar: nunca use chroot para seguridad. https://lwn.net/Articles/252794/ – domenukk

8

Puede hacer uso de las capacidades de Linux para darle a su binario la capacidad de llamar a chroot() sin ser root. Como ejemplo, puede hacer esto al binario chroot. Como no root, normalmente se obtendría 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 

que le permitirá hacer la llamada chroot.

No le recomiendo que haga esto en el sistema chroot, que en su lugar lo haga a su propio programa y llame a chroot. De esta forma, tendrá más control sobre lo que está sucediendo e incluso podrá descartar el privilegio cap_sys_chroot después de que lo llame, de modo que las llamadas sucesivas a chroot en su programa fallarán.

+0

De modo que permitirá a un usuario arbitrario invocar el chroot sys-call a través de cualquier acceso binario como '/ usr/sbin/chroot'? Eso permitiría entonces que cualquier proceso dentro de un chroot invoque el chroot sys-call siempre que pueda crear un archivo ejecutable llamado '/ usr/sbin/chroot' relativo a la raíz actual. - Preferiría no hacerlo al aflojar el modelo de seguridad de kernels. – BCS

+0

Actualicé la respuesta para reflejar que establecerlo en el binario chroot era solo un ejemplo. Te gustaría hacer ese setcap en tu propio binario. –

8

Un chrooter personalizado no es en absoluto difícil 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; 
} 

Hacer que setuid root y es propiedad de un grupo personalizado se agrega el usuario favorecido a (y no tienen acceso 'otro').

1

Usted podría utilizar Linux Contenedores para crear un entorno chroot que se encuentra en un espacio de nombres totalmente diferente (CIP, sistema de ficheros, e incluso a la red)

Hay incluso LXD que es capaz de gestionar la creación de contenedores basados ​​en imágenes y configurarlos para que se ejecuten como usuarios no privilegiados, de modo que si el código que no es de confianza consigue escapar de algún modo del contenedor, solo podrá ejecutar código como usuario no privilegiado y no como raíz del sistema.

Buscar 'Linux Contenedores' y 'LXD' en su motor de búsqueda favorito;)

Cuestiones relacionadas