Servidor FTP con usuarios virtuales

FTP (sigla 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, o apropiarse de los archivos transferidos.

Extraído de wikipedia (más info)

Procedimiento para instalar Servidor FTP con usuarios virtuales (pureftp + mysql):

Instalación de aplicaciones:

Actualizo la información del repositorio antes de instalar.

< sudo apt-get update

Instalo los servicios necesarios.

< sudo apt-get install pure-ftpd-mysql mysql-server

Durante la configuración del mysql el asistente solicitará la contraseña para la conexión del usuario ‘root’, esta será utilizada más adelante.

Configuración:

Muevo el archivo original y creo uno nuevo (siempre es conveniente dejar los archivo originales como documentación).

< sudo mv /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.ori

Creo el archivo mysql.conf

< sudo vi /etc/pure-ftpd/db/mysql.conf

Con el siguiente contenido.

#MYSQLServer     127.0.0.1
#MYSQLPort       3306
MYSQLSocket      /var/run/mysqld/mysqld.sock
MYSQLUser       pureftp
MYSQLPassword   secreto
MYSQLDatabase   pureftp
MYSQLCrypt      md5
MYSQLGetPW      SELECT Password FROM users WHERE User="\L"
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"
#MYSQLDefaultUID 1000
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"
#MYSQLDefaultGID 1000
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"
#MySQLGetQTAFS  SELECT QuotaFiles FROM users WHERE User="\L"
#MySQLGetQTASZ  SELECT QuotaSize FROM users WHERE User="\L"
#MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"
#MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"
# MySQLForceTildeExpansion 1
# MySQLTransactions On

Para poder utilizar el ftp detrás del firewall es necesario definir los puertos sobre los cuales se van a establecer las conexiones pasivas.

< echo "40110 40210" | sudo tee /etc/pure-ftpd/conf/PassivePortRange

A continuación hay que conectarse al motor de base de datos,

< mysql -u root -p

Solitará ingresar la contraseña definida durante la instalación del paquete mysql

En el motor de base de datos se deben ejecutar los siguientes comandos:

< CREATE DATABASE IF NOT EXISTS `pureftp`;
< CREATE TABLE `pureftp`.`users` (
  `User` varchar(16) NOT NULL DEFAULT '',
  `Password` varchar(64) NOT NULL DEFAULT '',
  `Uid` int(11) NOT NULL DEFAULT '-1',
  `Gid` int(11) NOT NULL DEFAULT '-1',
  `QuotaSize` int(11) NOT NULL DEFAULT '0',
  `Dir` varchar(100) NOT NULL DEFAULT '0',
  `ULBandwidth` int(11) NOT NULL DEFAULT '0',
  `DLBandwidth` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
< GRANT select ON pureftp.users TO pureftp@localhost identified by 'secreto';
< FLUSH PRIVILEGES;

Como son usuarios virtuales, armo un árbol para alojar la estructura de los mismos.

< sudo mkdir -p /var/ftp-users/
< chmod 444 /var/ftp-users

Como último paso se debe reiniciar el servicio para que tome los cambios.

< sudo /etc/init.d/pure-ftpd-mysql restart

Se deben abrir los siguientes puertos para permitir las conexiones al ftp:

20, 21, 40110:40210

Procedimiento de alta de usuarios:

Como ejemplo genero el usuario ‘usr01’ al que le voy a asiganr el uid ‘10001’ y el gid ‘10001’.

Creo el directorio donde el usuario guardará la información.

< sudo mkdir -p /var/ftp-users/usr01

y asigno permisos para que pueda escribir

< chown 10001.10001 /var/ftp-users/usr01

A continaución me conecto base de datos.

< mysql -u root -p

Y ejecuto esta sentencia (en este caso limite el ancho de banda a 24k para la subida y bajada) para dar de alta el usuario.

< INSERT INTO `pureftp`.`users` VALUES ('usr01', MD5('secreto-usuario'), 10001, 10001, 0, '/var/user/usr01/./', 24, 24);

Al definir ‘/./’ en el path del usuario restringo a que no pueda navegar el árbol de directorios para abajo.

Deja un comentario