Usuarios chrooted para SFTP

Cada vez se usa menos el acceso FTP y más el de SFTP por simples razones de seguridad. Pero los usuarios del sistema por defecto tienen acceso a ver todo.

Es por esto que puede ser interesante tener usuarios que estén limitados sólo a determinadas carpetas. Por ejemplo, si tienes varios sitios web de varios usuarios y no quieres que un usuario sea capaz de ver los datos de los demás.

Este tutorial ha sido creado en un VPS de Clouding.io. Puedes crear tu propio VPS desde 3€/mes.

Además, tienes la posibilidad de crear tu VPS con la imagen de WordPress en un clic.

COLABORACIÓN

Limitar el acceso SSH

Lo primero que haremos será limitar el acceso de los usuarios a las carpetas correspondientes. Los vamos a juntar todo en el grupo sftp.

addgroup sftp

Una vez creado el grupo, haremos cambios en el servidor de SSH.

Editaremos el fichero de configuración:

vim /etc/ssh/sshd_config

Buscaremos el código siguiente:

Subsystem sftp /usr/lib/openssh/sftp-server

Y lo sustituiremos por:

Subsystem sftp internal-sftp

Posteriormente añadiremos una serie de reglas para los usuarios de este grupo:

Match Group sftp
  ChrootDirectory %h
  ForceCommand internal-sftp
  AllowTCPForwarding no
  PasswordAuthentication yes

Una vez acabemos, reiniciaremos el servicio y validaremos que funciona.

systemctl restart sshd
systemctl status sshd

Copiando el sistema

Como sólo vamos a dejar que los usuarios accedan a una serie limitada de carpetas, también necesitamos que algunos programas funcionen. Es por esto que deberemos crear una estructura copiada del sistema.

En este ejemplo vamos a crear una carpeta para alojar todo en /webs/.

mkdir -p /webs/

Validaremos que existen una serie de carpetas reales (no las simbólicas).

ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty}

que devolverá algo similar a esto:

crw-rw-rw- 1 root root 1, 3 jun 25 14:47 /dev/null
crw-rw-rw- 1 root root 1, 8 jun 25 14:47 /dev/random
lrwxrwxrwx 1 root root   15 jun 25 14:47 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root   15 jun 25 14:47 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root   15 jun 25 14:47 /dev/stdout -> /proc/self/fd/1
crw-rw-rw- 1 root tty  5, 0 jun 25 14:47 /dev/tty
crw-rw-rw- 1 root root 1, 5 jun 25 14:47 /dev/zero

Copiaremos algunas de las carpetas a nuestro nuevo lugar raíz.

mkdir -p /webs/dev/
mknod -m 666 /webs/dev/null c 1 3
mknod -m 666 /webs/dev/random c 1 8
mknod -m 666 /webs/dev/tty c 5 0
mknod -m 666 /webs/dev/zero c 1 5

Limitaremos el acceso a eta carpeta sólo a root y lo validaremos. Es importante que los permisos completos sean sólo al propietario y no al grupo, por lo que usaremos 0755.

chown root: /webs
chmod 0755 /webs
ls -ld /webs

Copiaremos el Bash.

mkdir -p /webs/bin
cp -v /bin/bash /webs/bin

Deberemos copiar algunas bibliotecas. Primero crearemos la estructura de carpetas.

mkdir -p /webs/lib/
mkdir -p /webs/lib64/
mkdir -p /webs/lib/x86_64-linux-gnu/

Y validaremos que existen una serie de ficheros.

ll /lib/x86_64-linux-gnu/{libtinfo.so.*,libdl.so.*,libc.so.*,ld-linux-x86-64.so.*}
ldd /bin/bash

Copiaremos los ficheros correspondientes.

cp -v /lib/x86_64-linux-gnu/{libtinfo.so.*,libdl.so.*,libc.so.*} /webs/lib/
cp -v /lib64/ld-linux-x86-64.so.* /webs/lib64/
cp -va /lib/x86_64-linux-gnu/libnss_files* /webs/lib/x86_64-linux-gnu/

Finalmente, haremos una copia de los permisos de usuario.

mkdir -p /webs/etc/
cp -vf /etc/{passwd,group} /webs/etc/

Con esto tendremos todo lo necesario para que los usuarios puedan conectarse por SFTP e interactuar con la subida y bajada de ficheros.

Creando un usuario

Los usuarios los crearemos para que sólo tengan acceso a esta carpeta /webs/ que hemos creado y que pertenezcan al grupo sftp.

useradd usuarioejemplo -m -d /webs/usuarioejemplo -G sftp

Podemos validar que está en su grupo y en el del sftp.

groups usuarioejemplo

Que nos devolverá algo como:

usuarioejemplo : usuarioejemplo sftp

Lo siguiente será quitarle los permisos de acceso por SSH, ya que si acceden por SSH tendrían la posibilidad de ejecutar o acceder a cualquier parte,

usermod -s /bin/false usuarioejemplo

Y finalmente le daremos una contraseña al usuario.

passwd usuarioejemplo

Ahora nos aseguraremos que la carpeta propietaria de ese usuario es de root y que él no puede acceder.

chown root: /webs/usuarioejemplo
chmod 0755 /webs/usuarioejemplo

Y, como hemos cambiado los permisos, grupos y demás, haremos una nueva copia de los accesos.

cp -vf /etc/{passwd,group} /webs/etc/

Accediendo por SFTP

En este momento los usuarios podrán acceder por SFTP al servidor, de la misma forma que lo harían por FTP. Por defecto el puerto del FTP es el 21, y el del SFTP es el 22.

Creando un sitio web

A partir de este momento podríamos crear carpetas para distintos sitios web. Si eres el responsable del sistema, puedes crearle un sitio al usuario.

Primero crearíamos la carpeta

mkdir /webs/usuarioejemplo/www.dominio.es/

Y finalmente nos aseguramos que tenga sus permisos.

chown usuarioejemplo: /webs/usuarioejemplo/www.dominio.es/

En este momento el usuario ya podría gestionar por SFTP todos sus contenidos.


Sobre este documento

Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.