Configurar SFTP con OpenSSH

20 noviembre 2013 at 15:54 by Adrián Pérez

seguridadHoy toca ver cómo configurar openSSH (como siempre, en entornos Red Hat) para aceptar únicamente peticiones SFTP enjaulando a los usuarios sftp en sus homes. Para añadirle contenido, además, configuraremos este servicio en un segundo proceso que correrá en la máquina de forma independiente al proceso openssh habitual, para evitar tener problemas con nuestras conexiones SSH, y por tanto, se configurará un puerto de escucha diferente al habitual, en el ejemplo, el 12022.

Fichero de configuración

En primer lugar copiaremos el fichero de configuración de openssh para adaptar la copia a nuestras necesidades:

[root@myserver]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_12022
Lo abriremos con vi, y nos aseguraremos de cambiar el puerto de escucha por el nuevo puerto. Además, cambiaremos el "Subsystem sftp" por defecto y añadiremos al final las líneas correspondientes al enjaulado de usuarios:
# Cambiamos el puerto
Port 12022
 
# Modificamos el Subsystem original
#Subsystem sftp /usr/libexec/openssh/sftp-server 
Subsystem sftp internal-sftp 
 
# Añadimos el enjaulado 
Match Group sftp12022 
  ChrootDirectory /sftp/%u
  ForceCommand internal-sftp 
  AllowTcpForwarding no
Desde este momento, trabajaremos con el nuevo fichero de configuración sshd_config_12022, asegurándonos así de no intervenir en el servicio de openssh de la máquina que ofrece el servicio de SSH. Además de decirle a openssh que a partir de ahora usaremos el puerto 12022 para las coneciones SFTP, habremos definido que se enjaulará a todos los usuarios de sistema cuyo grupo principal sea el grupo "sftp12022". Además, estaremos enjaulando a todos estos usuarios en el directorio /sftp/nombreusuario.

Cambios en el sistema

El siguiente paso, por lo tanto, será añadir el grupo "sftp12022", al cual pertenecerán todos los usuarios que quieran conectar por SFTP y que deban quedar enjaulados.
[root@myserver]# groupadd sftp12022
A continuación, crearemos el directorio de enjaulado, que deberá pertenecer a root:root, con permisos 755, que es lo que tendrás por defecto si estás ejecutando el comando como "root". Dentro de este directorio crearemos las homes de los usuarios:
[root@myserver]# mkdir /sftp
Ahora ya podrás ejecutar el nuevo proceso sshd pasándole el nuevo fichero de configuración:
[root@myserver]# /usr/sbin/sshd -f /etc/ssh/sshd_config_12022
Verás, con "netstat -natp" que tienes un nuevo puerto de escucha, el 12022, independiente del 22 y con pid diferente, al tratarse de dos procesos diferentes e independientes:
[root@myserver]# netstat -natp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2228/sshd
tcp 0 0 0.0.0.0:12022 0.0.0.0:* LISTEN 13007/sshd

Usuarios SFTP

Ahora estaremos listos para crear nuestros usuarios SFTP. Para ello, como ejemplo crearemos un usuario llamado "joe", que deberá pertenecer al grupo "sftp12022" para quedar enjaulado, y cuya home será /sftp/joe/joe. No tendrá shell y por tanto no podrá conectar mediante SSH, únicamente mediante SFTP.
En primer lugar, deberemos crear el directorio /sftp/joe, que pertenecerá a root:
[root@myserver]# mkdir /sftp/joe
A continuación crearemos el usuario
[root@myserver]# useradd -g sftp12022 -d /joe -s /sbin/nologin joe
[root@myserver]# passwd joe
Una vez creado el usuario, se habrá creado su home en /joe, que no es lo que queremos. Queremos que su home esté en /sftp/joe/joe. Ésto es así, por razones de seguridad, para prevenir una escalada de privilegios. La idea es enjaular a todos los usuarios en /sftp/%u, donde %u=username. Éste directorio deberá pertenecer a root:root y tener como permisos 755 o 750 para cumplir con las normas de seguridad de openssh, lo cual implicaría que el propio usuario no tendría permisos de escritura sobre su propia home. Ésto nos obliga a tener un nuevo directorio dentro de /sftp/%u que también llamaremos como el username y que sí que pertenecerá al propio usuario, permitiéndole así escribir. Para ello, crearemos el directorio y le daremos permisos:
[root@myserver]# mkdir /sftp/joe/joe
[root@myserver]# chown joe:sftp12022 /sftp/joe/joe

Lo malo de hacerlo así, es que efectivamente, a pesar de que el usuario no tendrá home de conexión SSH, porqué no conectará por SSH, su home se habrá creado en la raíz ( /joe ). Bajo mi punto de vista es un poco engorro tener las homes de los usuarios SFTP en la raíz, pero no he encontrado una solución a este problema. Si no vas a usar la autentificación de usuarios mediante clave pública, quizá sea una buena idea eliminar las homes de la raíz, puesto que no deberías necesitarlas. Update: Para ello, símplemente puedes crear el usuario con la opción "-M", lo cual no creará la home del usuario durante su alta:

[root@myserver]# useradd -g sftp12022 -M -d /joe -s /sbin/nologin joe

Conexión desde cliente

El cliente, podrá conectar por sftp indicando el puerto en cuestión:
[joe@myworkstation]$ sftp -P 12022 joe@80.80.80.81

La conexión le ubicará dentro de /sftp/joe/joe, con lo que tendrá permisos de escritura, y además quedará enjaulado en /sftp/joe. Es decir, el usuario podrá hacer un único "cd.." hasta ubicarse en /sftp/joe, pero no podrá salir de ahí. Como por defecto el usuario se conecta a /sftp/joe/joe, tendrá todos los permisos y habrá quedado enjaulado y controlado.

De nuevo recalcar que el usuario tampoco podrá conectar por SSH al no tener una shell válida.

Ejecución al inicio

A falta de configurar el correspondiente script de inicio, podremos meter en el rc.local la instrucción para lanzar el nuevo sshd. Para ello, símplemente añadiremos la siguiente línea al final del fichero /etc/rc.local:

/usr/sbin/sshd -f /etc/ssh/sshd_config_12022

FUENTES:
http://www.thegeekstuff.com/2012/03/chroot-sftp-setup/

https://wiki.archlinux.org/index.php/SFTP-chroot

Flickr! Foto por bulldog1