Recientemente hemos tenido que montar un servidor con unos usuarios enjaulados que podían realizar conexiones SSH pero sin tener acceso directo al resto de la máquina.
Así que como hemos visto que hay cierta complicación en hacer esto mismo, vamos a explicar como realizar este proceso lo más fácil y rápido posible.
Hay que tener en cuenta que este proceso, de base es complicado, puesto que tiene muchas fases de depura y a nuestro parecer, prueba y error.
Configuración
En ocasiones, estas configuraciones son parecidas a las que se unas para enjaular por SFTP, por ello, te recomendamos que le des un vistazo a ese manual si te lo has perdido en su momento.
Lo que vamos a tener que hacer es configurar una sección de la máquina para que sea la que tenga todo ese contenido, mejor en un disco solo para estos usuarios y así evitamos que nos puedan bloquear el sistema por uso del disco.
Grupo
Un punto importante es el hecho de que todos los usuarios que creemos tengan el mismo grupo para que no haya problema de donde se les crea el home y por lo tanto, tendremos que crear un grupo propio.
groupadd chrootfilter
Vamos a crear la ruta donde vamos a enjaular a nuestros usuarios.
mkdir -v /var/chroot
Lo que tendremos que hacer también es asignarle los permisos correctos, así como el propietario correspondiente.
chown root:root /var/chroot chmod 755 /var/chroot
SSH
Ahora que ya tenemos el grupo, tendremos que generar el chroot dentro del fichero del sshd.
vim /etc/ssh/sshd_config
Iremos al final del documento y agregaremos la siguiente línea
Match group chrootfilter ChrootDirectory /var/chroot
Guardamos y salimos.
Para que apliquen los cambios, vamos a tener que reiniciar el servicio de SSH, por lo que sería algo como esto.
systemctl restart sshd
Directorios
Ya tenemos el enjaulado dentro del SSH y el grupo sobre el que vamos a trabajar, pero esto no quiere decir que esté completo para empezar a usarlo, aun nos quedan cosas por preparar, entre ellas, los directorios donde generaremos nuestro pequeño rincón de aislamiento.
Lo primero que hemos de hacer es generar / crear / copiar lo más esencial para el uso básico del terminal:
mkdir /var/chroot/dev
cd /var/chroot/dev
mknod -m 666 null c 1 3
mknod -m 666 tty c 5 0
mknod -m 666 zero c 1 5
mknod -m 666 random c 1 8
Ahora, tendremos que agregar la «shell», en nuestro caso, vamos a usar bash para el ejemplo, pero se puede usar cualquiera de las existentes.
mkdir /var/chroot/bin
cp /bin/bash /var/chroot/bin
Lo más importante, además de dichos directorios, son las dependencias que tiene el propio bash para ello, podemos usar el comando LDD, que aparecerá de la siguiente manera:
root@MyHPCraft:~# ldd /bin/bash
linux-vdso.so.1 (0x00007ffd00ba2000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f467f08e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f467ee66000)
/lib64/ld-linux-x86-64.so.2 (0x00007f467f236000)
Con esto, sabemos que hemos de crear también los directorios » lib/x86_64-linux-gnu «/ y » lib64 «, por lo tanto, tendremos que crearlos y copiar los respectivos ficheros:
mkdir -p /var/chroot/lib/x86_64-linux-gnu /var/chroot/lib64
cp -a /lib/x86_64-linux-gnu/{libtinfo.so.6,libc.so.6} /var/chroot/lib/x86_64-linux-gnu
cp -a /lib64/ld-linux-x86-64.so.2 /var/chroot/lib64
Con esto, ya tenemos lo básico de lo básico.
Usuario
Ahora que tenemos preparado el grupo y el enjaulado dentro de la configuración del SSH, vamos a crear el usuario.
Para ello, es importante que lo creemos con el añadido » -g «.
useradd -g chrootfilter usuario_ejemplo
Esto nos va a generar el home del usuario de manera usual dentro del home del sistema, por lo que es recomendable que una vez que se haya creado, copiemos el contenido al home del enjaulado.
mkdir -p /var/chroot/home/usuario_ejemplo
chown usuario_ejemplo. /var/chroot/home/usuario_ejemplo
chmod 700 /var/chroot/home/usuario_ejemplo
cp -a /home/usuario_ejemplo /var/chroot/home/usuario_ejemplo
Puede parecer una tontería, pero id con cuidado con el » -a » suele ayudar a evitar problemas con estas cosas.
Para que no haya problemas posteriormente, hay que copiar los ficheros passwd y group dentro del enjaulado, porque de lo contrario, el usuario dará errores.
mkdir /var/chroot/etc
cp -a /etc/{passwd,group} /var/chroot/etc/
Comandos
Hay que tener en cuenta que todos los usuarios enjaulados van a tener los mismos permisos, además de ello, por lo tanto, si queremos diferenciar usuarios entre unos u otros, podemos hacer diferentes grupos para que no haya problemas posteriormente.
Vamos a suponer que los usuarios van a usar los siguientes comandos:
- ls
- cat
- mkdir
- rm
- scp
- vi
- echo
- date
Estos comandos son algunos de los más usados y que ayudarán a que tengan una operatividad casi total, aunque quizás VIM más que VI, pero creo que es cuestión de gustos.
Para ello, tendremos que ver las dependencias de cada paquete igual que hemos hecho con la copia de BASH.
Puede parecer una porquería el tener que hacer esto con todos los comandos que queramos usar, pero piensa que las limitaciones van a ser en función de lo que nosotros queramos y por lo tanto, si no les damos el comando, no podrán usarlos.
En algunas webs, hemos encontrado un script que en principio debería copiar el contenido de los comandos que le indiquemos, a nosotros nos gusta más hacerlo manualmente, porque tienes más control sobre ello, pero os lo dejamos por si alguien, bajo su responsabilidad quiere usarlo.
#!/bin/bash # This script can be used to create simple chroot environment # Written by LinuxCareer.com <http://linuxcareer.com/> # (c) 2013 LinuxCareer under GNU GPL v3.0+ #!/bin/bash CHROOT='/var/chroot' mkdir $CHROOT for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq ) do cp --parents $i $CHROOT done # ARCH amd64 if [ -f /lib64/ld-linux-x86-64.so.2 ]; then cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT fi # ARCH i386 if [ -f /lib/ld-linux.so.2 ]; then cp --parents /lib/ld-linux.so.2 /$CHROOT fi echo "Chroot jail is ready. To access it execute: chroot $CHROOT"
Lo más básico para usar este script es copiarlo dentro del un fichero sh y darle permisos de ejecución.
Una vez hecho esto, para ejecutarlo se hace de la siguiente manera:
./chroot.sh /bin/{ls,cat,echo,rm,bash} /usr/bin/vi /etc/hosts
Si por lo que sea no os funciona, como hemos indicado anteriormente, realizadlo manualmente para aseguraros que no se copia nada raro o fuera de lugar.
Errores y problemas
Hay varios errores o problemas que en ocasiones se nos pueden presentar y no, no vamos a poder verlos todos, pero sí que intentaremos dar respuesta a los que nos hemos encontrado nosotros y en todo caso, si nos ponéis vuestras dudas en los comentario, os intentaremos ayudar.
De todos modos, os ponemos los que seguramente se puedan dar en la mayoría de los casos.
No funcionan los comandos
Este puede parecer el más tonto de los errores, pero suele pasar más comúnmente de los que te puedes imaginar.
Lo primero que tendremos que hacer, es revisar que el fichero .bashrc se encuentra dentro del home del usuario.
En caso de que siga fallando, tienes que revisar los permisos sobre el fichero, puesto que deber tener 644, tal como os mostramos:
-rw-r--r-- 1 pi pi 3771 oct 2 2018 .bashrc
Unknown User
En ocasiones, nos podemos encontrar con este error tan peculiar cuando intentamos hacer un SCP, vamos a ir listando la manera de solucionarlo de más sencilla a más complicada.
Podemos mirar si hay algún error listado dentro del journal.
journalctl -f
Seguramente veamos que el usuario en cuestión, supongamos que es el 1001, intenta hacer login y que la conexión se cierra súbitamente, pero no llega a mostrar nada más.
Lo primero que tendremos es copiar los ficheros passwd, group y shadow nuevamente, en ocasiones no copiamos los ficheros correctamente ( -a ) o simplemente, que hayamos cambiado el ID del usuario y por eso nos de problemas.
cp -av /etc/{passwd,group,shadow} /var/chroot/etc/
Con eso ya tendremos los ficheros copiados con los permisos originales, es decir, los que debería de tener.
En caso de que el problema persista, también puede ser por problemas de permisos sobre las carpetas bin, lib o usr.
Conclusión
Enjaular usuarios es una buena manera de que tengamos un bash dentro de nuestro sistema y a su vez, limitemos a los usuarios puesto que seguramente solo tengan que acceder a algunas cosas concretas o incluso sean usuarios que no quieras que puedan campar a sus anchas… eso ya, depende lo que queramos hacer.
En mi caso, lo uso como una manera de que ciertos usuarios puedan acceder a ciertas aplicaciones, por ejemplo, un proveedor que quiera subir ficheros a aplicativos y no deban tener nada más a lo su que acceder o incluso para que entre compañeros tengamos una zona exclusiva de intercambio de ficheros.
Intentaremos responder a todas vuestras dudas en los comentarios.
Informático de profesión y emprendedor apasionado. Interesado en los sistemas operativos y la cocina. Escritor de manuales por afición / vocación.

