Creación de usuarios web

Requisitos:

  • La home del usuario será /var/www/<nombre_usuario>

  • No se podrá conectar por SSH

Ejemplo para el usuario manuel:

mkdir /var/www/manuel/
mkdir /var/www/manuel/web
mkdir /var/www/manuel/ficheros
mkdir /var/www/manuel/ficheros/logs
    # También se podría con:
    # mkdir -p /var/www/manuel/ficheros/logs
    # mkdir /var/www/manuel/www
adduser --no-create-home --home /var/www/manuel --shell /bin/false manuel
chmod 755 /var/www/manuel/
chown -R manuel:manuel /var/www/manuel/
chown root:root /var/www/manuel/
chmod -R 770 /var/www/manuel/*

Con los siguientes comandos, crearemos los directorios para el usuario.

Después, crearemos el usuario. Con la opción --no-create-home indicamos que NO queremos utilizar la ruta por defecto en /home/ ni copiar desde /etc/skel los archivos para poblarlo. Indicamos también que su shell (intérprete de comandos) será /bin/false, que es una shell inexistente que no permite el inicio SSH.

A continuación, con los directorios creados debemos configurar los permisos de estos.

Important

This path, and all its components, must be root-owned directories that are not writable by any other user or group. After the chroot, sshd(8) changes the working directory to the user’s home directory.

No solo el propio directorio donde enjaularemos al usuario, sino todos los componentes de la ruta deben ser propiedad de root para que chroot funcione.

Fuente: Manual de sshd_config.

También cambiaremos la propiedad de los ficheros y directorios. La raiz del directorio chrooteado será de root, y los subdirectorios y archivos del usuario.

Activar SFTP

En el archivo /etc/ssh/sshd_config cambiamos/activamos:

Subsystem sftp internal-sftp

Reiniciamos el servicio:

systemctl restart ssh

Conexión SFTP

Utilizando el FileZilla nos podremos conectar:

Conexión FileZilla


Por defecto nos conectamos a nuestro home, pero podemos navegar por todo el directorio. Esto es justo lo que queremos evitar. El usuario solo debe poder ver, conocer la existencia, de sus archivos.

Conexión FileZilla con home listado


Permisos de Apache

Necesitamos instalar un módulo de apache que nos permite configurar usuario y grupo para cada instancia del servidor apache.

De esta forma cada virtualhost, cada sitio, de apache será ejecutado con los permisos que le indiquemos.

apt install libapache2-mpm-itk

El archivo de configuración del sitio será de la siguiente manera:

<VirtualHost *:80>

    ServerName manuel.iaw.com

    ServerAdmin manuel@iaw.com
    DocumentRoot /var/www/manuel/web

    ErrorLog /var/www/manuel/ficheros/logs/manuel-error.log
    CustomLog /var/www/manuel/ficheros/logs/manuel-access.log combined
    AssignUserID manuel manuel

</VirtualHost>

Activamos el sitio y recargamos el servicio:

a2ensite manuel.conf
systemctl reload apache2

Gestión de permisos y chroot

En el archivo /etc/ssh/sshd_config cambiamos/activamos:

Match User *
Include /etc/ssh/sshd_config.d/*

Crearemos un archivo nuevo en sshd_config.d/manuel.conf, donde incluiremos:

#TODO: #1 ¿aquí no hace falta un Match?
    ChrootDirectory %h
    ForceCommand internal-sftp -u 0027
    PasswordAuthentication yes

Note

Normalmente añadiríamos una directiva Include y en el directorio indicado crearíamos los archivos de configuración (presumiblemente uno para usuario).

Lamentablemente la versión de SSH que viene instalada en Ubuntu 20.04 (el SO que estamos utilizando) tiene un bug que hace que los Include/Match no funcionen correctamente

Fuente: Incidencia 3122 de OpenSSH

Reiniciamos el servicio:

systemctl restart ssh

Acceso y comprobación

Utilizando el programa FileZilla, o cualquier otro compatible con SFTP el usuario podrá subir y gestionar sus ficheros:

Filezilla Chrooteado


Important

Debemos añadir sftp:// antes del host para conectarnos.

Después de haber subido los archivos, podremos acceder a la web utilizando el navegador:

index de manuel