sábado, 14 de marzo de 2015

Jaula ssh para transferencia de archivos

SSH ha demostrado ser de gran versatilidad, ofrece terminal remota, copia de archivo, encapsulamiento de tráfico y todo de manera cifrada para proteger la privacidad. En esta entrada veremos como configurar el servicio para que a un grupo de usuarios les permita únicamente transferir archivos a partir de una carpeta sin que tenga posibilidad de explorar los niveles superiores en el árbol de directorios.

El escenario
Para comprender mejor los pasos que se van a realizar se asumirán las siguientes condiciones:
  • Los usuarios a los cuales se le aplicará la jaula serán: “foo” y “bar” (disculpen el cliché ;-) )
  • Ambos usuarios tendrán como grupo principal “transarchivos”
  • Los usuarios antes mencionados no deben explorar libremente el árbol de directorios
  • Los usuarios antes mencionados no deben de tener acceso a una consola
  • El servidor será Debian GNU/Linux 7.x (aunque la mayoría de los pasos aplican para otras distribuciones)
Manos a la obra
  1. Asumiremos que el directorio donde se hará la jaula será /srv/transarchivos, más arriba de este directorio los usuarios enjaulados no podrán subir, es decir, este directorio será su raíz (/). Es importante acotar que este directorio debe ser propiedad de root, adicionalmente solo root debe de poder escribir directamente en él, de lo contrario sshd se negará a enjaular los usuarios cortando la conexión.
     root@elservidor:~# mkdir /srv/transarchivos  
     root@elservidor:~# chown root:root /srv/transarchivos  
     root@elservidor:~# chmod 755 /srv/transarchivos  
    
  2. Instalamos el servidor ssh
     root@elservidor:~# aptitude install openssh-server
    
  3. A continuación se creará el grupo “transarchivos” para luego crear los usuarios que pertenecerán a él
     root@elservidor:~# groupadd transarchivos
     root@elservidor:~# useradd -g transarchivos foo
     root@elservidor:~# useradd -g transarchivos bar
    
  4. El siguiente paso es configurar el servidor ssh para que coloque en una jaula a todos los usuarios del grupo transarchivos, para esto se abre con el editor de texto favorito y con permisos de root el archivo “/etc/ssh/sshd_config” y se coloca al final del archivo el siguiente bloque de texto
     Match Group transarchivos
        X11Forwarding no
        AllowTcpForwarding no
        ChrootDirectory "/srv/transarchivos"
    
  5. En el mismo archivo /etc/ssh/sshd_config nos aseguramos de cambiar la línea que dice “Subsystem ftp /usr/libexec/sftp-server” por “Subsystem sftp internal-sftp”
  6. Seguidamente indicamos al servidor ssh tomar los cambios realizados
     root@elservidor:~# service sshd reload
    
  7. Ahora cada vez que los usuarios foo y bar entren al sistema por ssh, serán llevados a su directorio home pero dentro de la jaula, estos directorios debemos crearlos y asignarlos a la configuración de los usuarios
     root@elservidor:~# mkdir /srv/transarchivos/foo
     root@elservidor:~# chown foo: /srv/transarchivos/foo
     root@elservidor:~# usermod -d /foo foo
     root@elservidor:~# mkdir /srv/transarchivos/bar
     root@elservidor:~# chown bar: /srv/transarchivos/bar
     root@elservidor:~# usermod -d /bar bar
    
  8. Para que los usuarios puedan entrar por sftp al servidor, solo falta asignarles una clave válida
     root@elservidor:~# passwd foo
     Introduzca la nueva contraseña de UNIX: clavesupersecreta
     Vuelva a escribir la nueva contraseña de UNIX: clavesupersecreta
     root@elservidor:~# passwd bar
     Introduzca la nueva contraseña de UNIX: distintaclavesecreta
     Vuelva a escribir la nueva contraseña de UNIX: distintaclavesecreta
    
  9. Con esto está todo listo, solo una aclaratoria más: si uno de los usuarios intenta tener acceso a una terminal por ssh al servidor, se cerrará la conexión, esto es porque luego de autenticar el usuario, el sistema tratará de ejecutar el shell al usuario (normalmente este es /bin/sh o /bin/bash) pero estos binarios no existen dentro de la jaula (por ejemplo /srv/transarchivos/bin/bash), solo para dejar claro que intencionalmente no se quiere que los usuarios tengan una terminal por ssh se recomienda asignar /usr/sbin/nologin como shell para las cuentas enjauladas
     root@elservidor:~# usermod -s /usr/bin/nologin foo
     root@elservidor:~# usermod -s /usr/bin/nologin bar
    

No hay comentarios.:

Publicar un comentario