¿Qué es una cárcel chroot?
Un chroot en los sistemas operativos Unix es una operación que cambia el directorio raíz aparente para el proceso en ejecución actual y sus hijos. Los programas que se ejecutan en este entorno modificado no pueden acceder a los archivos fuera del árbol de directorio designado. Básicamente, esto limita su acceso a un árbol de directorios y, por lo tanto, reciben el nombre de «chroot jail».
La idea es que cree un árbol de directorios donde copie o vincule todos los archivos del sistema necesarios para que se ejecute un proceso. Luego usa la llamada al sistema chroot para cambiar el directorio raíz para que esté en la base de este nuevo árbol y comience el proceso que se ejecuta en ese entorno chroot. Dado que en realidad no puede hacer referencia a rutas fuera de la raíz modificada, no puede leer ni escribir maliciosamente en esas ubicaciones.
¿Por qué es necesario y en qué se diferencia de las máquinas virtuales?
Esta es una virtualización a nivel del sistema operativo y, a menudo, se usa en lugar de máquinas virtuales para crear varias instancias aisladas del sistema operativo host. Esta es una virtualización a nivel de kernel y prácticamente no tiene sobrecarga en comparación con las máquinas virtuales, que son una virtualización de capa de aplicación, como resultado, proporciona un muy buen método para crear múltiples instancias aisladas en el mismo hardware. Una máquina virtual (VM) es una implementación de software de una máquina y, a menudo, explotan lo que se conoce como virtualización de hardware para representar imágenes virtuales de un sistema operativo en funcionamiento.
¿Como lo uso?
El comando básico para crear un chroot jail es el siguiente:
chroot /path/to/new/root command OR chroot /path/to/new/root /path/to/server OR chroot [options] /path/to/new/root /path/to/server
Nota: Solo un usuario root/privilegiado puede usar la llamada al sistema chroot. Un usuario sin privilegios con acceso al comando puede pasar por alto el chroot jail.
Pasos para crear una mini-cárcel para el comando ‘bash’ y ‘ls’
1. Cree un directorio que actuará como la raíz del comando.
$ mkdir jailed $ cd jailed
2. Cree todos los directorios esenciales para que se ejecute el comando: Dependiendo de su sistema operativo, los directorios requeridos pueden cambiar. Lógicamente, creamos todos estos directorios para mantener una copia de las bibliotecas requeridas. Para ver qué directorios son necesarios, consulte el paso 4.
$ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu
3. Ejecute el comando ‘cuál’: Ejecute el comando ‘cuál’ para encontrar la ubicación de ls y el comando bash. Después de ejecutar qué comando, copie esos archivos binarios en el directorio ‘bin’ de nuestra cárcel. Asegúrese de no tener ninguno de estos comandos con alias. De ahora en adelante, nos referiremos a nuestro directorio como directorio ‘Encarcelado’ por conveniencia.
$ unalias ls # Required only if you have aliased ls command $ unalias bash # Required only if you have aliased bash command $ cp $(which ls) ./bin/ $ cp $(which bash) ./bin/
4. Copie las bibliotecas/objetos apropiados : Para que los ejecutables en nuestro directorio Jailed funcionen, necesitamos copiar las bibliotecas/objetos apropiados en el directorio JAILED. De forma predeterminada, el ejecutable busca las ubicaciones que comienzan con ‘/’. Para encontrar las dependencias usamos el comando ‘ldd’
$ ldd $(which bash) linux-vdso.so.1 => (0x00007ffc75dd4000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000) /lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)
Ejecute los siguientes comandos para crear los directorios apropiados.
$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/ $ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/ $ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/ $ cp /lib64/ld-linux-x86-64.so.2 lib64/
Del mismo modo para ls,
$ ldd $(which ls) linux-vdso.so.1 => (0x00007fff4f05d000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000) /lib64/ld-linux-x86-64.so.2 (0x000055e836c69000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/ $ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/ $ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/ $ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/ $ cp /lib64/ld-linux-x86-64.so.2 lib64/ $ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/
La estructura final del directorio debe ser similar a esta,
5. Sudo chroot: ejecute este comando para cambiar la raíz al directorio JAILED, junto con la ruta al shell. Por defecto intentará cargar el shell ‘/bin/sh’.
$ cd .. $ sudo chroot jailed /bin/bash
Puede enfrentar este error mientras ejecuta el comando chroot,
chroot: failed to run command `/bin/bash': No such file or directory
Esto puede deberse a 2 razones, ya sea que el archivo no existe (lo cual es obvio), o cuando la biblioteca de carga falla o no está disponible. Vuelva a verificar si las bibliotecas están en la ubicación correcta.
6. Debe aparecer un nuevo caparazón: es nuestra fiesta encarcelada. Actualmente solo tenemos 2 comandos instalados, bash y ls. Afortunadamente, cd y pwd son comandos incorporados en bash shell, por lo que también puede usarlos.
Desplácese por el directorio, intente acceder a ‘cd /../’ o algo similar. Intenta romper la cárcel, probablemente no puedas. 🙂
Para salir de la cárcel,
$ exit
La parte más importante e interesante es que, cuando corres,
$ ps aux
y encuentre el proceso, encontrará que solo hay un proceso,
root 24958 … 03:21 0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash
Curiosamente, los procesos en el shell encarcelado se ejecutan como un proceso secundario simple de este shell. Todos los procesos dentro del entorno JAILED son solo procesos simples a nivel de usuario en el sistema operativo host y están aislados por los espacios de nombres proporcionados por el kernel, por lo que hay una sobrecarga mínima y, como beneficio adicional, obtenemos aislamiento.
Una copia del directorio jailed-bash explicado aquí se puede descargar desde aquí .
Del mismo modo, puede agregar más comandos a su entorno virtual encarcelado. Para agregar programas más complejos, es posible que deba crear más directorios, como ‘/proc’ y ‘/dev’. Estos aumentan la complejidad del proceso. Esperemos que no lo necesitemos para nuestro propósito.
Esto es todo lo que necesita saber sobre chroot y el encarcelamiento de directorios. Nuestro objetivo final es comprender qué son los contenedores y cómo servicios como AWS (Amazon Web Services), Google Cloud y Docker pueden proporcionar tantas instancias virtuales de sistemas operativos bajo demanda. Además, ¿cómo sys-admin ejecuta múltiples servidores web para múltiples dominios en una sola máquina física? Este fue solo un paso para comprenderlo 🙂
Referencias:
- https://help.ubuntu.com/community/DebootstrapChroot
- https://wiki.archlinux.org/index.php/Install_from_existing_Linux
- http://serverfault.com/questions/162362/chroot-fails-cannot-run-command-bin-bash-no-such-file-or-directory
- https://wiki.archlinux.org/index.php/cambiar_raíz
Sobre el Autor:
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA