jueves, 26 de diciembre de 2013

Enjaular Usuarios en Home en Linux

El otro día se me planteó un problema al cual sólo podía dar salida enjaulando a un usuario en su /home.
¿Qué es enjaular o hacer un chroot de un usuario?
Asegurarnos que tenemos las aplicaciones sudo y chroot instaladas, generalmente vienen con cualquier Linux. Nos convertimos a root haciendo:

su -l

Lo primero que hacemos ahora, es crear un usuario, no hace falta espeficar ahora el tipo de shell que va a usar, lo haremos más adelante.
Nos limitamos a crear el usuario, el mio se llamará prueba:
adduser prueba    # Agregamos usuario
passwd prueba     # Indicamos contrasena al usuario

Hemos creado el usuario y le hemos dado un contrasena.
Ahora creamos una shell, la que lanzará el usuario cuando se loguee en el sistema. La creamos en el directorio /bin, yo la voy a llamar jaula, por lo tanto el fichero a crear es:
/bin/jaula
¿Qué ponemos en dicho fichero?
Pues ponemos los mandatos que queremos que se ejecuten cuando el usuario entre en el sistema, este es el contenido de ese fichero:
#!/bin/bash
/usr/sbin/chroot /home/prueba /bin/bash

Ya tenemos creada la shell para nuestro usuario pájaro, ahora damos permiso de ejecución al fichero:
chmod +x /bin/jaula

Ya tenemos la shell lista, sólo nos falta hacer de ella que sea una shell válida, esto lo hacemos metiendo la shell en el /etc/shells, que lo hacemos editando el fichero con nuestro editor favorito.
Ahora debemos crear unos directorios básicos en el /home/prueba, nos vamos a su directorio y hacemos:
mkdir bin
mkdir usr/bin
mkdir lib

Ya tenemos los directorios principales en el /home/prueba, ahora solo nos falta copiar el /bin/bash a él, pero claro, /bin/bash depende de unas librerias, que también debemos copiar, para saber qué librerías necesitamos hacemos:
ldd /bin/bash
Y obtenemos:
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40028000)
libdl.so.2 => /lib/libdl.so.2 (0x4002c000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Copiamos dichas librerías:
cp /lib/libtermcap.so.2 /home/prueba/lib
cp /lib/libdl.so.2 /home/prueba/lib
cp /lib/libc.so.6 /home/prueba/lib
cp /lib/ld-linux.so.2 /home/prueba/lib

Ahora copiamos el /bin/bash:
cp /bin/bash /home/prueba/bin/
Bueno, ya tenemos todo listo, aunque ahora mismo el usuario no podría hacer nada, así que le dejamos por ejemplo que pueda hacer ls y cp Para ello debemos copiar /bin/ls a /home/prueba/bin, deberíamos comprobar de qué librerías dependen:
ldd /bin/ls 
libtermcap.so.2 => /lib/libtermcap.so.2 (0x40028000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Al igual que pasará con el cp las librerías que necesitan ya están copiadas en /home/prueba/lib, por lo que no debemos hacer nada, sólo limitarnos a copiar los ficheros:
cp /bin/ls /home/prueba/bin && cp /bin/cp /home/prueba/bin
Ya tenemos esas dos utilidades en el directorio de nuestro usuario. Ahora nos falta decirle a ese usuario que su shell será /bin/jaula, lo hacemos de la siguiente forma:
usermod -s /bin/jaula prueba

Por último tenemos que decrirle al sudo, que el usuario prueba puede ejecutar la orden chroot, lo hacemos:
visudo

Con esta orden editamos un fichero y debemos añadir una linea tal como esta:
prueba ALL=/usr/sbin/chroot
Lo hacemos justo debajo de la que hay ya que es:
# User privilege specification
root ALL=(ALL) ALL
Ya tenemos todo listo, por último hacemos propietario de todo el /home/prueba a dicho usuario, ya que los ficheros que hemos copiado y los que hemos creado no son de ese usuario, sino de root y puede haber problemas en un conflicto, así que mejor ponemos solución ahora:
chown -R prueba /home/prueba
Ya hemos terminado, si entramos como prueba y hacemos unas pruebas pasa esto:
bash-2.05b# ls
bin lib usr
bash-2.05b# cd /
bash-2.05b# pwd
/
bash-2.05b#

http://unidadlocal.com/Enjaular_Usuarios_en_Home_en_Linux

No hay comentarios:

Publicar un comentario