En ocasiones tenemos el requerimiento de habilitar cuentas para el uso de servicio SFTP en sistemas Linux, pero a la vez que estos sean usuarios únicamente dedicados a ese fin y que no puedan acceder a la shell por otros medios. Vamos a ver en el Cybertruco de hoy como podemos conseguir esto facilmente en Linux modificando el servicio sshd.

sftp

 

SFTP (SSH File Transfer Protocol) es un servicio que suele estar activado por defecto sin necesidad de configuraciones extra, pero tenemos el problema que por defecto los usuarios tienen también acceso a shell. Como es el caso, únicamente queremos que ciertos usuarios tengan acceso por SFTP evitando que puedan acceder a una shell.

Habilitar cuentas de usuario dedicadas de SFTP

Vamos a ver cómo en pocos pasos podemos configurar esto. Las instrucciones siguientes estàn probadas en CentOS pero deben servir con pequeños ajustes (si alguno) en cualquier distribución reciente de Linux. Para ello, primero, necesitaremos un usuario que pueda ejecutar comandos con sudo.

Creación de grupo de usuarios dedicado

El primer paso es crear un nuevo grupo de usuarios al que posteriormente daremos acceso en el servicio sshd, para ello usamos el comando groupadd

Sudo groupadd sftpusers

Seguidamente crearemos los usuarios que necesitemos con el comando useradd, especificando que su grupo principal sea el anteriomente creado y posteriormente creamos su contraseña.

Sudo useradd -g sftpusers usuario1
Sudo passwd usuario1

Crear directorio dedicado para el SFTP

En este momento tenemos diferentes opciones, podemos crear un acceso a una carpeta única por cada usuario, por ejemplo localizada en su home. Pero el fin que buscamos es tener una carpeta compartida fuera de /home y para ello crearemos el siguiente directorio

Sudo mkdir -p /var/sftp/uploads

Necesitamos que la carpeta “raiz” en este caso /var/sftp pertenezca como usuario a root pero como grupo a sftpusers. Además tendremos que modificar los permisos de grupo que por defecto serían 755 lo cual no permitiría a posteri a los usuarios crear documentos. Por lo que comenzamos con el comando chown para establecer el dueño de la carpeta, luego el comando chgrp para cambiar el grupo dueño de la carpeta y por último el chmod para los permisos.

Sudo chown root:root /var/sftp
Sudo chgrp sftpusers /var/sftp
Sudo chmod 775 /var/sftp/uploads

Modificar la configuración del servicio sshd

Ahora necesitamos editar la configuración del servicio sshd, para ellos podemos usar editores como nano o vi, en este caso usamos vi ,por preferencia personal.

Sudo vi /etc/ssh/sshd_config

Una vez dentro buscamos la linea que contiene el texto

Subsystem sftp /user/libexec/openssh/sftp-server

La comentamos con una # al principio y justo debajo escribimos

Subsystem sftp internal-sftp

Aparte de esto, buscamos la linea

X11Forwarding yes

Y la comentamos también. Por último bajamos hasta el final del fichero y añadimos las siguientes líneas, que explicamos más abajo

Match Group sftpusers
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
ChrootDirectory /var/sftp/

Con Match Group especificamos que solo se apliquen los comandos posteriores a los usuarios miembros del grupo sftpusers. Alternativamente podríamos haber usado Match User y especificar uno o varios usuarios.
Con ChrootDirectory lo que hacemos es especificar un directorio base, más abajo del cual no puede pasar el usuario conectado a través de sftp. En caso de haber querido restringir a la home del usuario podríamos haber usado algo como “ChrootDirectory %h”
Finalmente con AllowAgentForwarding, AllowTcpForwarding y X11Forwarding lo que hacemos es evitar el port forward, tunneling y X11 forward para esos usuarios.

Guardamos el fichero y reiniciamos el servicio con

sudo systemctl restart sshd.service

Llegados a este punto ya deberíamos poder conectar al servicio con las especificaciones buscadas. Si probamos a conectarnos por ssh con cualquiera de los usuarios creados podemos ver como no nos lo permite.