Usuarios virtuales en vsftp

Ya os había comentado en otra entrada que tres de los motivos por los que valoro tanto vsftp son la versatilidad, la sencillez de configuración y la facilidad para dar respuesta a las dudas en internet. Y una de las características que contribuye a esa versatilidad y que me resulta de las más interesante es la posibilidad de crear usuarios virtuales.

Esta entrada continua el contenido iniciado en el artículo VSFTP instalar y configurar un servidor FTP en una Raspberry Pi con Ubuntu, desde dónde enlazamos más contenido relacionado con la insralación y la configuración de vsftp.

Usuarios virtuales vs usuarios de sistema

La configuración por defecto de vsftp nos permite autentificarnos con las credenciales de los usuarios que tengamos creados en el sistema, dándonos acceso a las mismas carpetas a las que estos tienen acceso. Pero además nos permite autentificarnos con usuarios virtuales creados especificamente para acceder por ftp a una determinada carpeta. Y lo mejor de todo es que estas dos opciones son totalmente compatible entre si, pudiendo elegir entre:

  1. Habilitar solo el acceso de los usuarios del sistema (por defecto).
  2. Habilitar solo el acceso de usuarios virtuales.
  3. Habilitar el acceso de usuarios del sistema y usuarios virtuales.

/etc/vsftps.conf

Para no extendernos demasiado en esta entrada, a continuación veremos el resultado final del archivo /etc/vsftpd.conf. Si estás interesado en conocer los detalles de cada línea de configuración puede echarle un vistazo a la documentación oficial de vsftp en este enlace. Para facilitar la lectura hemos eliminado todas las líneas de comentarios originales del archivo:

# configuración excluyendo comentarios
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
user_sub_token=$USER
hide_ids=YES
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES

# Configuración específica de usuarios virtuales
user_config_dir=/etc/vsftpd/usersConf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd

Creación de usuarios virtuales

Una vez realizada la configuración de vsftp, lo siguiente que haremos será crear los usuarios virtuales. Para ello crearemos un directorio dónde alojar los ficheros de autentificación y acto seguido los propios ficheros, que en este ejemplo serán dos, uno por usuario. Por algún motivo que desconozco no he podido hacer funcionar la autentificación con PAM sin incluir la opción -d en la creación de los ficheros de autentificación, lo que nos limita a contraseñas con un máximo de 8 caracteres, una opción que lamentablemente reduce bastante la seguridad.

sudo mkdir /etc/vsftpd
sudo htpasswd -c -d /etc/vsftpd/ftpd.passwd ftpUser1
sudo htpasswd -d /etc/vsftpd/ftpd.passwd ftpUser2

El comando htpasswd nos solicitará que definamos la contraseña y que la confirmemos, y ojo que en el segundo usuario hemos omitido la opción -c, solo es necesario incluirla con el primer usuario, si la incluimos en el segundo o sucesivos truncaremos el fichero y por lo tanto únicamente dejaremos el último usuario que hemos creado.

Instalación y Configuración de PAM

Como adelantabamos en el punto anterior utilizaremos PAM (Pluggable Authentication Modules) para la autentificación de los usuarios, así que si no lo tenemos instalado deberemos hacerlo:

sudo apt-get update
sudo apt-get install libpam-pwdfilev

El archivo de configuración de PAM para el servicio vsftp por defecto se encuentra en /etc/pam.d/vsftp, notad que hicimos referencia a él en la configuración de vsftp mediante la directiva pam_service_name. Así que por seguridad realizaremos una copia de seguridad de este archivo y acto seguido lo editaremos de forma que quede así:

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so

Como ves, le estamos indicando que utilice el archivo que acabamos de crear con el comando htpasswd para autentificar a los usuarios virtuales.

Directorios de usuarios virtuales

El último paso que nos queda para tener nuestro servicio funcionando es definir cuales serán los directorios a los que tendrán acceso los usuarios. Para realizar esta configuración crearemos un archivo por cada usuario al que estemos concediendo acceso, y para mantenerlos organizados los almacenaremos dentro de un directorio que crearemos a tal efecto, al que ya hemos hecho referencia en /etc/vsftpd.conf mediante la directiva user_config_dir. El nombre de cada archivo debe ser idéntico al nombre de usuario al que hace referencia:

sudo mkdir /etc/vsftpd/usersConf
sudo vim /etc/vsftpd/usersConf/ftpUser1
sudo vim /etc/vsftpd/usersConf/ftpUser2

El contenido de cada archivo debe hacer referencia al directorio al que le estamos concediendo acceso de la siguiente manera:

local_root=/var/www/targetDir

Permisos de escritura

Un aspecto de gran importancia es configurar correctamente los permisos de escritura del directorio de cada usuario, en caso contrario nos encontraremos con un error cuando intentemos cargar cualquier archivo en nuestro servidor.

En nuestro caso, estamos concediendo acceso a una carpeta de un servidor web, así que daremos por hecho que los permisos están configurados tal y como explicamos en la entrada Archivos y permisos de usuario en Apache 2 y Linux.

sudo usermod -a -G www-data ftpd
sudo chown ftpd:www-data /var/www/users/ftpUser1

Comprobamos que todo funciona

Reiniciamos el servidor y comprobamos que todo funciona:

sudo service vsftpd restart

Recuerda que si tienes algún problemalor archivos de logs de vsftp están en /var/log/vsftp.log y los logs de autentificación /var/log/auth.log.

7 respuestas a «Usuarios virtuales en vsftp»

  1. Estoy intentando seguir tus indicaciones para poder instalar vsftpd en Raspbian, pero el comando htpasswd con es reconocido.
    Podrías facilitarme los pasos correctos para trabajar con usuarios virtuales en Raspbian??

  2. En el manual de vsftpd, se indica que local_enable va YES, no entiendo porque lo estas indicando como NO. Gracias! saludos.

    local_enable
    Controls whether local logins are permitted or not. If enabled, normal user accounts in /etc/passwd (or wherever your PAM config references) may be used to log in. This must be enable for any non-anonymous login to work, including virtual users.

    1. Hola Diego,

      Gracias por comentar. Tienes razón, de hecho en el archivo de configuración está definido como YES. Ya lo hemos corregido.

      Un saludo.

  3. Y deberían funcionar tanto los usuarios locales como los virtuales?
    Porque haciendo esto me han dejado de funcionar los locales.

    1. A mi me funcionaban los locales pero no me permitía evitar en enjaulado usando la lista. Enjaulaba siempre aunque modificase la directiva a NO.
      Luego vi que:
      ‘virtual_use_local_privs’ lo tenía en NO y lo modifiqué tal y como indica en el artículo:
      virtual_use_local_privs=YES
      A partir de ese momento me funcionó correctamente.

Responder a Andres Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *