logo

Virtualización de Linux - Cárcel Chroot

Un chroot en los sistemas operativos UNIX es una operación que cambia el directorio raíz aparente para el proceso de 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. Esto esencialmente limita su acceso a un árbol de directorio y, por lo tanto, obtienen el nombre 'Chroot Jail'.

La idea es que cree un árbol de directorio donde copie o vincule en todos los archivos del sistema necesarios para que se ejecute un proceso. Luego usa la llamada del sistema Chroot para cambiar el directorio raíz para estar en la base de este nuevo árbol y comenzar el proceso que se ejecuta en ese entorno chrootado. Dado que en realidad no puede referir rutas fuera de la raíz modificada, no puede leer o escribir maliciosamente en esas ubicaciones.



¿Por qué se requiere y cómo es diferente de las máquinas virtuales?

Esta es la virtualización de nivel de sistema operativo y a menudo se usa en lugar de máquinas virtuales para crear múltiples instancias aisladas del sistema operativo host. Esta es una virtualización a nivel de núcleo y prácticamente no tiene una sobrecarga en comparación con las máquinas virtuales que son la virtualización de la capa de aplicación, como resultado, proporciona un método muy bueno 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 una imagen virtual de un sistema operativo que trabaja.

Cómo usar la cárcel chroot

El comando básico para crear una cárcel de chroot 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 del sistema Chroot. Un usuario no privilegiado con el acceso al comando puede evitar la cárcel de chroot.



Pasos para crear una miniista para el comando 'bash' y el 'ls'


1. Cree un directorio que actúe como la raíz del comando.

 $ mkdir jailed  
$ cd jailed

2. Cree todos los directorios esenciales para que el comando ejecute: 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é se requieren todos los directorios, vea el paso 4.

 $ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3.Runte el comando 'que': Ejecute el comando 'que' para encontrar la ubicación del comando LS y Bash. Después de ejecutar que comandan esos binarios en el directorio 'bin' de nuestra cárcel. Asegúrese de no tener ninguno de estos comandos alias. De ahora en adelante nos referiríamos a nuestro directorio como 'Encarcelado' directorio 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 bibliotecas/objetos apropiados : Para los ejecutables en nuestro Encarcelado Directorio para trabajar necesitamos copiar las bibliotecas/objetos apropiados en el directorio encarcelado. Por defecto, el ejecutable observa 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 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

Cárcel' title=

5. Sudo chroot: Ejecute este comando para cambiar la raíz al directorio encarcelado junto con la ruta al shell. Por defecto, intentará cargar el shell '/bin/sh'.

 $ cd ..  
$ sudo chroot jailed /bin/bash

Puede enfrentar este error al ejecutar el comando chroot 

chroot: failed to run command `/bin/bash': No such file or directory

Esto puede deberse a 2 razones por las que el archivo no existe (lo cual es obvio) o cuando la biblioteca de carga falla o no está disponible. Verifique dos veces si las bibliotecas están en la ubicación correcta.

6. Un nuevo caparazón debe aparecer: Es nuestra fiesta encarcelada. Actualmente tenemos solo 2 comandos instalados Bash y Ls. Afortunadamente, CD y PWD son comandos construidos en Bash Shell, por lo que también puede usarlos.

Deambule por el directorio Intente acceder a 'CD /../' o algo similar. Intenta romper la cárcel, probablemente no podrás hacerlo. :)

Salir de la cárcel 

 $ exit

La parte más importante e interesante es que cuando corres 

 $ ps aux

y encuentre el proceso que 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 simple proceso infantil de este caparazón. Todos los procesos dentro del entorno encarcelado son solo un proceso de nivel de usuario simple en el sistema operativo host y están aislados por los espacios de nombres proporcionados por el núcleo, por lo que hay una sobrecarga mínima y, como beneficio adicional, obtenemos aislamiento.

texto ajustado css

Del mismo modo, puede agregar más comandos a su entorno virtual encarcelado. Para agregar programas más complejos, es posible que necesite crear más directorios como '/proc' y '/dev'. Estos aumentan la complejidad del proceso. Ojalá no lo requiera para nuestro propósito.

Esto es todo lo que necesita saber sobre Chroot y el encarcelamiento de directorios. Nuestro objetivo final es comprender cuáles son los contenedores y cómo son servicios como AWS (Amazon Web Services) Google Cloud y Docker de proporcionar tantas instancias virtuales de sistemas operativos a pedido. Además, ¿cómo se ejecuta Sys-Admin múltiples servidores web para múltiples dominios en una sola máquina física? Este fue solo un paso para comprenderlo