FTP (File Transfer Protocol) es un protocolo de red cliente-servidor que permite a los usuarios transferir archivos desde y hacia una máquina remota.
En este tutorial, instalaremos y configuraremos vsftpd (Very Secure FTP Daemon) en CentOS 8, de forma que los usuarios FTP sólo tengan acceso a una carpeta especifica del servidor Apache.
Para la mayoría de las instrucciones utilizaremos el usuario root.
Instalando vsftpd en CentOS
El paquete vsftpd está disponible en los repositorios de CentOs, para instalarlo, corre el siguiente comando con privilegios root.
$ sudo yum -y install vsftpd
Iniciamos el servicio
$ sudo systemctl start vsftpd
Verificamos el estado del servicio
$ sudo systemctl status vsftpd
La salida será parecida a lo siguiente, que nos indicará que el servicio está corriendo

Habilitamos el inicio automático en cada reinicio
$ sudo systemctl enable vsftpd --now
Configurando vsftpd
El archivo de configuración del servidor FTP se almacena en /etc/vsftpd/vsftpd.conf
Iniciamos abriendo el archivo de configuración:
$ sudo nano /etc/vsftpd/vsftpd.conf
1.- Acceso FTP
Permitimos el acceso al servidor FTP solo para usuarios locales (que tengan los datos de acceso), buscamos las directivas anonymous_enable y local_enable y nos aseguramos de que coincida con lo siguiente
anonymous_enable=NO
local_enable=YES
2.- Habilitando subidas
Descomenta la línea write_enable para permitir escritura en los archivos del sistema, para permitir subir y borrar archivos.
write_enable=YES
3.- Jaula chroot
Puedes prevenir que los usuarios accedan a cualquier archivo fuera de su directorio raíz descomentando la línea chroot
chroot_local_user=YES
De manera predeterminada, cuando chroot está habilitado, el servicio vsftpd rechazará los archivos que el usuario intente cargar si el directorio en el que están bloqueados los usuarios es modificable. Esto es para prevenir vulnerabilidades de seguridad.
Un método para permitir cargas cuando cuando chroot está habilitado es el siguiente:
Agrega la siguiente directiva en el archivo de configuración vsftpd.conf
allow_writeable_chroot=YES
4.- conexiones pasivas ftp
vsftpd puede usar cualquier puerto para conexiones pasivas FTP. Nosotros especificaremos el mímino y máximo rango de puertos y después abriremos el rango en el firewall.
Agrega la siguientes líneas al archivo de configuración
pasv_min_port=30000
pasv_max_port=30003
5.- Limitando el inicio de sesión de los usuarios
Para permitir el acceso de solo ciertos usuarios al servidor FTP, agrega la siguientes líneas despues de la directiva userlist_enable=YES: deberá quedar así.
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
Cuando esta opción está habilitada, tu necesitarás especificar de manera explicita que usuarios son capaces de autenticarse agregando los nombres de usuarios al archivo ubicado en /etc/vsftpd/user_list (un usuario por línea).
$ sudo nano /etc/vsftpd/user_list
Tu archivo tendrá el aspecto siguiente
#Usuarios admitidos
usuarioFTP01
usuarioFTP02
Reinicia el servicio vsftpd
Una vez que haz terminado de editar el archivo de configuración vsftpd.conf (excluyendo los comentarios), éste debería lucir algo así:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
tcp_wrappers=YES
pasv_min_port=30000
pasv_max_port=30003
Guarda el archivo y reinicia el servicio vsftpd para que los cambios surtan efecto
$ sudo systemctl restart vsftpd
ABRIENDO PUERTOS EN EL FIREWALL
Los pasos anteriores han permitido hacer las configuraciones adecuadas para el servidor FTP, ahora debemos permitir el tráfico que pasa por el firewall, por lo que es necesario abrir los puertos adecuados.
Para la configuración anterior necesitamos abrir los puertos 21, 20, y el rango 30000-30003.
$ sudo firewall-cmd --permanent --add-port=20-21/tcp
$ sudo firewall-cmd --permanent --add-port=30000-30003/tcp
Reinicia el firewall
$ sudo firewall-cmd --reload
Verifica el funcionamiento del firewall
$ sudo systemctl status firewalld
Tendrá el aspecto siguiente

Creando un usuario FTP
Para probar el servidor FTP, necesitamos crear los usuarios, cada uno con los permisos necesarios para escribir solo en su directorio.
Generalmente, cuando instalas el servicio FTP, se crea automáticamente el grupo FTP y el directorio /etc/vsftpd/ pero si esto no ocurre tendremos que crearlo a mano.
1.- Crear directorios
Los directorios que usaremos para los usuarios estarán en Apache /var/www/html/ por lo que si no tenemos un directorio específico, deberemos crearlo, en este ejemplo crearemos dos directorios para dos usuarios distintos para que no se les permita acceder a directorios que no les corresponde
$ sudo mkdir /var/www/html/carpetaFTP01
$ sudo mkdir /var/www/html/carpetaFTP02
2.- Creamos el grupo FTP
$ sudo groupadd ftp
3.- Creamos los usuarios
Creamos los usuarios que harán uso del FTP. añadiéndolo al grupo FTP y asignándole su directorio
$ sudo adduser -g ftp -d /var/www/html/carpetaFTP01 -c "Este es un Usuario FTP" usuarioFTP01
$ sudo adduser -g ftp -d /var/www/html/carpetaFTP02 -c "Este es un Usuario FTP" usuarioFTP02
4.- establecer contraseñas a los usuarios
$ sudo passwd usuarioFTP01
$ sudo passwd usuarioFTP02
5.- creamos un shell fantasma
Vamos a crear un shell fantasma para que los usuarios no puedan iniciar sesión en el sistema y la cuenta sea solamente usada para FTP
1.- Creamos el directorio para el shell
$ sudo mkdir /bin/ftp
2.- Añadimos la línea /bin/ftp al fichero /etc/shells
$sudo nano /etc/shells
Agregamos la línea
/bin/ftp

3.- Editamos el fichero /etc/passwd
$ sudo nano /etc/passwd
Buscamos una línea parecida a la siguiente
usuarioFTP01:x:1001:50:Este es un Usuario FTP:/var/www/html/carpetaFTP01:/bin/sh
y la modificamos de la siguiente forma
usuarioFTP01:x:1001:50:Este es un Usuario FTP:/var/www/html/carpetaFTP01:/bin/ftp
Hacemos lo mismo para los dos usuarios
4.- Agrega los usuarios a la lista de usuarios FTP permitidos, abriendo el archivo user_list
$ sudo nano /etc/vsftpd/user_list
Y agrega a los usuarios, de la siguiente forma:
#Usuarios admitidos
usuarioFTP01
usuarioFTP02
5.- Establece los directorios que usarán los usuarios asigna los permisos
Asignar permisos a la carpeta del usuario
$ sudo chmod 750 /var/www/html/carpetaFTP01
$ sudo chmod 750 /var/www/html/carpetaFTP02
Compartir al usuario la carpeta
$ sudo chown -R usuarioFTP01: /var/www/html/carpetaFTP01
$ sudo chown -R usuarioFTP02: /var/www/html/carpetaFTP02
Hasta este punto, tu servidor FTP es completamente funcional, deberías ser capaz de conectar a tu servidor desde cualquier cliente FTP, como FileZilla.
Solo reinicia el servicio y prueba ingresando con las credenciales que has generado
$ sudo systemctl restart vsftpd
Consideraciones
Algunas veces a pesar de toda la configuración el servidor FTP parece no responder de acuerdo a las instrucciones, asegurate de ejecutar la siguiente instrucción
$ sudo semanage boolean -m ftpd_full_access --on
Referencias externas:
- https://linuxize.com/post/how-to-setup-ftp-server-with-vsftpd-on-centos-8/#6-securing-transmissions-with-ssltls
- https://linuxize.com/post/how-to-setup-ftp-server-with-vsftpd-on-ubuntu-18-04/
- https://linuxize.com/post/how-to-setup-ftp-server-with-vsftpd-on-centos-7/
- https://javiercarrasco.es/2012/07/20/vsftpd-en-ubuntu-12-04/
- https://es.linux-console.net/?p=757
- https://askubuntu.com/questions/129563/vsftpd-configuration-problems-with-12-04
- https://www.ryadel.com/en/secure-vsftpd-ftp-server-ssl-tls-centos-7-ftps/
- https://askubuntu.com/questions/617370/why-vsftpd-doesnt-work-when-pam-service-name-vsftpd
Muy buen tutorial eres la máquina