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

50
15917

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

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

50 COMENTARIOS

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

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

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

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

  5. 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 😉

  6. 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 😀

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

  8. 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!

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

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

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

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

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

  14. 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!

Dejar una respuesta