En nuestro mundillo hay muchos pero muchos secretos… honestamente no creo poder aprender lo suficiente como para conocer la mayoría, y esto está dado por el simple hecho de que Linux nos permite hacer tantas, pero tantas cosas que se nos hace difícil conocerlas todas.
Esta vez les explicaré cómo hacer algo sumamente útil, algo que muchos administradores de redes o sistemas hemos necesitado hacer, y se nos ha dificultado por simplemente no encontrar una vía medianamente simple de lograrlo:
Cómo enjaular usuarios que se conecten por SSH
¿enjaular? … WTF!
Sí. Si por algún motivo debemos darle acceso SSH a un amigo nuestro a nuestro ordenador (o servidor), siempre debemos cuidad por la seguridad y estabilidad del ordenador o servidor nuestro.
Sucede que hace poco quisimos darle acceso SSH a Perseo a un servidor nuestro, pero no podemos darle cualquier tipo de acceso pues tenemos ahí configuraciones de veras sensibles (hemos compilado muchas cosas, paquetes que hemos instalado individuales, etc…) y si alguien que no sea yo intenta hacer aunque sea el más mínimo cambio en el servidor, existe la posibilidad de que todo se vaya al traste jeje.
Entonces, ¿cómo crear un usuario con privilegios extremadamente limiados, tanto así que no pueda ni siquiera salir de su jaula (home)?
Empecemos descargando jailkit, una herramienta que nos permitirá hacer esto:
1. Primero debemos descargar a nuestro servidor JailKit.
wget http://ftp.desdelinux.net/jailkit-2.14.tar.gz
2. Luego debemos descomprimir el paquete y entrar en la carpeta que recién nos apareció:
tar xzf jailkit-2.14.tar.gz && cd jailkit-2.14
3. Posteriormente pasamos a compilar e instalar el software (les dejo screenshot):
./configure
make
make install
4. Listo, ya con esto está instalado. Ahora pasamos a crear la jaula que contendrá a los futuros usuarios, en mi caso la creé en: /opt/ y le llamé «jail», por lo que la ruta sería: /opt/jail :
mkdir /opt/jail
chown root:root /opt/jail
5. Ya la jaula está creada, pero no tiene todas las herramientas necesarias para que los futuros usuarios que estarán ahí puedan trabajar sin problemas. O sea, hasta este momento la jaula está creada, pero es solo una caja vacía. Ahora pondremos en la jaula algunas herramientas que los usuarios enjaulados necesitarán:
jk_init -v /opt/jail basicshell
jk_init -v /opt/jail editors
jk_init -v /opt/jail extendedshell
jk_init -v /opt/jail netutils
jk_init -v /opt/jail ssh
jk_init -v /opt/jail sftp
jk_init -v /opt/jail jk_lsh
6. Listo, la jaula existe y ya tiene las herramientas para que el usuario las use… ahora solo nos falta… el usuario!. Vamos a crear al usuario kira y lo pondremos en la jaula:
adduser kira
jk_jailuser -m -j /opt/jail kira
cat /etc/passwd | grep jk_chroot
Si notan que no les aparece nada así como en el screenshot, algo han debido de hacer mal. Dejen un comentario aquí y con mucho gusto les ayudaré.
7. Y listo, ya el usuario está enjaulado… pero, está TAN enjaulado, que no se puede conectar por SSH, pues cuando intenta conectarse el servidor no le deja:
8. Para permitir que el usuario se conecte debemos hacer un paso más.
Debemos editar el archivo etc/passwd de la jaula, o sea, en este caso sería /opt/jail/etc/passwd , en él comentamos la línea del usuario que creamos, y añadimos una nueva como:
kira:x:1003:1003::/home/kira:/bin/bash
O sea, nos quedaría así el archivo passwd:
root:x:0:0:root:/root:/bin/bash
#kira:x:1003:1003:,,,:/opt/jail/./home/kira:/usr/sbin/jk_lsh
kira:x:1003:1003::/home/kira:/bin/bash
Noten bien los signos de puntuación duplicados y demás, es importante no soltarnos ninguno
Luego de hacer esto, ya el usuario podrá entrar sin ningún tipo de problema
Y esto es todo.
La herramienta que usamos para todo esto (jailkit) usa en el backend chroot, que es en realidad lo que casi todos los tutoriales usan. No obstante usando JailKit se hace más simple enjaular
Si alguien presenta algún problema o algo no va bien, que deje tantos detalles como le sea posible, no me considero un experto pero sí le ayudaré en todo lo que pueda.
entonces seria algo así como los permisos en FTP? interesante
siempre sales con cada cosa que ni siquiera sabia que existía, como lo de los usuarios en mysql xD
No precisamente, porque SSH no es lo mismo que FTP. SSH es una shell, o sea, una terminal… estarías en una terminal en otro ordenador o servidor, podrías ejecutar comandos, iniciar procesos, etc… harías tanto como el administrador del server te permita 😉
jajajajajaja nah venga, lo que pasa es que yo publico cosas más técnicas… o sea, que me gusta publicar cosillas que no son tan populares y sí interesantes. Por ejemplo, yo personalmente no pienso publicar algo el día que el nuevo Ubuntu salga, porque considero que muchos ya hablarán de eso… no obstante, de esto que lees acá en el post, no es algo que se lea todos los días o no? 😀
Muy buenos aportes gracias
también hay un protocolo que se llama sftp que es ftp y Secure Shell juntos,aunque no es lo mismo que ejecutar FTP sobre SSH :\
Saludos
Sí sí en efecto, pero al enjaular SSH automáticamente enjaulo a quien se conecte usando SFTP, pues como bien dices, SFTP es en realidad SSH+FTP 😀
Saludos
No se ven las imágenes!!! 🙁
Un pequeño error mío jeje, dime ahora 😀
Listo. Gracias 😀
muy bueno, lo apunto a mis favoritos para tenerlo disponible cuando lo necesite jejeje
Gracias, cualquier duda o problema acá estamos para ayudarte 🙂
Tienen a Perseo enjaulado. http://i.imgur.com/YjVv9.png
LOL
xD
Que tal.
Sabes, es un tema del cual no estoy muy familiarizado y que había estado checando en BSD (PC-BSD y Ghost BSD) y me parece muy interesante y con funionalidades que pueden ser muy utiles.
Voy a guardarlo para referencias y lo checare con la docu de los BSD. Gracias por el dato.
Tampoco yo estuve familiarizado con esto pues nunca pensé en darle acceso SSH a alguno de mis servers a alguien jaja, pero cuando me encontré con la necesidad de hacerlo, quise dar acceso pero sin que exista la posibilidad de que por equivocación alguien haga algo que no debe 😀
Nunca he probado esto en sistemas BSD, por lo que no te puedo decir que funcionará, pero si buscas por cómo hacer chroot en BSD, algo te debe salir 😉
Gracias por el comentario amigo 🙂
Hola,yo uso FreeBSD y claro jailkit funciona de hecho esta en los ports
Lo instalas con este comando
cd /usr/ports/shells/jailkit/ && make install clean
O por paquete ftp
pkg_add -r jailkit
Solo que en la configuración (kira:x:1003:1003::/home/kira:/bin/bash)
Necesitas añadir tcsh o sh,amenos de que hayas instalado bash y añadir esta ruta
/usr/local/bin/bash
Y unos cuantos detalles mas,en Ghost BSD debe ser el proceso parecido incluso mas sencillo al estar basado en FreeBSD
Saludos
Genial, lo estaba buscando; sabes si funciona en Centos??; gracias.
No lo he probado en Centos, pero sí, debería funcionar 😀
De hecho creo recordar que varios han usado esta misma herramienta en servidores Centos y Red Hat 😉
Muchas gracias. Se va directamente a marcadores.
Gracias a tí por comentar 🙂
Muy buen «truco», super útil para administradores de sys. Pero mejor aun exelentemente bien redactado. Que mas se puede pedir.
Muchas gracias por el aporte.
Gracias, de vers muchísimas gracias por tu comentario 😀
Saludos
Alabado sea SSH jaja
Una vez intenté hacer una jaula para ssh pero al estilo tradicional y la verdad que nunca me salio correctamente. Si andaba la jaula no tenia ni bash, o sea se conectaba y ahi nomas quedaba jaja si le andaba la shell podia subir en le jerarquía de directorios y montón de quilombos más jaja pero este jailkit es una maza, te automatiza todas esas cosas… Altamente recomendado
jaja gracias.
Sí, en realidad SSH es todo una maravilla por lo que nos permite, que en realidad no es más que lo que permite el sistema así que… un hurra por Linux! … jaja.
Hola, una duda!
porque cambiar el home de (1)/opt/jail/./home/kira a (2)/home/kira
Debemos editar el archivo etc/passwd de la jaula, o sea, en este caso sería /opt/jail/etc/passwd , en él comentamos la línea del usuario que creamos, y añadimos una nueva como:
kira:x:1003:1003::/home/kira:/bin/bash
O sea, nos quedaría así el archivo passwd:
root:x:0:0:root:/root:/bin/bash
(1)#kira:x:1003:1003:,,,:/opt/jail/./home/kira:/usr/sbin/jk_lsh
(2)kira:x:1003:1003::/home/kira:/bin/bash
Hola 🙂
Si no se pone eso el acceso SSH no funciona, el usuario intenta conectarse pero es expulsado automáticamente … parece ser un bug o problema con el intérprete que trae el JailKit, pues al hacer este cambio indicándole que use el bash normal del sistema, funciona todo.
Aun me cierra la sesion ssh :C
Suse 10.1 x64
Hola he instalado esto y funciona excelente mente muy bien en centos =D
pero mi dua es como ago para agregar mas comandos por ejemplo a un usuario jail
no puede ejecutar el comando svn co http://pagina.com/carpeta
osea este comando no existe para los usuarios jail en este caso como ago para agregar estos comandos al jail y hay muchos mas que requiero agregar.
Hola que tal 🙂
Si deseas habilitar el comando «svn» en el Jail tienes el comando jk_cp
O sea:
jk_cp /opt/jail/ /bin/svn
Esto suponiendo que el binario o ejecutable de svn sea: /bin/svn
Y que la Jaula/Jail sea: /opt/jail/
Te encontrarás con comandos que dependen de otros, o sea que si agregas el comando «pepe» verás que debes además agregar a «federico», pues «pepe» depende de «federico» para ejecutarse, si encuentras esto entonces agregas los comandos necesarios y ya 😉
Eso es es excelente estoy probandolo a hora mismo ya les digo que paso muchas gracias =D
Suerte 😀
he logrado hacer lo que me dijistes pero de esta forma y automatica mente me lo ha detectado sin ningn problema este fue el comando que he utilizado para poder usar el subverision.
jk_cp -j /home/jaul svn
bueno igual uso centos xP y pues a lo mejor es diferente pero bueno
a hora quisiera saber cuales son las librerias como la de svn pero ahora quisiera compilar por que digamos que necesito usar un comando asi
./configure y marca error
./configure.lineno: line 434: expr: command not found
no sabria cuales son las librerias ya tengo instalado lo que es mysql y demas si compila fuera de la jail pero no dentro de la jaui.
perdon por las molestias.
pd: deverias colocar en la guia lo que te dije sobre el comando usado en centos =) saludos.
Mira, cuando te diga que no puede encontrar un comando (como acá) lo primero es encontrar el comando:
whereis expr
Una vez encontrado (/usr/bin/expr y /usr/bin/X11/expr) lo copiamos al Jail con jk_cp 😉
Intenta esto a ver.
Sip, ya edito el post y agrego que funciona en Centos 😀
Genial, muchas gracias (:
Gracias por el aporte…
hola cm estan
Joder tio! Desde Chile mis saludos. Estas tan pedo como yo! jajaja!. Abrazos. Me ha sido de gran ayuda tu post!
Gracias a tí por tu comentario 😀
Muchas gracias por el post, me ayudo mucho, pero lamentablemente en la parte de
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Debemos editar el archivo etc/passwd de la jaula, o sea, en este caso sería /opt/jail/etc/passwd , en él comentamos la línea del usuario que creamos, y añadimos una nueva como:
kira:x:1003:1003::/home/kira:/bin/bash
O sea, nos quedaría así el archivo passwd:
root:x:0:0:root:/root:/bin/bash
#kira:x:1003:1003:,,,:/opt/jail/./home/kira:/usr/sbin/jk_lsh
kira:x:1003:1003::/home/kira:/bin/bash
//////////////////////////////////////////////////////////////////////////////////////////
Me causa igual error, osea, lo dejo tal y como esta, y me bota del terminal al conectarme,,, .., Comento la linea y agrego una más modificandola como indicas, y tambien me bota….
Instale la última versión «jailkit-2.16.tar», inclusive cree un script para ahorrar el tiempo, aca esta a continuaciòn:
//////////////////////////////////////////////////////////////////////////////////////////////
#!/bin/bash
wget http://olivier.sessink.nl/jailkit/jailkit-2.16.tar.gz
tar -zxvf jailkit-2.16.tar.gz
cd jailkit-2.16
./configure
make
make install
exit
/////////////////////////////////////////////////////////////////////////////
Obviamente primero se logean como «root»…
Como podría resolver el error amigo ????
Disculpa, ya me salio, habia cometido un error sobre la carpeta Home, pero tengo una gran duda, como puedo hacer para q me deje ejecutar el comando «screen», , trato de usarlo (en el usuario enjaulado), pero no funciona… otra cosa es que,, como ago para que este usuario enjaulado pueda ejecutar el programa wine sobre un exe q acaba de poner dentro de su home,, como seria?
hola, muy buen tuto! soy nuevo en estos ambientes, tengo una pregunta…
en cuanto a seguridad, veo que en su raiz tiene muchos folders, son necesarios? solo quiero que tenga acceso a su folder (ftp-subir y ssh-ejecutar) para que ejecute una aplicacion, que folders podria borrar de raiz? o no me representa peligro alguno? agradezco de antemano tu ayuda, saludos!
@KZKG^Gaara, menos mal que pusistes el error de wheezy pero ya con la version de jailkit-2.16.tar.gz que me sugeristes lo arreglaron
http://olivier.sessink.nl/jailkit/jailkit-2.16.tar.gz
Creo me lo pasare a un PDF, jojo.. a enjaular y gracias wn 😀
Saludos amigo, tengo una duda:
Supongamos que tenemos un usuario de nombre «prueba».
La duda es, el archivo /home/prueba/.ssh/known_hosts que se localiza en el home de ese usuario, es el mismo archivo este o no enjaulado el usuario?
Probe esto. Se puede con este metodo restringir la navegación a los otros home de los demas usuarios.
Antes que nada, gracias por el post! Me está siendo de gran utilidad; pero tengo dos dudas, y éstas surge del escenario que tengo:
Necesito crear N usuarios con acceso independiente y privado a su home, cada usuario sólo puede acceder a su home para depositar, modificar y eliminar archivos ahí contenidos sin tener que andarse moviendo a otros (Este punto ya lo tengo). No requiere de acceso vía ssh.
1. ¿Se tiene que crear una jaula para cada usuario o bien, hay manera de tener en la misma jaula los distintos usuarios pero que cada uno tenga su directorio «privado»?
2. Al accesar (vía cliente FTP) se muestran todos los directorios creados por la herramienta, hay forma de que se muestre la carpeta en limpio? O algo hice mal en el camino?
Excelente tutorial! Me ha sido de gran ayuda, lo estoy probando con la versión 2.17 en Ubuntu 14.04 y funciona muy bien. Ahora tengo el siguiente reto, una vez enjaulado el usuario para que no pueda moverse a ninguna ruta, quiero que solo pueda ver el contenido de un archivo que esta en otra ruta. Intente con un enlace simbólico pero al intentar hacer un tail o un cat a esta archivo me dice que no existe aunque al acceder con el usuario puedo listar ese archivo en el home de la jaula.
Si pudieses ayudarme estaría muy agradecido, de antemano gracias
Hola, he seguido todo el manual y al iniciar sesión con ssh se cierra automáticamente, trazas:
Dec 4 19:20:09 toby sshd[27701]: Accepted password for prueba from 172.16.60.22 port 62009 ssh2
Dec 4 19:20:09 toby sshd[27701]: pam_unix(sshd:session): session opened for user prueba by (uid=0)
Dec 4 19:20:09 toby jk_chrootsh[27864]: now entering jail /opt/jail for user prueba (1004) with arguments
Dec 4 19:20:09 toby sshd[27701]: pam_unix(sshd:session): session closed for user prueba
Gracias
No cuando hago el ultimo paso de dar acceso a ssh al usuario aun me cierra la conexion 🙁
Se puede talvez desde este usuario creado cambiar a root? su -root? no me deja. Como seria Gracias por tu ayuda
Mil gracias por el tutorial, lo necesitaba para crear un usuario que pudiera utilizar el clonezilla para realizar una imagen y copiarla a un servidor ajeno pero que no pudiese pulular por donde quisiera
Buenas! estaria necesitando saber algo.
¿Es posible ingresar como ROOT usando FTP y teniendo dichos permisos, para administrarlo por FTP y no con SSH? digamos como creando una conexion, estilo tunel o algo asi ¿Como se hace? ¿Configurando el achivo VSFTPD?
Muchas Gracias!