SSH/SFTP Enjaulado

SSH es una herramienta extremadamente poderosa. Mucho poder quiere decir mucha responsabilidad. Si alguna vez tenemos que dar acceso de SSH o SFTP a nuestro servidor a alguien que no conozcamos, entonces es buena idea darles lo mínimo necesario para que realicen sus tareas.
Las buenas noticias es que podemos crear ambientes aislados a los usuarios con el conjunto de herramientas que ellos necesitan. . Entre otras cosas, estas herramientas pueden servir ser sincronizar directorios utilizando rsync sobre ssh, tener acceso para subir archivos de forma segura al servidor utilizando SFTP, entre otras.
La primera vez que me tocó crear un ambiente chroot para un usuario era necesario compilar una versión modificada de ssh. Si bien era un trabajo tedioso, existe buena documentación en Internet y se podría seguir how-tos bastante bien documentados. Recientemente investigué otra vez sobre el tema y veo que ahora ssh soporta nativamente ambientes enjaulados y existe un script que nos permite crear los ambientes enjaulados.

Nota: Todos los ejemplos que pongo a continuación con SSH se podría utilizar con cliente SFTP como Filezilla.

Descargar el script make_chroot_jail y guardarlo en /usr/local/sbin:

cd /usr/local/sbin
wget http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/make_chroot_jail.sh
chmod 700 make_chroot_jail.sh

La razón por la que guardamos el archivo en /usr/local/sbin, es porque es una ruta estandard para poner aplicaciones o scripts que no vienen con la distribución que usamos y que deben ser ejecutadas solo por el administrador. Además tiene la ventaja de estar incluido en el path de los administradores por lo que se puede ejecutar directamente escribiendo make_chroot_jail.sh en lugar de la ruta completa.

Modificaciones al script

Antes de ejecutar el script, me encontré con algunos detalles que deben ser cambiados para que funcione perfectamente. El primer cambio que se debe hacer es cambiar la primera línea del archivo. En lugar de decir:

#!/bin/sh

Deberíá decir

#!/bin/bash

Normalmente el comado /bin/sh es un link a /bin/bash, pero esto no es cierto en todas las distros. Para que este script funcione correctamente deberíamos ejecutarlo con el shell bash.

En el caso de mis pruebas con Ubuntu 10.4 y Debian Squeeze es necesario modificar la línea 472 y cambiar la librería:

/lib/libcap.so.1

por

/lib/libcap.so.2

En este script Ubuntu es reconocido como Debian. Así que en los 2 casos hay que modificar la línea 472. Si estas usando una distro como Suse, Fedora u otra, habría que modificar la línea correspondiente.

Personalizar el Ambiente

La última modificación que debemos hacer al script es agregar o quitar (lo dudo) las aplicaciones que queremos darle al usuario. En el caso de Debian/Ubuntu deberíamos modifcar la línea 119.

Crear el primer usuario:
La forma más básica de crear el usuario es:

make_chroot_jail.sh gnu

En este caso creamos el usuario gnu que será un usuario enjaulado. Ahora intentemos ingresar al servidor y listemos algunos directorios para ver si todo esta en orden.

ssh gnu@servidorremoto.com
ls /

Si la salida del comando es la siguiente hemos creado exitosamente nuestra Jaula.

bin dev etc home lib sbin usr

Por defecto la jaula se creará en el directorio /home/jail. Este directorio se podría cambiar pasando argumentos al comando. Para ver lo que se puede hacer con este script podemos ejecutarlo de la siguiente forma

make_chroot_jail.sh | less

Si quisieramos podríamos crear varios usuarios dentro de la misma jaula.

Crear varias Jaulas ssh

Es muy probable que queramos tener varias usuarios y cada uno con su propio ambiente chroot. Esto es algo muy útil si alguien vende hosting y quiere que sus usuarios utilicen SFTP en lugar de FTP, aumentando mucho la seguridad para los usuarios y para el servidor. Para crear los usuarios en un ambiente distinto se les debe asignar un shell propio y un directorio donde estará la jaula.

Con un ejemplo se entiende mejor. Vamos crear 2 ambientes enjaulados. El primero tendrá su shell como /usr/local/bin/shelltuxs y su ambiente chroot estará en /jaulas/tuxs. El segundo tendrá su shell como /usr/local/bin/shellgnues y su ambiente chroot estará en /jaulas/gnues. Podríamos tener tantos ambientes enjaulados como quisieramos, pero cada uno deberá tener su propio shell. Los shells que estamos creando podríán estar en cualquier directorio y llamarse de cualquier forma. El script los creará.

Crear usuarios gnues y su ambiente

make_chroot_jail.sh gnu1 /usr/local/bin/shellgnues /jaulas/gnues/
make_chroot_jail.sh gnu2 /usr/local/bin/shellgnues /jaulas/gnues/
make_chroot_jail.sh gnu3 /usr/local/bin/shellgnues /jaulas/gnues/

Crear usuarios tux y su ambiente:

make_chroot_jail.sh tux1 /usr/local/bin/shelltuxs /jaulas/tuxs/
make_chroot_jail.sh tux2 /usr/local/bin/shelltuxs /jaulas/tuxs/
make_chroot_jail.sh tux3 /usr/local/bin/shelltuxs /jaulas/tuxs/

Listo hemos creado 2 ambientes enjaulados y cada ambiente enjaulado. La verdad esta mucho más fácil que hace algunos años atrás cuando hice esto por primera vez.

Algunas consideraciones.

Si bien este script nos facilita la vida, tiene algunas errores. Si se actualiza varias veces el mismo usuario, habría que revisar el archivo /etc/passwd tanto en el ambiente real como el enjaulado para que no tenga usuarios repetidos. Lo mismo se debería hacer con el comando visudo y borrar los usuarios repetidos.

Artículos relacionados

  • No existen artículos relacionados

15 pensamientos en “SSH/SFTP Enjaulado

  1. Esta todo muy bien explicado y muy sencillo, pero se me pantea el siguiente problema, y es que una vez terminado el proceso al intentar conectar con ssh al usuario enjaulado obtengo el siguiente error:

    su: cannot determine your user name

    He probado algunas cosas que he encontrado por google para solucionarlo pero nada, ¿que puede estar pasando?

    • Ivan es logico ya que el usuario de la jaula no debe de tener acceso por ejemplo a root, usa otro usuario (que no este dentro de la jaula)

      • Jumper gracias por la respuesta, pero creo que no me he explicado al ejecutar:

        ssh gnu@servidorremoto.com

        (Obiamente he creado el usuario gnu con el script) obtengo el siguiente error, en local o en remoto lo mismo da:

        su: cannot determine your user name

        Como imaginaras he seguido todo los pasos del tuto y estoy en un Ubuntu 11.10

      • Bueno me respondo a mi mismo, al parecer la linea 472 hace referencia a alguna librerias que en ubuntu 11 estan en /lib/i386-linux-gnu. Esto soluciono parte del problema ya que ahora me lanza otro error (module is unknow) ya trata de solucionarlo con la propuesta de fuschlberger pero na.
        El caso es que he probado en un debian y sin problemas a si que me da que lo voy ha hacer en debian.

      • si estas usando un servidor en producción deberías tener algo tipo debian estable o ubuntu 10.04 Sin embargo, va a tocar actualizar el artículo 😉

      • No no esta en producción son pruebas con el fin de poner algo en marcha, pero esto es nuevo para mi y estoy algo perdido, ahora parece que intenta buscar chroot-shell dentro de la jaula (al intentar contectar por ssh) y claro no lo encuentra, no se si esto es normal.

  2. Pues al final con Debían todo chuta como estaba previsto y como explicas en este fantástico y sencillo articulo.

    A si que gracias por todo y estaré atento por si actualizas el asunto para ubuntu 11.

  3. La jaula funciona pero solo para comandos basicos, intente agregar mas binarios como el gcc, cmake, make, openssl, y no funciona como lo puedo hacer que los usuarios puedan compilar sus aplicaciones
    agradeceria una pequeña ayuda

    saludos

  4. Que gusto leer estos comentarios en mi blog. Lamento no haber dado seguimiento al mismo y dudo mucho que tenga tiempo para actualizarlo. Si alguien hace funcionar esto en otras distribuciones, favor postee en algún lado y le ponemos el link aquí. El contenido de esto blog esta bajo CC – Share alike.

    Sobre la pregunta de Rodrigo, me parece mejor opción utilizar virtulizacion. Podrías probar con virtserver en donde creas máquinas virtuales pero usas el mismo kernel del anfitrión. Podrías hacer virtualización con KVM o XEN. Algo más fácil podría ser virtualbox.

    Saludos,

    Rafael

  5. Solo bajo lubuntu aparte de renombrar a los archivos necesarios según las versiones como menciones arriba, hay que cambiar la carpeta /lib a /lib/i386-linux-gnu si han instalado la versión global i386 (no 32 ni 64 bits)…

  6. Pingback: 11 Tips SSH | Rafael Bonifaz

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.