Requisitos:
Para esta práctica solamente necesitas un equipo con sistema operativo Linux Ubuntu (u otra distribución basada en Debian), y otro equipo en la misma red para hacer las pruebas.
Instalación del servidor FTP ProFTPd:
ProFTPd es un servidor fácil de instalar y configurar y muy configurable, la página del proyecto es: ProFTPD site
Para instalar el servidor tan solo tienes que escribir el comando:
sudo apt install proftpd
ProFTPd se instala como servicio con el mismo nombre por lo que si quieres saber si está funcionando podemos escribir:
sudo service proftpd status
Si quieres pararlo lo mismo con stop, etc...
Configuración de ProFTPd:
Una vez instalado el servicio dispondremos de un fichero de configuración situado en /etc/proftpd/proftpd.conf
Recuerda que si cambias la configuración debes reiniciar el servicio (restart o stop + start) o recargarlo (reload).
Utilizar los usuarios del equipo como usuarios del servidor:
Una de las maneras en que puedes configurar el servidor FTP es haciendo que los usuarios que se conecten al mismo solo tengan acceso a su carpeta home, por ejemplo si el usuario kenshiro se conecta a uns ervidor FTP y tiene una cuenta de usuario en el equipo accederá a /home/kenshiro, y tendrá permisos de propietario sobre los directorios y ficheros porque son los suyos.
Para hacer que el servidor FTP funcione así hay que editar proftpd.conf y descomentar la línea que reza así:
# Use this to jail all users in their homes
# DefaultRoot ~
dejándola así:
# Use this to jail all users in their homes
DefaultRoot ~
Y después recargar el servicio.
Utilizar FTP por línea de comandos:
Para utilizar el servidor FTP con otro equipo es importante que el equipo que vaya a hacer de cliente pueda acceder a la IP o nombre de equipo (si está configurado el DNS) del equipo servidor. Por esta razón ambas máquinas deberán estar en la misma red (si usas máquinas virtuales deben estar en adaptador puente o configurar NAT con redirección de puertos), hay otras configuraciones válidas como tener el servidor con una IP pública, etc...
Máquina servidor:
Deja el equipo servidor con el daemon proftpd activo.
Imagina que la IP del equipo servidor es 192.168.1.174 (LAN).
Máquina cliente:
Abre un terminal si el cliente es Linux o una consola de comandos con CMD si utilizas Windows.
Ahora ya puedes conectarte al servidor por comandos, puedes hacer lo de dos maneras:
ftp 192.168.1.174
o
ftp
open 192.168.1.174
Una vez establecida la conexión te pedirá un nombre de usuario y su contraseña, deberás utilizar los datos de un usuario local y si introduces bien las credenciales ya tendrás acceso a los ficheros del directorio home de tu usuario, a continuación verás un ejemplo de esta conexión utilizando una consola Windows y un terminal Linux:
Como puedes ver el prompt cambia y ahora pone ftp> esto indica que estás conectado al servidor FTP.
Para conocer los comandos que permite utilizar FTP puedes introducir el comando help o el comando ?:
Los comandos que puedes utilizar son similares a los que usarías si estuvieses trabajando con la máquina local, algunos de los más utilizados son:
-
open servidor: Conectarse al servidor por nombre o IP.
-
close: Desconectarse del servidor pero seguir en el cliente FTP.
-
bye/quit: Cerrar el cliente FTP.
-
cd: Cambiar de directorio.
-
ls/dir: Listar contenido del directorio.
-
mkdir: Crear un directorio en el directorio del servidor.
-
pwd: Mostrar el directorio actual del servidor.
-
delete: Borrar un fichero en el servidor.
-
rmdir: Eliminar un directorio del servidor.
-
get: Copiar un fichero del servidor en la máquina local.
-
put: Copiar un fichero de la máquina local al servidor.
-
bell: Activa o desactiva un sonido de aviso del sistema que suena cuando termina la transferencia en curso.
-
lcd: Es el comando cd pero que cambia el directorio de la máquina local.
Ejemplo:
Imagina que tienes un fichero en el equipo local llamado "listado.txt", para copiarlo en el servidor tan solo debes ejecutar en el FTP:
ftp> put listado.txt
Ahora para recuperar ese fichero desde el servidor a tu equipo local solo debes introducir el comando:
ftp> get listado.txt
Si quieres descargar más de un fichero del servidor sin tener que escribir una línea por cada uno de ellos puedes utilizar el comando mget, por ejemplo para descargar los ficheros listado1.txt y listado2.txt utilizarás el comando:
ftp> mget listado*.txt
Y para subir todos los ficheros que tienes en el directorio local puedes utilizar el comando mput:
ftp> mput *.*
En ambos casos el servidor te pedirá que confirmes si deseas hacer la operación por cada fichero.
Otras opciones de configuración:
Editando /etc/proftpd/proftpd.conf puedes cambiar la configuración del servidor FTP.
Cambiar el nombre del server:
Puedes cambiar el nombre del servidor modificando la línea servername, por ejemplo:
ServerName "DOOM"
Mensajes de bienvenida y/o error personalizados:
También puedes cambiar el mensaje de bienvenida y el de error al conectar editando /etc/proftpd/proftpd.conf, para ello debes añadir al final del fichero estas dos líneas:
AccessGrantMsg "Mensaje de bienvenida"
AccessDenyMsg "Mensaje de error"
También puedes hacer que ProFTPD lance un fichero ASCII como mensaje antes del login y después, imagina que guardamos los ficheros welcome1.msg y welcome2.msg en el directorio de ProFTPD, en el fichero de configuración escribiríamos:
DisplayConnect /etc/proftpd/welcome1.msg
DisplayLogin /etc/proftpd/welcome2.msg
Y obtendrías:
Aquí tienes una web para generar mensajes en ASCII.
Cambiar el directorio por defecto a los usuarios:
Puedes hacer que todos los usuarios accedan a un directorio común, por ejemplo si creas un directorio en /home que se llame ftp puedes hacer que todos los usuarios accedan a él cuando se conecten al servidor modificando /etc/proftpd/proftpd.conf.
DefaultRoot /home/ftp
Para que los usuarios que accedan al servidor puedan subir ficheros deberán tener permisos en el directorio /home/ftp. Puedes cambiar los permisos del directorio con:
sudo chmod 777 /home/ftp
De esta manera cualquiera podrá leer y escribir ficheros.
Cambiar el directorio por defecto según el grupo del usuario que accede:
También puedes cambiar el directorio por defecto al cual accede un usuario según el grupo al que pertenece, por ejemplo imagina que tienes dos grupos:
ftphome - Tendrán acceso a su home ftppublic - Tendrán acceso a /home/ftp
Puedes hacer que los usuarios del grupo ftphome accedan al directorio por defecto a su directorio home y los del grupo ftppublic al directorio /home/ftp cambiando el fichero de configuración:
DefaultRoot ~ ftphome
DefaultRoot /home/ftp ftppublic
Limitar el acceso al servidor a usuarios específicos:
El servidor es capaz de permitir el acceso a algunos usuarios y bloquear a otros, para ello deberemos escribir unas directivas en el fichero de configuración:
<Limit LOGIN>
AllowUser usuario1
DenyUser usuario2
</Limit>
En este ejemplo se permite el acceso al usuario1 y se denega el acceso al usuario2.
Las directrices que puedes introducir aquí para permitir o denegar el acceso son:
- AllowUser usuario - Permite el login al ftp al usuario.
- DenyUser usuario - Impide el login al ftp al usuario.
- AllowAll - Permite el login al ftp a todos los usuarios.
- DenyAll - Impide el login al ftp a todos los usuarios que no tengan una directiva AllowUser específica.
Limitar el número de sesiones simultáneas por usuario:
Puedes limitar la cantidad de sesiones simultáneas que un usuario puede tener abiertas con el servidor FTP con la directiva MaxClientsPerUser en el fichro de configuración:
MaxClientsPerUser 1
Hará que un usuario solo pueda tener una sesión abierta con el servidor a la vez.
Crear cuotas de transferencia para los usuarios:
Configurar el uso de cuotas:
Una manera de limitar el uso que se haga del servidor FTP por los usuarios es el de crear cuotas, que son límites de transferencia de ficheros.
Por ejemplo puedes querer crear un límite a la cantidad de ficheros que un usuario pueda subir al servidor FTP o descargar de él.
También puedes limitar la cantidad de datos (Bytes) subidos o descargados del servidor, ese tipo de cuotas se llama limit.
Por defecto las cuotas en ProFTPD están desactivadas:
<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>
Así que lo primero que tendrás que hacer es activarlas:
<IfModule mod_quotatab.c>
QuotaEngine on
QuotaLog /var/log/proftpd/quota.log
<IfModule mod_quotatab_file.c>
QuotaLimitTable file:/etc/proftpd/ftpquota.limittab
QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab
</IfModule>
</IfModule>
Con esta configuración le dices a ProFTPD que haga un fichero de log de cuotas en /var/log/proftpd/quota.log, y un ficheros con la tabla de cuotas en /etc/proftpd/ftpquota.limittab.
Las cuotas utilizan módulos adicionales de ProFTPD (mod_quotatab y mod_quotatab_file) así que debes indicarle a ProFTPD en el fichero de configuración que incluya el código de estos módulos descomentando la siguiente línea.
Include /etc/proftpd/modules.conf
Una vez cambiada la configuración deberás reiniciar el servidor.
Crear tabla de cuotas:
Para poder utilizar las cuotas de usuario primero has de crear una tabla donde se guardarán las cuotas que vayamos generando, para ello utilizarás el terminal:
sudo ftpquota --create-table --type=limit --table-path=/etc/proftpd/ftpquota.limittab
sudo ftpquota --create-table --type=tally --table-path=/etc/proftpd/ftpquota.tallytab
Crear una cuota de usuario:
Los ficheros que has creado antes /etc/proftpd/ftpquota.limittab son unas tablas con las cuotas de usuarios que generes, cada cuota de usuario será un registro de las tablas, vas a generar un registro de ejemplo:
Registro de ejemplo: * Usuario: usuario1 * Tipo de cuota: user, podría ser de grupo también. * Cantidad de información que puede subir al servidor: 2. * Cantidad de información que puede descargar del servidor: 40. * Especificamos las unidades en Mb. (2Mb de subida y 40Mb de descarga). * Cantidad de ficheros que puede subir al servidor: 15. * Cantidad de ficheros que puede descargar del servidor: 50.
sudo ftpquota --add-record --type=limit --name=usuario1 --quota-type=user --bytes-upload=2 --bytes-download=40 --units=Mb --files-upload=15 --files-download=50 --table-path=/etc/proftpd/ftpquota.limittab
Como puedes ver has añadido el registro, por lo que usas --add-record, también puedes modificar o borrar un registro:
- --add-record: Añadir registro de cuota.
- --update-record: Cambiar registro de cuota ya existente.
- --delete-record: Borrar registro de cuota.
- --show-record: Muestra los registros (necesitas poner el parámetro --type=limit o --type=tally, según qwuieras ver los límites por tamaño o por cantudad de ficheros).
La cuota es aplicada a un usuario y se acumula entre sesiones de FTP, si quisiers que los límites se aplicasen solamente a una sesión podrías utilizar la opción --per-session que indica que los límites son solo para la sesión y se reinician en la siguiente sesión.
Para más información sobre registros de cuota tienes la documentación oficial aquí
Ver las cuotas creadas:
Si has seguido el ejemplo anterior de usuario1 deberías poder ver las tablas con las siguientes instrucciones:
sudo ftpquota --show-records --type=limit
Si en algún momento excedes la cuota lo podrás ver en el fichero de log /var/log/proftpd/proftpd/quota.log
Limitar el ancho de banda de la transferencia:
Una opción importante para tu servidor, sobre todo si el ancho de banda es pequeño, es el limitar el ancho de banda que tiene un grupo de usuarios o, incluso, usuarios a nivel particular.
Para ello debes introducir en el fichero de configuración la directiva TransferRate:
TransferRate RETR 50 user usuario1
En el ejemplo la directiva afecta a un usuario llamado usuario1, a la acción RETR que es descargar datos del servidor y límita el ancho de banda a 50KBs.
Tienes más información de como limitar el ancho de banda en la documentación oficial de ProFTPD.
Modos de transferencia:
En FTP podemos hacer que los ficheros se transfieran en modo binario o en ASCII. Normalmente el modo binario servirá para todos los ficheros que tengamos que transmitir en todos los casos actuales, pero antes el modo ASCII se utilizaba para transmitir ficheros que estaban escritos en dicho código.
Para saber en qué modo transmite el servidor FTP debes escribir el comando type.
type
Para cambiar de modo simplemente introduce el comando type seguido del modo:
type ascii
o
type binary
Como ya comentamos el modo binario será el ideal a día de hoy para los ficheros que tengáis que transmitir... Sin embargo el modo ASCII puede provocar problemas en casos en que los ficheros no contengan solamente caracteres del código ASCII (la mayoría de los casos). Por ejemplo, si intentas transmitir un fichero de imagen en modo ASCII puedes encontrarte con un fichero que al abrirlo mostrará un error similar a éste:
Habilitar usuarios anónimos:
Una función que permiten los servidores FTP es dejar a usuarios anónimos conectarse a ellos.
Esto es algo que puede poner en riesgo tu equipo servidor por el mero hecho de que estarás dejando subir ficheros a perfectos desconocidos... A cambio puede ser un sistema de distribución de ficheros rápido si se impide que estos usuarios anónimos puedan subir ficheros al servidor.
Cosas a tener en cuenta:
- El usuario anónimo es en realidad un usuario creado en el sistema del servidor, con nombre ftp. Pero al cual se le dará el alias anonymous después emn la configuración de ProFTPD.
sudo adduser ftp
- Se debe crear un directorio que será donde se conecten los usuarios anónimos, ese directorio será propiedad del usuario ftp.
sudo mkdir -p /var/ftp
sudo chown -R ftp /var/ftp
En realidad los parámetros son innecesarios porque no has creado subdirectorios, pero por si acaso los dejo en el ejemplo.
- Se debe configurar el fichero proftpd.conf así:
# A basic anonymous configuration, no upload directories.
<Anonymous /var/ftp>
User ftp
Group nogroup
# # We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
# # Cosmetic changes, all files belongs to ftp user
DirFakeUser on ftp
DirFakeGroup on ftp
#
RequireValidShell off
#
# # Limit the maximum number of anonymous logins
MaxClients 10
# # Limit WRITE everywhere in the anonymous chroot
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
</Anonymous>
Como puede verse en useralias has puesto anonymous y ftp, así que ambos nombres de usuario permitirán acceder al servidor de forma anónima, la contraseña será un mail.
Se ha limitado a 10 el número de usuarios anónimos simultáneos con "MaxClients 10", ésto no es necesario.
El comando DenyAll evita que un usuario anónimo pueda subir ficheros al servidor, si se desconecta estarás dejando que cualquiera suba sus ficheros a tu servidor, ten en cuenta que podría colarse cualquier tipo de ficheros ilegales en tu servidor FTP y el responsable serías tú.
Log de ProFTPD:
Para consultar el log del servidor puedes hacerlo en:
sudo nano /var/log/proftpd/proftpd.log
Para consultar los usuarios que están conectados en el servidor tienes dos comandos:
ftpwho
o
ftptop