Vsftpd es el acrónimo de Very Secure FTP Daemon:es uno de los servidores ftp más utilizados en Linux y otros sistemas operativos similares a Unix. Es de código abierto y se publica bajo la licencia GPL, y admite usuarios virtuales y SSL para el cifrado de datos. En este tutorial veremos cómo instalarlo y configurarlo en Linux.
Requisitos de software y convenciones de la línea de comandos de Linux Categoría | Requisitos, convenciones o versión de software utilizada |
Sistema | Debian 10 (Buster) |
Software | vsftpd, openssl, libpam-pwdfile |
Otro | Permisos de raíz para instalar y configurar vsftpd |
Convenciones | #:requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando $:requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios |
Instalación
Vsftpd está disponible en los repositorios oficiales de Debian, por lo que para instalarlo podemos usar nuestro administrador de paquetes favorito; solo es cuestión de sincronizar los repositorios e instalar el paquete. Ambas cosas se pueden lograr
ejecutando los siguientes comandos:
$ sudo apt-get update && sudo apt-get install vsftpd
Unos segundos y el paquete se instalará en nuestro sistema Debian. Los scripts de instalación incluidos en el paquete también se encargarán de iniciar el vsftpd service automáticamente pero debemos recordar reiniciar o recargar el servicio cada vez que cambiemos el archivo de configuración. Para poder utilizar los usuarios virtuales característica provista por vsftpd, también necesitamos instalar otro paquete:
$ sudo apt-get install libpam-pwdfile
Veremos su uso en la sección dedicada de este tutorial.
Una vez instalados los paquetes necesarios, podemos continuar y configurar vsftpd:veremos cómo hacerlo en la siguiente sección de este tutorial.
Configuración de Vsftpd
El archivo de configuración de vsftpd es /etc/vsftpd.conf
. Si lo abrimos podremos ver las distintas directivas que ya contiene. Veamos cuáles son las más relevantes para los casos más habituales.
Habilitar inicio de sesión anónimo
El acceso no autenticado al servidor, como usuarios anónimos, está deshabilitado por defecto. Para habilitarlo, debemos usar el anonymous_enable
directiva, que en el archivo de configuración se coloca en la línea 25
. Todo lo que tenemos que hacer es configurarlo en YES
:
debe cambiar la instrucción a:
anonymous_enable=YES
Otra directiva que podemos querer cambiar es la que nos permite establecer un directorio en el que vsftpd intentará navegar después de un acceso anónimo. La directiva que nos permite controlar esta configuración es anon_root
. Digamos que queremos que un usuario anónimo acceda al /srv/ftp
directorio por defecto, escribiríamos:
anon_root=/srv/ftp
Todos los inicios de sesión anónimos se asignan internamente a un usuario designado, que, de forma predeterminada, es ftp
. Para cambiar este mapeo tenemos que usar el ftp_username
y configúrelo con el nombre del usuario al que queremos asignar usuarios anónimos.
Por defecto, un usuario anónimo no podrá escribir nada en el servidor, por obvias razones de seguridad. Si desea cambiar este comportamiento (no recomendado), hay algunas opciones que deben cambiarse. En primer lugar, el write_enable
general la directiva debe establecerse en YES
. Esta directiva se comenta en la línea 31
del archivo de configuración, por lo que todo lo que tiene que hacer es eliminar el comentario.
# Uncomment this to enable any form of FTP write command.
write_enable=YES
Una vez habilitada esta directiva, todo lo que tenemos que hacer es trabajar en otras dos opciones:anon_upload_enable
y anon_mkdir_write_enable
. Cuando el primero se establece en YES
un usuario anónimo podrá subir archivos, pero solo si el usuario al que está mapeado (como dijimos, ftp, por defecto) tiene permisos de escritura en el directorio de destino. Para activar esta opción, lo único que tenemos que hacer es eliminar el comentario de la línea 40
del archivo de configuración:
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=YES
anon_mkdir_write_enable
directiva, en cambio, cuando se establece en YES
permite a los usuarios anónimos crear nuevos directorios en el servidor, en las mismas condiciones que vimos anteriormente (el usuario subyacente en el servidor debe tener permisos de escritura en el directorio principal). La directiva se encuentra en la línea 44
del archivo de configuración:
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES
Una vez más, dado que la variable ya está establecida en YES
, para que sea relevante, todo lo que tenemos que hacer es eliminar el comentario.
Para permitir que los usuarios anónimos realicen también otro tipo de operaciones de escritura, como por ejemplo renombrar o borrando un directorio, debemos usar otra directiva que no está presente en el archivo de configuración, anon_other_write_enable
y configúrelo en YES
si el anterior es nuestro comportamiento deseado:
anon_other_write_enable=YES
Inicios de sesión autenticados
Para permitir que los usuarios del sistema local accedan al servidor ftp con su contraseña del sistema, local_enable
la directiva debe establecerse en YES
:este es el valor predeterminado en el sistema Debian. La directiva se puede encontrar en la línea 28
del daemon
archivo de configuración:
# Uncomment this to allow local users to log in.
local_enable=YES
De forma predeterminada, cuando un usuario local se autentica con éxito, tendrá su propio directorio de inicio como raíz. Sin embargo, es posible especificar un punto de partida alternativo utilizando el local_root
directiva. Esta directiva no está presente en el archivo de configuración, por lo que debemos agregarla si queremos usarla. Para configurar /srv/ftp
directorio como raíz local, por ejemplo, escribiríamos:
local_root=/srv/ftp
Usuarios locales de Chroot
Como medida de seguridad es posible chroot cada usuario autenticado en su propio directorio de inicio. Para realizar esta tarea debemos usar el chroot_local_user
directiva:
chroot_local_user=YES
Cuando esta característica está habilitada, es posible especificar una lista de exclusiones (una lista de usuarios que no deben ser chroot) usando las siguientes directivas:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
La primera directiva es necesaria para activar la función, la otra para especificar la ubicación del archivo que contiene la lista de exclusión . El archivo debe crearse si aún no existe; de lo contrario, el inicio de sesión fallará.
Como medida de seguridad, cuando un usuario está chroot, no debería poder escribir en el directorio de nivel superior del chroot. Si es el caso, en las versiones más recientes de vsftpd, un usuario no podrá iniciar sesión y el servidor responderá con el siguiente mensaje:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Este problema se puede resolver básicamente de dos maneras. Este primero obviamente consiste en arreglar los permisos , negando al usuario acceso de escritura al directorio de nivel superior del chroot y permitiéndole escribir solo en subdirectorios.
La segunda forma de resolver el problema, si no le importan las posibles implicaciones de seguridad, es omitir esta restricción , usando la siguiente directiva:
allow_writeable_chroot=YES
Hablando de permisos, es importante tener en cuenta que el umask predeterminado para el usuario local se establece en 077
. Si esta configuración se considera demasiado restrictiva, es posible cambiarla usando local_umask
directiva. Esta directiva se comenta en la línea 35
del archivo de configuración:
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
#local_umask=022
Iniciar sesión con usuarios virtuales
Una buena característica que ofrece vsftpd es la posibilidad de iniciar sesión con usuarios virtuales . Un usuario virtual es un usuario que realmente no existe en el sistema, sino solo en el contexto de la aplicación sftpd. Para habilitar esta característica tenemos que usar la siguiente directiva:
guest_enable=YES
Cuando la función está activa, todos los inicios de sesión no anónimos (incluso los usuarios reales/locales) se asignan al usuario especificado con guest_username
directiva, que por defecto, como ya vimos es ftp .
El siguiente paso es crear un archivo que contenga los nombres de usuario y contraseñas de los usuarios virtuales. Para generar una contraseña cifrada, podemos usar openssl
y emita el siguiente comando:
$ openssl passwd -1
Password:
Verifying - Password:
$1$pfwh3Jou$DQBiNjw8bBtDqys7ezTpr.
La contraseña comando de openssl se utiliza para generar contraseñas hash (md5). En el ejemplo anterior, se nos solicitó el hash de la contraseña y su confirmación. Finalmente, la contraseña cifrada se genera y se muestra en pantalla.
El nombre de usuario, junto con la contraseña, debe colocarse en un archivo, digamos que es /etc/virtual_users.pwd
, en el siguiente formato:
username:hashed_password
Entonces, suponiendo que nuestro usuario virtual se llame “linuxconfig”, escribiríamos:
linuxconfig:$1$pfwh3Jou$DQBiNjw8bBtDqys7ezTpr.
La operación debe repetirse para cada usuario virtual que queramos configurar.
Ahora tenemos que crear el pam servicio que será utilizado por vsftpd para autenticar a los usuarios virtuales. Nombraremos el archivo vsftpd_virtual
y colóquelo en el /etc/pam.d
directorio. Su contenido será el siguiente:
#%PAM-1.0
auth required pam_pwdfile.so pwdfile /etc/vsftpd/virtual_users.pwd
account required pam_permit.so
Como puede ver, especificamos la ruta del archivo que contiene el nombre de usuario y las contraseñas de los usuarios virtuales en la primera línea. Todo lo que tenemos que hacer, ahora, es instruir a vsftpd para que use este "servicio" de pam. Podemos hacerlo con el pam_service_name
directiva:
pam_service_name=vsftpd_virtual
En este punto, podemos guardar el archivo de configuración, reiniciar el demonio y verificar que podemos iniciar sesión con el usuario virtual que acabamos de crear.
Habilitar la compatibilidad con SSL para el cifrado de datos
De forma predeterminada, la compatibilidad con SSL está deshabilitada en vsftpd, por lo que los datos transferidos no se cifrarán. Para habilitar el soporte SSL debemos usar las siguientes directivas, ubicadas en las líneas 149
a 151
del archivo de configuración:
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=YES
La primera directiva, rsa_cert_file
se utiliza para indicar la ruta del certificado RSA que se utilizará para las conexiones cifradas SSL. El segundo, rsa_private_key
, en su lugar, se utiliza para especificar la ubicación de la clave privada RSA. Finalmente, el ssl_enable
directiva se utiliza para permitir el uso de cifrado SSL.
El ejemplo usa /etc/ssl/certs/ssl-cert-snakeoil.pem
y /etc/ssl/private/ssl-cert-snakeoil.key
archivos, pero es casi seguro que desea utilizar uno dedicado.
Especificación del rango de puertos para el modo pasivo
El modo pasivo de FTP es el predeterminado en una nueva instalación de vsftpd, pero si queremos habilitarlo explícitamente, podemos usar la siguiente directiva:
# Set to NO if you want to disallow the PASV method of obtaining a data connection
# (passive mode). Default: YES
pasv_enable=YES
Cuando el servidor opera en modo pasivo , envía al cliente una dirección IP y un puerto que debe escuchar para la conexión. Estos puertos se seleccionan aleatoriamente de forma predeterminada, sin embargo, dado que debemos usar un firewall en nuestro servidor, debemos saber qué puertos debemos permitir el tráfico. El rango de puertos a usar se puede especificar con pasv_min_port
y pasv_max_port
directivas, por ejemplo:
# The minimum port to allocate for PASV style data connections. Can be used to
# specify a narrow port range to assist firewalling.
pasv_min_port=10090
# The maximum port to allocate for PASV style data connections. Can be used to
# specify a narrow port range to assist firewalling. Default: 0 (use any port)
pasv_max_port=10100
Con la siguiente configuración el servidor utilizará un rango de puertos que va desde 10090
a 10100
.
Configuración del cortafuegos
Para que nuestro servidor vsftpd funcione correctamente, debemos permitir el tráfico a través de los puertos necesarios, algunos debemos configurar las reglas apropiadas para nuestro firewall. En este tutorial asumiré el uso de ufw administrador de cortafuegos (cortafuegos sin complicaciones).
El primer puerto por el que queremos permitir el tráfico es el puerto 21
, que es el puerto estándar utilizado por el protocolo FTP:
$ sudo ufw allow in 21/tcp
En segundo lugar, debemos permitir el tráfico entrante a través del rango de puertos especificado que configuramos en la sección anterior. Para especificar un rango de puertos podemos ejecutar:
$ sudo ufw allow in 10090:10100/tcp
Conclusiones
En este artículo vimos cómo instalar y configurar vsftpd en Debian 10 Buster. Vimos cómo configurar el uso anónimo y el uso de usuarios locales, y cómo podemos aprovechar los usuarios virtuales característica proporcionada por el servicio. Dado que FTP no proporciona cifrado de datos, vimos cómo habilitar la compatibilidad con SSL y, finalmente, cómo configurar el firewall para permitir el tráfico entrante a través de los puertos necesarios. Para obtener una lista completa de las posibles directivas que se pueden usar en el archivo de configuración de vsftpd, consulte vsftpd.conf página de manual (VSFTPD.CONF(5)). ¿Quiere saber cómo trabajar mediante programación con un servidor FTP? Eche un vistazo a nuestro artículo sobre cómo conectarse a un servidor FTP usando python.