Saltar al contenido principal

FTP - Linux

Documento escrito por:

FTP significa File Transfer Protocol, es un protocolo de transferencia de archivos utilizado para transferir archivos de un servidor a un cliente o de un cliente a un servidor a través de una red, como Internet. Es uno de los métodos más antiguos y comunes de compartir archivos en la red.

Red

Antes de empezar con FTP, debemos tener dos adaptadores de red si usamos VirtualBox:

  • Nat
  • Red Interna

Esto nos permitirá tener tanto salida a internet como conexión entre distintas máquinas.

Para este tutorial, trataremos la interfaz de red en NAT como enp0s8 y la de Red Interna como enp0s3.

Instalar ftp

Ahora, para instalar ftp lanzamos el siguiente comando:

sudo apt-get install vsftpd
Ten en cuenta

Antes de lanzar el anterior comando, deberías lanzar el siguiente:

sudo apt-get update

Esto actualizará los repositorios y así tendrás una versión actualizada del paquete vsftpd

Una vez instalado, vamos a realizar algunas comprobaciones.

La primera es si está en ejecución, para ello usamos este comando:

sudo service vsftpd status

En caso de que no nos salga el mensaje de active (running) en verde, lanzamos el siguiente comando:

sudo service vsftpd start

Una vez eso, vemos los puertos por los que está escuchando con este comando:

sudo netstat -ltun

Y por último, comprobamos que se haya creado un usuario llamado ftp daemon:

cat /etc/passwd | grep "ftp"

Si sale algún resultado en rojo significa que se ha creado de forma correcta.

Por último, debemos comprobar si existe la carpeta pública a la que accedan los usuarios:

ls -l /srv

Dentro de dicha carpeta /srv debería haber una carpeta ftp, esta es la carpeta pública que está vacía porque no hemos añadido nada.

Conexión entre máquinas

Para seguir y comprobar que realmente funciona todo, debemos tener conexión entre máquinas, en este caso usaremos dos Linux:

  • Ubuntu Server
  • Linux Mint

En el Ubuntu Server, bajamos la interfaz de red que tenga NAT, en nuestro caso la enp0s8:

sudo ifconfig enp0s8 down

Y subimos la de Red Interna, en nuestro caso enp0s3:

sudo ifconfig enp0s3 up

Con esto conseguimos tener red entre ambas máquinas.

Cuidado

Para que la conexión exista entre ambas máquinas, las dos deben estar en Red Interna.

Una vez ambas máquinas tengan conexión entre ellas, comprobamos que ftp funciona poniendo la ip del servidor en la máquina de Linux Mint:

ftp 10.8.23.1
Recuerda

Debes cambiar 10.8.23.1 por la ip de tu servidor.

Ahí es probable que nos pida un Name, que es cualquier usuario usuario creado en el Ubuntu Server.

Una vez dentro, podremos crear un archivo desde el servidor en la carpeta /srv/ftp y se verá desde el cliente haciendo un ls. También este cliente (Linux Mint) podrá descargar ese mismo archivo usando el comando get nombre-archivo.

Configuración de usuario

Para configurar un usuario para ftp, primero debemos crearlo en el server:

sudo adduser usuarioftp

Después de esto, haremos una copia del archivo de configuración de ftp, el vsftpd.conf:

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

Y ya podemos editar el original sin preocupaciones:

nano /etc/vsftpd.conf

Opciones del vsftpd.conf

En el archivo /etc/vsftpd podemos cambiar y/o añadir las siguientes líneas:

/etc/vsftpd.conf
local_enable=YES

Esto habilita que puedan entrar usuarios locales, que existen en el Sistema Operativo.

Subir archivos

/etc/vsftpd.conf
write_enable=YES

Esta opción permite a los usuarios subir archivos.

/etc/vsftpd.conf
ftpd_banner=Banner del Servidor de Zonabit

Esto muestra un mensaje de estilo banner con el mensaje indicado.

Mostrar nombres

/etc/vsftpd.conf
text_userdb_names=YES

Para mostrar los nombres, tanto de grupos como nombres usuarios, sin el UID, es decir, sin mostrar el identificador.

Permisos de archivos

/etc/vsftpd.conf
local_umask=022

Permisos al descargar un archivo.

Límite de velocidad

/etc/vsftpd.conf
local_max_rate=0

o

/etc/vsftpd.conf
local_max_rate=1024

Límite de velocidad de transferencia. Si no se quiere limitar, ponemos un 0 como en el primer caso, si quisiéramos limitarlo, debemos poner un valor, que está expresado en B/s(Bytes por segundo), como en el segundo caso.

Clientes máximos

/etc/vsftpd.conf
max_clients=6

El número máximo de clientes conectados de forma simultáneamente. Si está en 0 no tendrá ningún límite.

Conexiones máximas

/etc/vsftpd.conf
max_per_ip=5

El máximo de conexiones conectados desde una única IP.

Intentos fallidos de inicio

/etc/vsftpd.conf
max_login_fails=5

Esto indica el máximo de intentos de inicio de sesión fallidos antes de matar la sesión.

Mensaje de inicio

/etc/vsftpd.conf
dirmessage_enable=YES

Esta última opción permite crear un mensaje de bienvenida para los usuarios cuando se conectan al servidor FTP.

Una vez aplicados los cambios, vamos a crear el mensaje de bienvenida:

sudo nano ~/.message

Y ahí ponemos el mensaje que queremos:

/home/usuario/.message
Bienvenido Usuario!
Ten en cuenta...

Debes hacer esto con la carpeta personal (/home/nombre-usuario/) de cada usuario que quieras que tenga un mensaje de bienvenida.

Un consejo:

Si editas el archivo /etc/vsftpd.conf, deberías lanzar el siguiente comando para comprobar que está bien escrito y sin errores:

sudo vsftpd

Y debería aparecer algo como 500 OOPS si está todo bien

Enjaulamiento

El enjaulamiento consiste, básicamente, en que un usuario esté "enjaulado" en su carpeta y no pueda acceder o moverse a otras carpetas.

Para llevar a cabo este paso hay dos formas:

  1. El primer método sería activar el chroot_local_user:

    /etc/vsftpd.conf
    chroot_local_user=YES

    Y activar también el allow_writeable_chroot:

    /etc/vsftpd.conf
    allow_writeable_chroot=YES

    Esta última opción da la capacidad a los usuarios de entrar, si está opción no estuviera en YES, los usuarios no tendrían acceso.

  2. El segundo método es una extensión del anterior, activando el chroot_local_user y el allow_writeable_chroot:

    /etc/vsftpd.conf
    chroot_local_user=YES
    allow_writeable_chroot=YES

    En este método, vamos a crear una lista con los usuarios específicos a no enjaular, así que vamos a activar esta opción:

    /etc/vsftpd.conf
    chroot_list_enable=YES

    E indicamos el archivo que tendrá esta lista:

    /etc/vsftpd.conf
    chroot_list_file=/etc/vsftpd.chroot_list
    Ten en cuenta...

    Si la opción chroot_local_user estuviera en YES, los nombres en la lista serían los usuarios a enjaular.

    Una vez hecho todo esto, podemos añadir nuestro usuario llamado usuario al archivo para que no esté enjaulado:

    sudo nano /etc/vsftpd.chroot_list
    /etc/vsftpd.chroot_list
    usuario

Usuario anonymous

En ftp, existe el usuario anonymous o usuario público. Este permite acceder al ftp sin tener que poner una contraseña o tener un usuario definido en el server.

Para poder tener este opción, debemos editar o añadir la siguiente línea al archivo /etc/vsftpd.conf

/etc/vsftpd.conf
anonymous_enable=YES
Ten en cuenta...

Si esta línea estuviera marcada como NO, la opción de anonymous quedaría desactivada.

A este usuario anónimo también podemos dejarle un mensaje de bienvenida al entrar al servidor FTP:

sudo nano /srv/ftp/.message

Y ahí añadimos el mensaje:

/srv/ftp/.message
Bienvenido usuario público

Una vez esto, reiniciamos el servicio:

sudo service vsftpd restart

Si entramos al ftp desde el cliente y entramos con el usuario anonymous podremos ver el mensaje de bienvenida.

Aparte de esto, podemos darle permisos extra a este usuario:

/etc/vsftpd.conf
anon_upload_enable=YES

Esta línea habilita al usuario anónimo la subida de archivos.

/etc/vsftpd.conf
anon_mkdir_write_enable=YES

La anterior línea da permisos al usuario anónimo para crear directorios.Esto es bajo ciertas condiciones:

  • write_enable esté en YES.
  • el usuario tiene permiso de escritura sobre el directorio en el que se quiere crear el nuevo directorio.
/etc/vsftpd.conf
anon_max_rate=2048

Límite de velocidad de transferencia en Bytes por segundo. Si es 0 es ilimitado.

/etc/vsftpd.conf
deny_email_enable=YES

Con esta opción, podemos denegar el acceso a anonymous con ciertas contraseñas. Para ello, debemos apuntarlas en un fichero y añadir la ruta de ese fichero a la opción banned_email_file:

/etc/vsftpd.conf
banned_email_file=/etc/vsftpd.banned_emails

Y en ese archivo podemos añadir las contraseñas que no permitimos:

/etc/.banned_emails
hola
1234
contra
passwd
123

Si el usuario anonymous intentase entrar con alguna de ellas le daría un error y no le dejaría iniciar sesión.

Consejo:

Si pones el valor de deny_email_enable a NO o simplemente lo comentamos, tendrá el efecto contrario y las contraseñas del archivo indicado en el banned_email_file serán las únicas válidas para iniciar sesión.

/etc/vsftpd.conf
no_anon_password=YES

Esta última configuración nos permite iniciar sesión con el usuario anónimo de forma directa, sin que nos pida contraseña.

Subir archivos

Antes de empezar a subir archivos a ftp, lo debemos reiniciar:

sudo service vsftpd restart && sudo service vsftpd status

Y nos conectamos a el desde el cliente con el usuario que hemos creado, es decir, usuario:

ftp 10.8.23.1
Connected to 10.8.23.1.
Name (10.8.23.1::usuario): usuario

En este caso, si lanzamos el comando pwd, el cual nos muestra donde nos encontramos, podremos ver que pone algo como /home/usuario. Esto es debido a que nuestro usuario está en la lista de los no enjaulados, si no fuera así, simplemente pondría /.

Una vez dentro, podemos hacer poner el siguiente comando:

!dir

Esto nos enseñará todos los archivos que hay en nuestro equipo local.

Escogemos uno que queramos subir, en nuestro caso, será zonabit.txt. Una vez seleccionado el archivo, lo debemos subir con el comando put de esta forma:

put zonabit.txt

Archivos de log

Para poder tener un registro de los logs del servidor ftp debemos habilitar esta opción en el archivo /etc/vsftpd.conf:

/etc/vsftpd.conf
xferlog_enable=YES

Esto guardará los logs en el archivo /var/log/vsftpd.log.

Aparte, si queremos tener un estilo estándar (wu-ftpd) debemos añadir esta línea:

/etc/vsftpd.conf
xferlog_file=/var/log/vsftpd.log
Ten en cuenta...

Para cambiar la ruta del archivo de log, debemos añadir la ruta deseada a la opción vsftpd_log_file:

/etc/vsftpd.conf
vsftpd_log_file=/var/log/vsftpd.log

También debemos añadir esa nueva ruta a la opción xferlog_file.

Certificado SSL

Para tener un certificado SSL en nuestro ftp, debemos lanzar el siguiente comando:

sudo openssl req -x509 -nodes
-day 365
-newkey rsa:2048
-keyout /etc/ssl/private/vsftpd.key
-out /etc/ssl/certs/vsftpd.pem

Una vez esto, contestaremos a lo que nos pida.

Después, debemos habilitar el puerto 990, que es el puerto del SSL en el firewall para que este no lo deniegue:

sudo ufw allow 990/tcp

También debemos habilitar los puertos para los clientes:

sudo ufw allow 40000:50000/tcp

Ya por último nos quedaría editar el archivo de configuración de ftp, el /etc/vsftpd.conf, para añadir las opciones de ssl:

/etc/vsftpd.conf
ssl_enable=YES

ssl_tlsv1=YES
ssl_tlsv2=YES
ssl_tlsv3=YES

rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key

allow_anon_ssl=YES

force_local_data_ssl=YES
force_local_logins_ssl=YES

require_ssl_reuse=NO

ssl_ciphers=HIGH

pasv_min_port=40000
pasv_max_port=50000

debug_ssl=YES
Cuidado

Si tenemos un cliente windows o aunque no sea así, se recomienda instalar el paquete ftp-ssl para poder disfrutar de todas las ventajas del ssl en ftp independientemente del sistema operativo:

sudo apt-get install ftp-ssl -y

Denegar acceso a usuarios

Para denegar el acceso a usuarios indeseados debemos añadir las siguientes configuraciones al archivo /etc/vsftpd.conf:

/etc/vsftpd.conf
pam_service_name=vftpd

Esta opción especifica el nombre de un servicio PAM (Pluggable Authentication Modules) específico que se usará para autenticar los usuarios FTP.

/etc/vsftpd.conf
userlist_enable=YES

Con esta opción, habilitamos la lista de usuarios indeseados. Si tuviera su valor en NO, la lista serviría para poner a los únicos usuarios aceptados.

/etc/vsftpd.conf
userlist_file=/etc/vsftpd.user_list

En esta opción hacemos referencia al archivo donde está la lista de archivos, en nuestro caso es el /etc/vsftpd.user_list

/etc/vsftpd.conf
userlist_deny=NO

Esta opción no le permitirá a los usuarios poner la contraseña, es decir, si están en la lista, les denegará el inicio automáticamente, sin pedirles la contraseña. Si estuviera en YES, les pediría la contraseña para luego darles un error en el inicio.

Windows

Para instalar un servicio de FTP en Windows, ve a este tutorial