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
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.
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
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:
local_enable=YES
Esto habilita que puedan entrar usuarios locales, que existen en el Sistema Operativo.
Subir archivos
write_enable=YES
Esta opción permite a los usuarios subir archivos.
Banner
ftpd_banner=Banner del Servidor de Zonabit
Esto muestra un mensaje de estilo banner con el mensaje indicado.
Mostrar nombres
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
local_umask=022
Permisos al descargar un archivo.
Límite de velocidad
local_max_rate=0
o
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
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
max_per_ip=5
El máximo de conexiones conectados desde una única IP.
Intentos fallidos de inicio
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
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:
Bienvenido Usuario!
Debes hacer esto con la carpeta personal (/home/nombre-usuario/
) de cada usuario que quieras que tenga un mensaje de bienvenida.
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:
El primer método sería activar el
chroot_local_user
:/etc/vsftpd.confchroot_local_user=YES
Y activar también el
allow_writeable_chroot
:/etc/vsftpd.confallow_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.El segundo método es una extensión del anterior, activando el
chroot_local_user
y elallow_writeable_chroot
:/etc/vsftpd.confchroot_local_user=YES
allow_writeable_chroot=YESEn 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.confchroot_list_enable=YES
E indicamos el archivo que tendrá esta lista:
/etc/vsftpd.confchroot_list_file=/etc/vsftpd.chroot_list
Ten en cuenta...Si la opción
chroot_local_user
estuviera enYES
, 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_listusuario
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
anonymous_enable=YES
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:
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:
anon_upload_enable=YES
Esta línea habilita al usuario anónimo la subida de archivos.
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é enYES
.- el usuario tiene permiso de escritura sobre el directorio en el que se quiere crear el nuevo directorio.
anon_max_rate=2048
Límite de velocidad de transferencia en Bytes por segundo. Si es 0 es ilimitado.
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
:
banned_email_file=/etc/vsftpd.banned_emails
Y en ese archivo podemos añadir las contraseñas que no permitimos:
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.
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.
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
:
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:
xferlog_file=/var/log/vsftpd.log
Para cambiar la ruta del archivo de log, debemos añadir la ruta deseada a la opción vsftpd_log_file
:
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:
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
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
:
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.
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.
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
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