jueves, 16 de noviembre de 2023

Instalar Servidor FTP en Raspberry Pi 4 - vsftpd

En esta entrada quiero registra el paso a paso del proceso de instalar y configurar un Servidor FTP en una Raspberry Pi 4, esto lo hago porque hace parte de un proyecto personal que estoy desarrollando en donde requiero de un servidor FTP para cargar archivos.

Actualmente ya tengo una Raspberry Pi 4 configurada con una versión de Linux Ubuntu Server 22.04.2 LTS (64-bit), pueden consultar el paso a paso de este proceso en mi anterior entrada:


Luego de explorar documentación y otros blogs en internet, finalmente pude realizar una instalación y configuración exitosa en mi Raspberry Pi 4, en los primeros intentos estaba teniendo algunos problemas al momento de conectarme usando un Cliente FTP como FileZilla, por alguna razón, la autenticación era exitosa pero la conexión se quedaba haciendo múltiples intentos en listar el directorio del usuario autenticado, al final del proceso encontré la solución solo agregando un atributo en el archivo de configuración del Servidor vsftpd.

El objetivo de esta entrada es documentar el proceso de una configuración básica para un entorno de desarrollo, existen configuraciones adicionales que hay que agregar como una capa extra de seguridad en el caso de hacer una instalación y configuración en un entorno de producción.

No voy entrar en detalles sobre qué es FTP o SFTP, tampoco quiero entrar en detalles sobre los protocolos involucrados o capas de seguridad de encriptación de datos SSL. Creo que para obtener información detallada existe la documentación oficial, y no es relevante para el objetivo de esta entrada. Quiero compartir una guía rápida y práctica, lista para usar.

Cabe mencionar que los pasos a seguir en esta entrada también se pueden aplicar a una Raspberry Pi 3 y, en general, a una distribución Linux Ubuntu Server 22.04.2 LTS (64 bits).


Prerrequisitos:

  • Raspberry Pi 4/3
  • Linux Ubuntu Server 22.04.2 LTS (64-bit)


Paso 0: Actualizar Paquetes de Ubuntu Server

sudo apt update
sudo apt upgrade


Paso 1:  Instalar vsftpd

sudo apt install vsftpd

Cuando la instalación termine, lo primero que debemos hacer en el siguiente paso es realizar una copia del archivo de configuración de vsftpd antes de continuar con la configuración en los siguientes pasos.


Paso 2: Backup de vsftpd.conf

sudo cp /etc/vsftpd.conf /home/pi/Backup/vsftpd.conf


Paso 3: Habilitar el Firewall

Aquí debemos habilitar el Firewall y permitir las conexiones a los puertos correspondientes que usa el protocolo FTP, en este caso, las conexiones entrantes en los puertos 20, 21 y 990.

  • Verficar el estado del Firewall:

sudo ufw status


Nos debe mostrar algo similar a esto:

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

  • Abrir los puertos:

sudo ufw allow 20,21,990/tcp

  • Abrir puertos en un rago para conexiones pasivas:

sudo ufw allow 40000:50000/tcp

  • Verficar el estado del Firewall:

sudo ufw status


Nos debe mostrar algo similar a esto:

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
20,21,990/tcp              ALLOW       Anywhere
40000:50000/tcp            ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
20,21,990/tcp (v6)         ALLOW       Anywhere (v6)
40000:50000/tcp (v6)       ALLOW       Anywhere (v6)


Paso 4: Crear Usuario FTP

En este paso, vamos a crear un usuario dedicado únicamente para tener acceso mediante FTP al servidor. Esa será la única función de este usuario, con un directorio dedicado y solo con acceso a dicho directorio. Estará aislado del resto del sistema.

  • Crear Usuario:

sudo adduser ftpi

  • Crear Directorio Aislado:

sudo mkdir /home/ftpi/public

  • Modificar el propietario del directorio aislado:

sudo chown nobody:nogroup /home/ftpi/public

  • Remover permisos de escritura sobre el directorio aislado:

sudo chmod a-w /home/ftpi/public

  • Verificar permisos:

sudo ls -la /home/ftpi/public


Nos debe mostrar algo similar a esto:

Output
total 8
dr-xr-xr-x 2 nobody nogroup 4096 Nov 15 17:20 .
drwxr-x--- 3 ftpi ftpi  4096 Nov 15 17:20 ..

  • Crear un directorio dedicado a la carga de archivos:

sudo mkdir /home/ftpi/public/uploads

  • Asignar como propietario al usuario:

sudo chown ftpi:ftpi /home/ftpi/public/uploads

  • Verificar permisos:

sudo ls -la /home/ftpi/public


Nos debe mostrar algo similar a esto:

Output
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Nov 15 17:20 .
drwxr-x--- 3 ftpi ftpi  4096 Nov 15 17:20 ..
drwxr-xr-x 2 ftpi ftpi  4096 Sep 14 20:30 uploads

  • Finalmente creamos un archivo de prueba en el directorio uploads:

echo "vsftpd test file" | sudo tee /home/ftpi/public/uploads/test.txt


Paso 5: Configurar Acceso FTP

Usar cualquier editor de texto, en este caso vamos a usar nano:

sudo nano /etc/vsftpd.conf

Cuando tenemos acceso al archivo de configuración desde nano, debemos buscar y modificar las siguientes variables, en caso de no existir alguna variable se crea como nueva al final del archivo:

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
user_sub_token=$USER
local_root=/home/$USER/public
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

  • Finalmente agregar el usuario a: /etc/vsftpd.userlist

echo "ftpi" | sudo tee -a /etc/vsftpd.userlist

  • Verificar el archivo /etc/vsftpd.userlist

cat /etc/vsftpd.userlist


Paso 6: Inhabilitar Acceso al Shell

Este paso es opcional si queremos bloquear el acceso al shell del usuario, de esta forma podemos bloquear el acceso al shell cuando el usuario se conecta por ssh, es una medida básica y simple de inhabilitar el acceso al shell de un usuario, mas no es la forma más segura.

  • Crear un archivo script:

sudo nano /bin/ftponly

#!/bin/sh
echo "This account is limited to FTP access only."

  • Agregar permisos de ejecucion al archivo:

sudo chmod a+x /bin/ftponly

  • Abrir la lista de shell's validas:

sudo nano /etc/shells

  • Agregar al final del archivo y guardar:

/bin/ftponly

  • Actualizar el Shell del usuario:

sudo usermod ftpi -s /bin/ftponly

  • Ahora cuando el usuario intente hacer un login mediante ssh:

ssh ftpi@your_server_ip

Obtendra el siguiente mensaje:

This account is limited to FTP access only.
Connection to 203.0.113.0 closed.


Paso 7: Probar el Acceso FTP con FileZilla

  • Finalmente solo queda reiniciar el servicio vsftpd:

sudo service vsftpd restart

  • Y desde una maquina externa probar el acceso FTP a nuestra Raspberry Pi 4 usando el programa FileZilla:

Usando los datos de acceso del Usuario FTP nos conectamos a nuestra Raspberry Pi 4:

Acceso FTP FileZilla

Cuando la conexión sea exitosa podemos ver en el panel del sitio remoto el directorio de uploads donde podemos cargar y descargar archivos:

Sitio Remoto FTP

Dentro del directorio uploads podemos ver que existe el archivo de prueba que habíamos creado previamente durante la configuración:

Archivo de prueba FTP




Listo, con esto terminamos y verificamos que nuestro Servicio FTP está funcionando y listo para usar.


Para concluir, quiero mencionar nuevamente que el objetivo de esta guía es realizar una instalación básica en un entorno de desarrollo. Hay otras configuraciones adicionales que se deben considerar, especialmente en temas de seguridad, cuando se implementa en un entorno de producción. Sin embargo, para un servidor básico en casa o en un entorno de desarrollo donde la seguridad no es la prioridad principal, esta solución es adecuada.



Esto es todo lo que quería compartir en esta entrada. Espero poder publicar una próxima entrada lo más pronto posible.



No hay comentarios.:

Publicar un comentario