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.
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?
Gracias por la informacion, me fue de mucha utilidad ! , caso contrario de la configuracion que debian da sobre jail.
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.
Rafel Bonifaz
Gracias por la informacion, me fue de mucha utilidad ! , caso contrario de la configuracion que debian da sobre jail.
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.
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
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
Rafael,
Una vez metido el usuario en la jaula, como lo quito???
Saludos,
Hola puedes hacer un tutorial para novatos, de como enjaular usuarios en servidor web suse
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)…