Cómo usar el comando chroot en Linux

El comando chroot puede enviarlo a la cárcel, mantener aislados sus entornos de desarrollo o prueba, o simplemente mejorar la seguridad de su sistema. Te mostramos la forma más sencilla de utilizarlo.

¿Qué es un chroot?

Si intenta medir la utilidad de un comando, debe tener en cuenta la funcionalidad que brinda y su facilidad de uso. Si es demasiado complicado para que la gente lo use o demasiado largo para que quieran intentar usarlo, la funcionalidad también podría ser cero. Si nadie lo usa, no proporciona ninguna funcionalidad.

En discusiones con usuarios de Linux, en persona y en foros, parece que el comando chroot es uno que se considera difícil de usar, o demasiado exigente y tedioso de configurar. Parece que esta fantástica utilidad no se usa tanto como debería.

Con chroot puedes configurar y ejecutar programas o shells interactivos como Bash en un sistema de archivos encapsulado que no puede interactuar con su sistema de archivos habitual. Todo dentro del entorno chroot está encerrado y contenido. Nada en el entorno chroot puede ver más allá de su propio directorio raíz especial sin escalar a los privilegios de root. Eso le ha valido a este tipo de entorno el sobrenombre de cárcel chroot. El término «cárcel» no debe confundirse con FreeBSD’s comando jail, que crea un entorno chroot eso es mas seguro que el entorno chroot habitual.

Pero en realidad, hay una forma muy sencilla de usar chroot, que vamos a analizar. Estamos usando comandos regulares de Linux que funcionarán en todas las distribuciones. Algunas distribuciones de Linux tienen herramientas dedicadas para configurar entornos chroot, como debootstrap para Ubuntu, pero aquí estamos siendo independientes de la distribución.

¿Cuándo debería usar un chroot?

Un entorno chroot proporciona una funcionalidad similar a la de una máquina virtual, pero es una solución más ligera. El sistema cautivo no necesita un hipervisor para ser instalado y configurado, como VirtualBox o Administrador de máquinas virtuales. Tampoco necesita tener un kernel instalado en el sistema cautivo. El sistema cautivo comparte su núcleo existente.

En algunos sentidos, los entornos chroot están más cerca de contenedores como LXC que a las máquinas virtuales. Son livianos, rápidos de implementar y la creación y activación de uno se puede automatizar. Al igual que los contenedores, una forma conveniente de configurarlos es instalar lo suficiente del sistema operativo para que pueda lograr lo que se requiere. La pregunta «qué se requiere» se responde observando cómo va a utilizar su entorno chroot.

Algunos usos comunes son:

Desarrollo de software y verificación de productos. Los desarrolladores escriben software y el equipo de verificación del producto (PV) lo prueba. A veces, PV detecta problemas que no se pueden replicar en la computadora del desarrollador. El desarrollador tiene todo tipo de herramientas y bibliotecas instaladas en su computadora de desarrollo que el usuario promedio (y PV) no tendrá. A menudo, el software nuevo que funciona para el desarrollador pero no para otros resulta estar utilizando un recurso en la PC del desarrollador que no se ha incluido en la versión de prueba del software. chroot permite a los desarrolladores tener un entorno cautivo simple en su computadora en el que pueden sumergir el software antes de entregarlo a PV. El entorno cautivo se puede configurar con las dependencias mínimas que requiere el software.

  Cómo crear nuevos prefijos de Wine en Linux

Reducir el riesgo de desarrollo. El desarrollador puede crear un entorno de desarrollo dedicado para que nada de lo que suceda en él pueda estropear su PC real.

Ejecución de software obsoleto. A veces solo tienes que tener una versión antigua de algo en ejecución. Si el software antiguo tiene requisitos que entrarían en conflicto o serían incompatibles con su versión de Linux, puede crear un entorno para el software problemático.

Recuperación y actualizaciones del sistema de archivos: si una instalación de Linux deja de funcionar, puede usar chroot para montar el sistema de archivos dañado en un punto de montaje en un Live CD. Esto le permite trabajar en el sistema dañado e intentar arreglarlo como si estuviera montado normalmente en root /. Esto significa que las rutas de archivo esperadas dentro del sistema dañado serán referenciadas correctamente desde el directorio raíz y no desde el punto de montaje del Live CD. Se utilizó una técnica similar en el artículo que describe cómo migrar el sistema de archivos de Linux de ext2 o ext3 a ext4.

Aplicaciones de Ringfencing. La ejecución de un servidor FTP u otro dispositivo conectado a Internet dentro de un entorno chroot limita el daño que puede causar un atacante externo. Este puede ser un paso valioso para fortalecer la seguridad de su sistema.

Creando un entorno chroot

Necesitamos un directorio que actúe como directorio raíz del entorno chroot. Para que tengamos una forma abreviada de referirnos a ese directorio, crearemos una variable y almacenaremos el nombre del directorio en ella. Aquí estamos configurando una variable para almacenar una ruta al directorio «testroot». No importa si este directorio aún no existe, lo crearemos pronto. Si el directorio existe, debería estar vacío.

chr=/home/dave/testroot

chr = / home / dave / testroot en una ventana de terminal

Si el directorio no existe, debemos crearlo. Podemos hacer eso con este comando. La opción -p (padres) garantiza que los directorios principales que falten se creen al mismo tiempo:

mkdir -p $chr

mkdir -p $ chr en una ventana de terminal

Necesitamos crear directorios para contener las partes del sistema operativo que requerirá nuestro entorno chroot. Vamos a configurar un entorno Linux minimalista que utiliza Bash como shell interactivo. También incluiremos los comandos touch, rm y ls. Eso nos permitirá usar todos los comandos integrados de Bash y touch, rm y ls. Podremos crear, enumerar y eliminar archivos y usar Bash. Y, en este sencillo ejemplo, eso es todo.

  Cómo descargar juegos de Steam a USB en Linux

Enumere los directorios que necesita crear dentro de {} expansión del corsé.

mkdir -p $chr/{bin,lib,lib64}

mkdir -p $ chr / {bin, lib, lib64} en una ventana de terminal

Ahora cambiaremos el directorio a nuestro nuevo directorio raíz.

cd $chr

cd $ chr en una ventana de terminal

Copiemos los binarios que necesitamos en nuestro entorno Linux minimalista de su directorio “/ bin” habitual en nuestro directorio chroot “/ bin”. La opción -v (detallado) hace que cp nos diga qué está haciendo mientras realiza cada acción de copia.

cp -v /bin/{bash,touch,ls,rm} $chr

cp -v / bin / {bash, touch, ls, rm} $ chr en una ventana de terminal

Los archivos se copian para nosotros:

salida de cp a medida que los archivos se copian en una ventana de terminal

Estos binarios tendrán dependencias. Necesitamos descubrir qué son y copiar esos archivos en nuestro entorno también, de lo contrario bash, touch, rm y ls no podrán funcionar. Necesitamos hacer esto a su vez para cada uno de nuestros comandos elegidos. Primero haremos Bash. El comando ldd enumerar las dependencias para nosotros.

ldd /bin/bash

ldd / bin / bash en una ventana de terminal

Las dependencias se identifican y enumeran en la ventana del terminal:

Bash dependencias enumeradas en una ventana de terminal

Necesitamos copiar esos archivos en nuestro nuevo entorno. Seleccionar los detalles de esa lista y copiarlos uno a la vez llevará mucho tiempo y será propenso a errores.

Afortunadamente, podemos semiautomatizarlo. Enumeraremos las dependencias nuevamente, y esta vez formaremos una lista. Luego recorreremos la lista copiando los archivos.

Aquí estamos usando ldd para enumerar las dependencias y alimentar los resultados a través de una tubería en egrep. Usar egrep es lo mismo que usar grep con la opción -E (expresiones regulares extendidas). La opción -o (solo coincidencia) restringe la salida a las partes coincidentes de las líneas. Estamos buscando archivos de biblioteca coincidentes que terminen en un número [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

lista =

Podemos verificar el contenido de la lista usando echo:

echo $list

echo $ list en una ventana de terminal

Ahora que tenemos la lista, podemos recorrerla con el siguiente ciclo, copiando los archivos uno por uno. Estamos usando la variable i para recorrer la lista. Para cada miembro de la lista, copiamos el archivo a nuestro directorio raíz chroot, que es el valor contenido en $ chr.

La opción -v (detallada) hace que cp anuncie cada copia a medida que la realiza. La opción –parents garantiza que los directorios principales que falten se creen en el entorno chroot.

for i in $list; do cp -v --parents "$i" "${chr}"; done

para i en $ list;  do cp -v --padres

Y esta es la salida:

salida del bucle cp en una ventana de terminal

Usaremos esa técnica para capturar las dependencias de cada uno de los otros comandos. Y usaremos la técnica de bucle para realizar la copia real. La buena noticia es que solo necesitamos hacer una pequeña edición en el comando que reúne las dependencias.

Podemos recuperar el comando de nuestro historial de comandos presionando la tecla de flecha hacia arriba varias veces y luego hacer la edición. El comando de copia en bucle no necesita cambiar en absoluto.

  Cómo configurar Cairo Dock en el escritorio de Linux

Aquí hemos usado la tecla de flecha hacia arriba para encontrar el comando, y lo hemos editado para decir touch en lugar de bash.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

lista =

Ahora podemos repetir exactamente el mismo comando de bucle que antes:

for i in $list; do cp -v --parents "$i" "${chr}"; done

para i en $ list;  do cp -v --padres

Y nuestros archivos se copian para nosotros:

salida del bucle cp copiando las dependencias táctiles en una ventana de terminal

Ahora podemos editar la línea de comando de la lista para ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

lista =

Nuevamente, usaremos el mismo comando de bucle. No le importa qué archivos hay en la lista. Trabaja a ciegas a través de la lista copiando los archivos por nosotros.

for i in $list; do cp -v --parents "$i" "${chr}"; done

para i en $ list;  do cp -v --padres

Y las dependencias para ls se copian para nosotros:

Salida del bucle cp copiando las dependencias ls en una ventana de terminal

Editamos la línea de comando de la lista por última vez, haciéndola funcionar para rm:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

lista =

Usamos el comando de copia en bucle una última vez:

for i in $list; do cp -v --parents "$i" "${chr}"; done

La última de nuestras dependencias se copia en nuestro entorno chroot. Finalmente estamos listos para usar el comando chroot. Este comando establece la raíz del entorno chroot y especifica qué aplicación ejecutar como shell.

sudo chroot $chr /bin/bash

sudo chroot $ chr / bin / bash en una ventana de terminal

Nuestro entorno chroot ahora está activo. El indicador de la ventana de la terminal ha cambiado y el shell interactivo está siendo manejado por el shell bash en nuestro entorno.

Entorno chroot activo en una ventana de terminal

Podemos probar los comandos que hemos traído al entorno.

ls
ls /home/dave/Documents

Entorno chroot activo en una ventana de terminal

El comando ls funciona como esperaríamos cuando lo usamos dentro del entorno. Cuando intentamos acceder a un directorio fuera del entorno, el comando falla.

Podemos usar touch para crear un archivo, ls para listarlo y rm para eliminarlo.

touch sample_file.txt
ls
rm sample_file.txt
ls

toque sample_file.txt en una ventana de terminal

Por supuesto, también podemos usar los comandos integrados que proporciona el shell Bash. Si escribe ayuda en la línea de comando, Bash los listará por usted.

help

Salida del comando de ayuda en una ventana de terminal

Use exit para salir del entorno chroot:

exit

usando exit para dejar el entorno chroot en una ventana de terminal

Si desea eliminar el entorno chroot, simplemente puede eliminarlo:

rm -r testroot/

rm -r testroot / en una ventana de terminal

Esto eliminará de forma recursiva los archivos y directorios en el entorno chroot.

Automatizar para mayor comodidad

Si está pensando que los entornos chroot pueden ser útiles para usted, pero su configuración es un poco complicada, recuerde que siempre puede eliminar la tensión y el riesgo de las tareas repetitivas mediante el uso de alias, funciones y scripts.