FTP (siglas en inglés de File Transfer Protocol, ‘Protocolo de Transferencia de Archivos’) en informática, es un protocolo de red para la transferencia de archivos entre sistemas conectados a una red TCP (Transmission Control Protocol), basado en la arquitectura cliente-servidor. Desde un equipo cliente se puede conectar a un servidor para descargar archivos desde él o para enviarle archivos, independientemente del sistema operativo utilizado en cada equipo.

El servicio FTP es ofrecido por la capa de aplicación del modelo de capas de red TCP/IP al usuario, utilizando normalmente el puerto de red 20 y el 21. Un problema básico de FTP es que está pensado para ofrecer la máxima velocidad en la conexión, pero no la máxima seguridad, ya que todo el intercambio de información, desde el login y password del usuario en el servidor hasta la transferencia de cualquier archivo, se realiza en texto plano sin ningún tipo de cifrado, con lo que un posible atacante puede capturar este tráfico, acceder al servidor y/o apropiarse de los archivos transferidos.

Para solucionar este problema son de gran utilidad aplicaciones como SCP y SFTP, incluidas en el paquete SSH, que permiten transferir archivos pero cifrando todo el tráfico.

Modos de conexión del cliente FTP

FTP admite dos modos de conexión del cliente. Estos modos se denominan activo (o Estándar, o PORT, debido a que el cliente envía comandos tipo PORT al servidor por el canal de control al establecer la conexión) y pasivo (o PASV, porque en este caso envía comandos tipo PASV). Tanto en el modo Activo como en el modo Pasivo, el cliente establece una conexión con el servidor mediante el puerto 21, que establece el canal de control.

Activo

Pasivo

Instalación de proFTPd

El proceso de instalación de este servidor FTP en Debian es muy sencillo. Bastará con instalar el paquetes proftpd desde un terminal con el siguiente comando sudo apt install proftpd

Durante la instalación nos preguntará sobre el tipo de instalación que queremos. En caso de hacer poco uso del servidor FTP podemos seleccionar la opción inetd para ahorrar recursos del sistema. Si vamos a hacer un uso considerable del servidor FTP con varios usuarios y bastante tiempo deberíamos instalarlo como independiente.

Seleccionamos la opción que más se ajuste a nuestras necesidades y finalizamos la instalación del servidor.

Configuración de proFTPd

El archivo de configuración principal de proFTPd se encuentra en /etc/proftpd/proftpd.conf. Desde aquí deberemos configurar la mayoría de los aspectos de nuestro servidor FTP.

Lo primero que debemos hacer es establecer una carpeta como directorio principal para todos los usuarios del FTP. Para ello, abriremos con nuestro editor de texto preferido el archivo de configuración anterior sudo nano /etc/proftpd/proftpd.conf

Una vez allí, buscaremos la línea comentada DefaultRoot y la descomentamos borrando la almohadilla #. Esto nos va a permitir que cuando cada usuario acceda a su cuenta del FTP, estos accederán directamente a su carpeta home.

También podemos hacer que todos los usuarios accedan por defecto a una carpeta (como en el paso anterior) salvo un usuario que queremos que acceda a otra o, simplemente, tenga permiso de administrador y pueda acceder a todo el disco.

El parámetro DefaultRoot tiene la siguiente estructura:

DefaultRoot [directorio] [grupo de usuarios que tendrán ese directorio por defecto] [Grupo de usuarios a los que no se les aplicará ese directorio]

Una vez hecha todas las modificaciones necesarias reiniciamos el servicio systemctl restart proftpd

Acceder a servidor FTP de forma anónima

Para ello vamos a modificar el fichero /etc/proftpd/proftpd.conf, y nos dirigimos a casi el final del documento donde encontraremos la etiqueta Anonymous ~ descomentaremos todas las lineas dentro de la etiqueta, ojo, solo las que tienen una sola #.
Una vez descomentado cambiaremos la etiqueta Anonymous ~, en la cual vamos a modificar el directorio anonymous para ello modificaremos ~ por el directorio el cual queremos acceder.

Si queremos comprobar si la configuracion realizada esta funcionando bien desde la terminal de nuestro equipo podemos ejecutar ftp localhost nos pedirá un usuario el cual sera anonymous y la contraseña en blanco, una vez conectados hacemos un ls y tendremos la lista de ficheros/carpetas que contiene el directorio.

También podemos comprobarlo desde un navegador o desde filezilla:

Navegador

Basta con poner la dirección que hemos definido en nuestro fichero de configuración ServerName "ftp.jlramirez.gonzalonazareno.org" y añadir en el /etc/hosts de nuestra maquina anfritiona o en un servidor dns que la ip del servidor ftp tiene esa dirección [IP_MAQUINA] ftp.jlramirez.gonzalonazareno.org

Filezilla

Para realizar esta comprabacion instalamos Filezilla apt instal filezilla en un cliente linux y añadimos un nuevo servidor:

Clicamos en conectar y ya tendremos el listado de ficheros/carpetas del directorio especificado:

Ofrecer una colección de documentos mediante http y ftp

Una vez tenemos configurado nuestro servidor ftp, vamos a instalar un Servidor Web una vez instalados vamos a crear un VirtualHosts que vamos a llamar /etc/apache2/sites-available/iesgn.conf y añadimos lo siguiente:

        ServerName www.iesgn.org

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        Alias "/documentos" "/var/www/html/documentos/"
        <Directory /var/www/html/documentos/>
                Options +Indexes        
        </Directory>

Una vez modificado el fichero vamos a habilitar el nuevo VirtualHost a2ensite iesgn.conf y reiniciamos el servicio systemctl restart apache2.
Ya solo queda añadir en nuestra maquina anfitriona al igual que antes la nueva direccion en el fichero /etc/hosts y añadimos [IP_Maquina] www.iesgn.org

ftp.jlramirez.gonzalonazareno.org

www.iesgn.org

Configuración de un usuario para acceso por ftp

Ahora vamos a crear un usuario en el servidor que se va a llamar informatica useradd user_informatica y le asignamos una contraseña passwd user_informatica.
Tambien vamos a crear el directorio mkdir /home/user_informatica y cambiamos el propietario de dicha carpeta chown -R user_informatica:user_informatica user_informatica/

Ahora vamos a modificar el fichero /etc/proftpd/proftpd.conf y vamos a añadir la siguiente linea DefaultRoot /var/www/html/user_informatica/ user_informatica, vamos a añadir tantas lineas como usuarios tengamos.

Info! Encontraremos uno definido por defecto, podemos hacer 3 cosas, o modificarlo, comentarlo o eliminarlo.

ftp.jlramirez.gonzalonazareno.org

Si introducimos en nuestro navegador ftp.jlramirez.gonzalonazareno.org nos pedirá el usuario y la contraseña del usuario valido.

Una vez introducido un usuario valido vamos a ver lo que contiene dicha carpeta.

www.iesgn.org

Ahora configuramos el VirtualHost creado anteriormente para poner la nueva ruta del nueva usuario:

        ServerName www.iesgn.org

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        Alias "/informatica" "/var/www/html/user_informatica/"
        
                Options +Indexes
        

        
                Options +Indexes
        

Y reiniciamos el servicio systemctl restart apache2

Y accedemos desde el navegador:

Info! Debes volver a comentar todas la lineas comentadas anteriormente para acceder de forma anónima.

Instalar net2ftp en debian Jessie

Instalar dependencias necesarias

Para ello primero debemos instalar apt install php5 mysql-server phpmyadmin, nos dirigimos a la carpeta donde tenemos alojados los ficheros del servidor web /var/www/html/.

Descargar y descomprimir net2ftp

Una vez en el directorio vamos a descargar el paquete net2ftp wget http://www.net2ftp.com/download/net2ftp_v1.0.zip y lo descomprimimos para lo cual necesitamos el paquete apt install zip, y lo descomprimimos unzip net2ftp_v1.0.zip.

Acceder a PhpmyAdmin

Ya tenemos el «.zip» descomprimido, el siguiente paso es entrar en «phpmyadmin» 192.168.1.52/phpmyadmin, vamos a acceder con el usuario root, que es el usuario que crea MySQL por defecto, creamos una base de datos que llamaremos net2ftp.

A continuación añadiremos las tablas correspondientes que podremos encontrar en la carpeta descomprimida de fichero descargado, por tanto importamos el fichero create_tables.sql

Y lo importamos en phpmyadmin:

Si todas las tablas se importan bien debe de aparecer lo siguiente:

Modificar fichero de configuración de net2ftp

Por ultimo vamos a modificar el fichero /files_to_upload/settings.inc.php, y vamos a modificar las siguientes lineas:

// ----------------------------------------------------------------------------------
// Admin Panel username and password
// If no password is set, the Admin panel will not be accessible by anyone
// ----------------------------------------------------------------------------------

$net2ftp_settings["admin_username"] = "user_informatica";
$net2ftp_settings["admin_password"] = "*****";


// MASTER SETTING that overrides the other settings below: use a database?
$net2ftp_settings["use_database"] = "no"; // "yes" or "no"

// Enter your MySQL settings
$net2ftp_settings["dbusername"] = "root";
$net2ftp_settings["dbpassword"] = "*****";
$net2ftp_settings["dbname"]     = "net2ftp";
$net2ftp_settings["dbserver"]   = "localhost"; // on many configurations, this is "localhost"
Info! En mi caso esto son los datos, pero cada uno tendra unos datos diferentes, las contraseñas y usuarios pueden cambiar.

Una vez cambiados reiniciamos el servicio de apache systemctl restart apache2 y accedemos en el navegador [Dirección IP]/net2ftp_v1.0/files_to_upload/ y ya tendremos nuestro cliente FTP instalado:

Acceder con usuarios virtuales

El uso de usuarios reales del sistema para el acceso FTP puede tener varias desventajas (gestión, seguridad,…). Modifica la configuración del sistema para que se usen usuarios virtuales para el acceso por FTP, cuya información este guardada en una tabla mysql o en un directorio ldap.

Nosotros vamos a utilizar mysql

Instalación del paquete necesarios

Instalamos los paquetes necesarios apt install mysql-server mysql-client proftpd-basic proftpd-mod-mysql

Creacion base de datos y tablas

El siguiente paso es editar el fichero /etc/proftpd/proftpd.conf, para que las siguientes lineas queden como especifico aqui:

#Descomentamos esta linea

RequireValidShell off

#Ahora configuramos proftp para que use usuarios virtuales, 
#que almacenaremos en una base de datos mysql. 
#En el fichero de configuración añadimos lo siguiente:

# Use this to jail all users in their homes
DefaultRoot                     /home/ftp/user_ftp user_ftp

AuthPAM off
SQLBackend mysql
SQLAuthTypes Backend
SQLAuthenticate on
SQLConnectInfo proftpd@localhost root root
SQLDefaultGID 65534
SQLDefaultUID 65534
SQLMinUserGID 500
SQLMinUserUID 500
SQLGroupInfo grupos groupname gid members
SQLUserInfo usuarios username password uid gid homedir shell
SQLUserWhereClause "activa=1"
SQLLogFile /var/log/proftpd_mysql.log

Por ultimo modificamos el fichero de los módulos mysql de proftpd, para ello editamos el siguiente fichero /etc/proftpd/modules.conf, descomentaremos las siguiente lineas:

# the existent SQL backeds.
LoadModule mod_sql.c

# Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c

Y reiniciamos el servicio systemctl restart proftpd

Poblar Base de Datos

Instalamos el servidor mysql apt install mysql-server, una ves instalado entramos en la base de datos con el usuario root, creamos la base de datos proftpd y le damos permisos:

root@ftp:/home/vagrant# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.53-0+deb8u1 (Debian)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE proftpd;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON proftpd.* TO proftpd@localhost IDENTIFIED BY "usuario";
Query OK, 0 rows affected (0.00 sec)

Una vez creada la base de datos, vamos a acceder use proftpd; y vamos a crear las tablas y vamos a insetar los datos:

mysql> CREATE TABLE usuarios (
    -> username char(20) NOT NULL,
    -> password char(70) NOT NULL,
    -> uid int(6) default NULL,
    -> gid int(6) default NULL,
    -> homedir char(50) default NULL,
    -> shell char(30) default NULL,
    -> activa tinyint(4) default '1',
    -> dominio char(50) default NULL
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE grupos (
    -> groupname char(20) NOT NULL,
    -> gid int(6) NOT NULL default '65534',
    -> members longtext
    -> );
Query OK, 0 rows affected (0.01 sec)

Y insertamos los datos:

mysql> insert into usuarios values('juanlu',password('usuario'),2001,2001,'/var/www/html/juanlu','/bin/bash',1,'jlramirez.com');
Query OK, 1 row affected (0.01 sec)

mysql> insert into grupos values('alumnos',2001,'alumnos');
Query OK, 1 row affected (0.00 sec)

Creamos la carpeta para el usuario virtual

Creamos la carpeta para el usuario virtual mkdir -p /home/ftp/user_ftp y los permisos chown -R 2001:2001 /home/ftp/user_ftp

Reiniciamos el servicio systemctl restart proftpd

Comprobacion usuarios virtuales

Accedemos desde un cliente ftp (en este caso se encuentra en la maquina que hace de servidor), por tanto, entramos con ftp localhost, especificamos el usuario y la contraseña. Y hacemos un ls, para comprobar el contenido: