Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

lunes, 8 de junio de 2015

Cómo crear una jaula virtual con chroot

En el día de hoy os vengo a hablar sobre la posibilidad de crear un entorno enjaulado en Linux. Este método de protección que consiste en nada menos que crear un directorio o grupo de directorios que se encuentran totalmente aislados del resto del sistema, imposibilitando que puedan interactuar con ningún elemento que nosotros no queramos que controle. Los entornos enjaulados son especialmente útiles a la hora de querer ejecutar algún software de origen dudoso y que queremos que no tenga la posibilidad de dañar nuestro sistema; ésto puede pareceros increíble, pues siempre se ha hablado mucho sobre la carencia de malware en Linux, pero lo cierto es que aunque existe muchísimo menos que en Windows, sigue existiendo y es algo que hay que tener en cuenta. 
El método más conocido para crear una "jaula" virtual es mediante el comando chroot (change root). Cuando este comando se ejecuta sobre un directorio, este se encuentra temporalmente aislado del resto y no es capaz de ejecutar ningún recurso que se encuentre fuera de dicha jaula. Lo ideal suele ser tener una carpeta especialmente preparada para actuar cómo entorno enjaulado, y esto es lo que vamos a intentar hacer en el día de hoy. Para ello lo primero que habría que hacer sería crear una carpeta con un nombre intuitivo; en mi caso por ejemplo jaula, la cual he creado dentro del directorio /usr/src/:

  1. mkdir /usr/src/jaula

Tras tener la carpeta creada, habría que considerar crear también un usuario nuevo que se encargue de acceder a dicha jaula. Se puede hacer con un usuario ya creado previamente, siempre y cuando éste no sea root y que a ser posible no tenga permisos de tipo sudo. Por ello es aconsejable añadir un nuevo usuario; en mi caso por ejemplo he creado dicho usuario se llama enjaulado.

  1. adduser enjaulado

Teniendo el usuario y la carpeta creada, parece lógico que cumplamos todos los requisitos para crear la jaula, pero desafortunadamente no es así. El comando para ejecutar la jaula con el usuario que hemos creado sería éste:

  1. chroot --userspec=${idusuario}:${idgrupo} /usr/src/jaula/

Para obtener el id de usuario y el id del grupo habría que escribir cat /etc/passwd |grep ${usuario}, y allí hay diferentes secciones divididas por : que representan diferentes valores; en este caso nos interesarían el tercer y cuarto valor, los cuales representan el id del usuario y su id de grupo respectivamente, tal y cómo muestro en la captura de pantalla a continuación con el usuario enjaulado:


En este caso el id de usuario sería 1002 y el id del grupo 1003, con lo que en mi caso, para la carpeta jaula escribiría chroot --userspec=1002:1003 /usr/src/jaula/; Pero tal y cómo he dicho, la carpeta no está preparada para ser una jaula aún; es decir, todavía no se cumplen los requisitos para crear la jaula, y por ello nos mostrará el siguiente mensaje de error:


Tal y cómo reza el mensaje, la jaula se intenta ejecutar, pero no es capaz de ejecutar el comando bash, porque la jaula no contiene el programa bash; ya que éste se encuentra en /bin, el cual está fuera de la jaula y no se puede llegar hasta ahí; Por ello  habría que añadir tanto bash cómo las librerías de las que depende este comando. Además, para tener un poco más de libertad, añadiremos también el comando ls. Para saber de qué librerías depende un programa se usa el comando ldd; El comando no requiere parámetro alguno, sólo hay que escribir el comando y la ruta del programa cuyas librerías queremos ver; en este caso usaremos ldd sobre /bin/bash y /bin/ls.


Con dichas librerías vistas, habría que copiar tanto los binarios cómo las librerías de las que dependen estos binarios; Para ello hay que ir copiando cada fichero de uno en uno cuidadosamente en la carpeta donde se realizará la jaula (en mi caso jaula) y crear las carpetas necesarias para que la jaula emule un entorno real; me explico: Si por ejemplo el binario bash está alojado en la carpeta /bin habría que crear una carpeta con el mismo nombre en la carpeta que usaremos cómo jaula. Del mismo modo, si una librería se encuentra en la carpeta /lib/x86_64-linux.gnu, habría que crear tanto la carpeta lib, cómo la carpeta x86_64-linux.gnu (dentro de la carpeta lib) y así sucesivamente. Basándonos en dicha información, este sería el procedimiento a seguir en caso de estar usando Debian 8 64 bits; En caso de usar otro sistema operativo y/o arquitectura, lo más conveniente sería guiarse mediante el comando ldd e ir copiando las librerías que éste te va indicando:

  1. mkdir /usr/src/jaula/bin/
  2. mkdir -p /usr/src/jaula/lib/x86_64-linux-gnu/
  3. mkdir /usr/src/jaula/lib64/
  4. cp /bin/bash /usr/src/jaula/bin/
  5. cp /lib/x86_64-linux-gnu/libncurses.so.5 /usr/src/jaula/lib/x86_64-linux-gnu/
  6. cp /lib/x86_64-linux-gnu/libtinfo.so.5 /usr/src/jaula/lib/x86_64-linux-gnu/
  7. cp /lib/x86_64-linux-gnu/libdl.so.2  /usr/src/jaula/lib/x86_64-linux-gnu/
  8. cp /lib/x86_64-linux-gnu/libc.so.6   /usr/src/jaula/lib/x86_64-linux-gnu/
  9. cp /lib64/ld-linux-x86-64.so.2 /usr/src/jaula/lib64/
  10. cp /bin/ls /usr/src/jaula/bin/
  11. cp /lib/x86_64-linux-gnu/libselinux.so.1 /usr/src/jaula/lib/x86_64-linux-gnu/
  12. cp /lib/x86_64-linux-gnu/libacl.so.1 /usr/src/jaula/lib/x86_64-linux-gnu/
  13. cp /lib/x86_64-linux-gnu/libpcre.so.3 /usr/src/jaula/lib/x86_64-linux-gnu/
  14. cp /lib/x86_64-linux-gnu/libattr.so.1 /usr/src/jaula/lib/x86_64-linux-gnu/
  15. cp /lib/x86_64-linux-gnu/libpthread.so.0 /usr/src/jaula/lib/x86_64-linux-gnu/

Con todo este procedimiento realizado, sería el turno de probar el comando chroot de nuevo. En caso de tener tanto el binario cómo las librerías correctamente copiadas, deberíamos de ver algo cómo lo siguiente:


En caso de querer tener más funcionalidades, habría que realizar el mismo proceso que hemos hecho antes con los distintos programas y librerías. Para salir de la jaula que acabamos de crear, simplemente bastaría con introducir el comando exit, volviendo al entorno "normal".

Espero que os haya resultado útil.

Saludos.

3 comentarios :

  1. Conocía el comando pero nunca entendí muy bien para qué se utilizaba... Lo he utilizado me parece que en alguna instalación de un so.

    Buen post!

    ResponderEliminar
  2. Pues parace una buena forma de empezar a crear tu propia distribución de lunix, de esta manera sólo vas agregando lo que vas necesitando.

    ResponderEliminar
    Respuestas
    1. Así es si bien para crear una distribución Linux no hay nada mejor que Linux from scratch

      Eliminar