vsftpd en 5 minutos

vsftpd es uno de los servidores FTP más populares que existen para Linux. Tal vez no sea el que ofrezca características más avanzadas (aunque tampoco es que se quede corto: usuarios virtuales, control del ancho de banda,SSL,...) pero se ha ganado la reputación de ser uno de los servidores más livianos, sencillos de configurar y sobre todo seguros.

En este entrada explico como configurar vsftpd para tener una instalación con:

  • Acceso anónimo desactivado.
  • Solo pueden acceder usuarios que ya existan en el sistema (llamados usuarios locales, lo opuesto a los llamados usuarios virtuales) aunque...
  • ...de todos los usuarios locales sólo pueden acceder aquellos que indiquemos.
  • Los usuarios una vez accedidos quedarán enjaulados (chroot) en su $HOME.
  • Se detallarán dos posibles variaciones de la configuración:
    • Cada usuario será independiente del resto
    • No importa qué usuario se conecte todas las operaciones se realizarán como si fuese un usuario en concreto.

Nota de seguridad: Puesto que el o los usuarios quedarán enjaulados con permisos de upload, es más que recomendable que no tengan acceso Shell a la máquina (Shell:/sbin/nologin, por ejemplo).

Para instalarlo, tan sencillo como siempre en Gentoo:

# emerge -av vsftpd

Para configurarlo, crear el archivo /etc/vsftpd/vsftpd.conf con el siguiente contenido

# ---- SERVER -----------------------------------------------------------------
#Modo autónomo (sin inetd,xinet,...)
listen=YES

#Puertos para conexiones pasivas, por si tenemos un firewall (de otro modo se usan unos aleatorios)
pasv_min_port=2690
pasv_max_port=2694

#Forzar que las transferencias de tipo PORT se originen desde el puerto 20 (ftp-data). Necesario para algunos clientes
connect_from_port_20=yes

#Permitir comandos de escritura (Necesarios si queremos que los usuarios locales puedan subir archivos)
write_enable=YES

#Mostrar los IDs de usuario/grupo no numéricos en los listados de archivos
text_userdb_names=YES

#Activar los logs de transferencias (uploads/downloads) en /var/log/vsftpd.log
xferlog_enable=YES
#y también los del protocolo FTP
log_ftp_protocol=YES

#Ocultar (pero permitir la descarga) los archivos con cierto patrón
#hide_file={*.old,*.bak}

#Denegar cualquier tipo de acceso a los archivos con cierto patrón
#deny_file={.*}

#Establecer algunos límites en las conexiones
max_clients=15
max_per_ip=5
#Limitar el máximo ancho de banda en bytes/s
#local_max_rate=...

#Permisos para los archivos subidos
file_open_mode=0660
local_umask=0007

# ---- SSL --------------------------------------------------------------------
#Aceptar conexiones seguras vía SSL
ssl_enable=YES

#No forzar que se use SSL en las conexiones de datos
force_local_data_ssl=NO

#No forzar a los usuarios no anónimos a asegurar la contraseña con SSL
force_local_logins_ssl=NO

#Rutas de los certificados
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem

# ----- LOGIN -----------------------------------------------------------------
#No permitir el acceso anónimo
anonymous_enable=NO

#Permitir el acceso a los usuarios locales...
local_enable=YES
#... y tabién a aquellos listados en /etc/vsftpd/users ...
userlist_enable=YES
userlist_file=/etc/vsftpd/users
#... pero si un usuario local no está listado en /etc/vsftpd/users denegarle el acceso
userlist_deny=NO

Aquí se escoge alguna de las dos variaciones que he mencionado antes.

Para usuarios independientes añadir al archivo

#enjaular a los usuarios en su $HOME
chroot_local_user=YES

Para hacer que todos los usuarios se comporten como uno en concreto, añadir al archivo

#Una vez que un usuario local ha accedido con éxito, tratarlo como si fuese el usuario indicado en guest_username...
guest_enable=YES
guest_username=apache
#... y enjaularlo ...
chroot_local_user=YES
local_root=/var/www
#...con los privilegios del usuario local
virtual_use_local_privs=YES

Es recomendable hacerlo algo más seguro forzando el uso de SSL, pero no todos los clientes lo soportan.

Para indicar los usuarios que pueden conectar listarlos en /etc/vsftpd/users , uno por línea.

Para generar los certificados ejecutar

# cd /etc/ssl/certs
# openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem

Para ejecutar el servidor y hacer que se lance automáticamente al reiniciar

# /etc/init.d/vsftpd start
# rc-update add vsftpd default

Rápido y sencillo.