Servidor FTP con Pure-ftpd

En este tutorial vamos a explicar como podemos configurar un servidor ftp con pure-ftpd.
He elegido este servidor porque es muy sencillo de configurar (toda la configuración se hace mediante los parámetros que le pasamos en el arranque), tiene muchas opciones útiles como cuotas, usuarios virtuales, etc, y es muy seguro.
Con pure-ftpd tendremos en poco tiempo un potente servidor ftp que podremos configurar de una forma muy flexible de manera muy sencilla.

Instalación

Para instalarlo, lo más recomendable es bajar los fuentes de la página oficial: http://www.pureftpd.org
Una vez descargados lo compilaremos. El hecho de compilarlo, no debe asustarnos, ya que en este caso no nos encontraremos problemas de dependencias, y así especificaremos explícitamente qué opciones querremos que nuestro servidor ftp soporte.

Descargaremos la última versión, pure-ftpd-1.0.20.tar.gz en mi caso, la descomprimiremos y entraremos en el directorio que nos ha creado:

$ tar -xvzf pure-ftpd-1.0.20.tar.gz
$ cd pure-ftpd-1.0.20

Ahora procederemos a compilarlo; para ello leeremos el fichero INSTALL que hay en el mismo directorio y veremos que nos dice que son instrucciones genéricas, con lo que en un principio haciendo el./configure; make; make install ya lo tendríamos instalado. De todos modos queremos afinar la compilación, así que miraremos que opciones podemos pasarle al configure para hacerlo a nuestro gusto. Haremos lo siguiente:

$ ./configure --help

Y veremos todas las opciones que podemos indicarle. En nuestro caso (evidentemente aquí cada uno puede hacer lo que crea mejor, todo depende del uso que vaya a darse al servidor) elegiremos las siguientes:

  • –without-inetd -> Como el servidor lo tendremos como un proceso aparte, no necesitamos soporte inetd
  • –with-puredb -> Soporte para usuarios virtuales
  • –with-ratios -> Soporte para ratios de subida/bajada
  • –with-quotas -> Soporte para cuotas
  • –with-ftpwho -> Soporte para poder ver al momento quien está conectado y qué está haciendo
  • –with-throttling -> Soporte para limitar el ancho de banda
  • –with-language=spanish -> Soporte para nuestro idioma

Todas estas opciones se encuentran explicadas en el fichero README del mismo directorio. Una vez sabemos qué opciones queremos, procederemos a configurar y compilar el programa:

$ ./configure --without-inetd --with-puredb --with-ratios --with-quotas --with-ftpwho --with-throttling --with-language=spanish
$ make
$ su
# make install

Una vez hecho esto, ya tenemos nuestro servidor ftp instalado en /usr/local/sbin/pure-ftpd (esto nos lo explica también en el README).

Configuración

Como hemos dicho al principio, la configuración del servidor se hace exclusivamente en el paso de parámetros al arrancar el servidor. Antes de ello por eso, vamos a configurar los usuarios virtuales.

Usuarios virtuales

Los usuarios virtuales son usuarios que sólo existirán para el ftp. Pero para ello, necesitamos asociar estos usuarios virtuales del ftp con un usuario del sistema para que puedan operar. Entonces, lo primero que haremos será crear un usuario sin privilegios en el sistema, y asociaremos los usuarios virtuales a este usuario.
Recordad que para poder utilizar los usuarios virtuales debemos haber compilado el programa con la opción –with-puredb

Creando un usuario en el sistema:

Crearemos el usuario: ftpuser y el grupo ftpgroup por ejemplo (deberemos hacerlo como root):

# groupadd ftpgroup
# useradd ftpuser -g ftpgroup -d /dev/null -s /bin/false

Con esto hemos creado un grupo ftpgroup y un usuario ftpuser que pertenece a ese grupo. Además, el usuario tendrá como directorio home /dev/null (es decir, no tendrá) y como shell por defecto /bin/false (para que no tenga una shell válida). Hemos de asegurarnos de que la shell que indiquemos aparezca en el fichero /etc/shells. Si no es así la añadiremos nosotros al final del mismo.

Creando y manipulando usuarios virtuales:

Para la configuración de los usuarios virtuales utilizaremos el comando: pure-pw
Este comando mantiene la base de datos de los usuarios virtuales. Vamos a añadir un usuario virtual (como root):

# pure-pw useradd nacx -u ftpuser -g ftpgroup -d /home/ftpusers/nacx -t 20 -T 10

Nos pedirá una contraseña para ese usuario. Una vez introducida, ya habremos creado para el ftp el usuario nacx, que tendrá como directorio de inicio (cuando se conecte al ftp) el directorio /home/ftpusers/nacx. Además, hemos establecido que tendrá un ancho de bajada de 20kb/s y de subida de 10kb/s (para poder usar estos parámetros debemos haber compilado con la opción –with-throttling. También hemos asociado este usuario virtual con el usuario del sistema previamente creado (esto deberemos hacerlo con todos los usuarios que creemos).

Una vez que hemos creado todos los usuarios (o cada vez que modifiquemos la información de alguno) hemos de actualizar la base de datos de los usuarios virtuales con el comando:

# pure-pw mkdb

Esto guarda la información en el fichero /etc/pureftpd.pdb
Con esto ya tenemos nuestro servidor ftp preparado para recibir conexiones de estos usuarios virtuales.
Para cualquier duda sobre como borrar o modificar usuarios virtuales, podéis consultar el: man pure-pw

Arrancando el servidor

Con todo configurado ya sólo nos queda arrancar el servidor. Podemos ver una lista completa de las opciones de que disponemos haciendo un man pure-ftpd. Aquí ponemos un ejemplo de cómo arrancarlo con una configuración más o menos usual, y explicaremos esas opciones.

Arrancaremos el servidor con los siguientes parámetros:

# /usr/local/sbin/pure-ftpd -lpuredb:/etc/pureftpd.pdb -A -B -c 5 -C 2 -d -E -i -j -u 100

Las opciones que hemos considerado son:

  • -A -> Hacer chroot (para que nadie pueda salir de su directorio de inicio hacia directorios superiores)
  • -B -> Correr en background (para tener el proceso en segundo plano)
  • -c 5 -> 5 conexiones simultaneas como máximo
  • -C 2 -> 2 conexiones simultaneas para una misma ip
  • -d -> Log verboso (loguea con bastante información)
  • -E -> No permitimos usuarios anónimos
  • -i -> Los usuarios anónimos no pueden subir cosas (se puede omitir si tenemos: -E)
  • -j -> Si al entrar un usuario aún no existe su directorio raíz, lo crea. Así nos ahorramos crear nosotros el directorio después de añadir un usuario virtual; ya se creará cuando entre por primera vez.
  • -u -> Mínimo uid para entrar (para que no se pueda entrar como usuario privilegiado del sistema)
  • -lpuredb:/etc/pureftpd.pdb -> Indicamos cual es el fichero donde se guardan los usuarios virtuales

Estas son un ejemplo de las opciones que se pueden utilizar para arrancar el servidor. Una vez arrancado ya está completamente configurado. Como veis, es bastante sencillo de utilizar.

Creando un script de inicio:

Como puede ser bastante incómodo tener que poner el comando entero cada vez que queremos arrancar el servidor, vamos a ponerlo en un script para facilitar la tarea. Un ejemplo podría ser el siguiente:

#!/bin/bash

case "$1" in

start)

echo "Arrancando pure-ftpd..."
/usr/local/sbin/pure-ftpd -lpuredb:/etc/pureftpd.pdb -A -B -c 5 -C 2 -d -E -i -j -u 100
;;
stop)

echo "Terminando pure-ftpd..."
killall pure-ftpd

;;*)

echo "Uso: $0 {start|stop}"
exit 1

;;esac
exit 0

Sería práctico sería también poner comentados (con al carácter # delante) en alguna parte del fichero los significados de los parámetros que le pasamos al programa.
Podemos guardar este script en el directorio /etc/init.d/ para ponerlo como demonio y que se ejecute cada vez al arrancar el sistema. O si no podemos utilizarlo para arrancar/parar el servidor manualmente con (estando en el mismo directorio que el script):

# ./nombre_script start
# ./nombre_script stop

Ahora ya tenemos un completísimo servidor ftp, seguro, robusto y que además es tan fácil de configurar como añadir o quitar algún parámetro el script que nos hemos hecho para arrancar el servidor.

Tutorial elaborado por Nacx para ADSLAyuda.com