Cómo enjaular (jail) a usuarios que se conecten por SSH

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:

Todos los comandos siguientes son ejecutados como root

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

./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

Nota: Ejecuten el siguiente comando en una terminal y deben tener un resultado similar al que muestro en el screenshot:

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 😉

Importante!: Esto ha sido probado en Debian Squeeze (6) y Centos y ha funcionado al 100%, probado en Debian Wheezy (7) y también ha funcionado, aunque con un pequeño detalle, que no se muestra el nick del usuario en el ssh, pero no pierde funcionalidad alguna.

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.


Deja tu comentario

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

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   v3on dijo

    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

    1.    KZKG^Gaara dijo

      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? 😀

      1.    Damian Rivera dijo

        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

        1.    KZKG^Gaara dijo

          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

  2.   Giskard dijo

    No se ven las imágenes!!! 🙁

    1.    KZKG^Gaara dijo

      Un pequeño error mío jeje, dime ahora 😀

      1.    Giskard dijo

        Listo. Gracias 😀

  3.   Rots87 dijo

    muy bueno, lo apunto a mis favoritos para tenerlo disponible cuando lo necesite jejeje

    1.    KZKG^Gaara dijo

      Gracias, cualquier duda o problema acá estamos para ayudarte 🙂

  4.   Manuel de la Fuente dijo

    Tienen a Perseo enjaulado. http://i.imgur.com/YjVv9.png

    1.    proper dijo

      LOL
      xD

  5.   jorgemanjarrezlerma dijo

    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.

    1.    KZKG^Gaara dijo

      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 🙂

      1.    Damian Rivera dijo

        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

  6.   adiazc87 dijo

    Genial, lo estaba buscando; sabes si funciona en Centos??; gracias.

    1.    KZKG^Gaara dijo

      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 😉

  7.   cyberalejo17 dijo

    Muchas gracias. Se va directamente a marcadores.

    1.    KZKG^Gaara dijo

      Gracias a tí por comentar 🙂

  8.   MVAltamirano dijo

    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.

    1.    KZKG^Gaara dijo

      Gracias, de vers muchísimas gracias por tu comentario 😀
      Saludos

  9.   LiGNUxero dijo

    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

    1.    KZKG^Gaara dijo

      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.

  10.   nwt_lazaro dijo

    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

    1.    KZKG^Gaara dijo

      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.

      1.    Omar Ramirez dijo

        Aun me cierra la sesion ssh :C
        Suse 10.1 x64

  11.   Alexitu dijo

    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.

    1.    KZKG^Gaara dijo

      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 😉

      1.    Alexitu dijo

        Eso es es excelente estoy probandolo a hora mismo ya les digo que paso muchas gracias =D

        1.    KZKG^Gaara dijo

          Suerte 😀

  12.   Alexitu dijo

    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.

    1.    KZKG^Gaara dijo

      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 😀

  13.   adiazc87 dijo

    Genial, muchas gracias (:

  14.   Jesus dijo

    Gracias por el aporte…

  15.   yeli dijo

    hola cm estan

  16.   djfenixchile dijo

    Joder tio! Desde Chile mis saludos. Estas tan pedo como yo! jajaja!. Abrazos. Me ha sido de gran ayuda tu post!

    1.    KZKG^Gaara dijo

      Gracias a tí por tu comentario 😀

  17.   Daniel P Z dijo

    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 ????

    1.    Daniel P Z dijo

      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?

  18.   leonel dijo

    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!

  19.   CubaRed dijo

    @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

  20.   Algabe dijo

    Creo me lo pasare a un PDF, jojo.. a enjaular y gracias wn 😀

  21.   Samuel dijo

    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?

  22.   Richart dijo

    Probe esto. Se puede con este metodo restringir la navegación a los otros home de los demas usuarios.

  23.   TZBKR dijo

    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?

  24.   eduardlh dijo

    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

  25.   yas dijo

    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

  26.   Omar Ramirez dijo

    No cuando hago el ultimo paso de dar acceso a ssh al usuario aun me cierra la conexion 🙁

  27.   Benj dijo

    Se puede talvez desde este usuario creado cambiar a root? su -root? no me deja. Como seria Gracias por tu ayuda

  28.   Slevin dijo

    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

  29.   Mauro dijo

    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!