FTP (File Transfer Protocol, Protocolo de Transferencia de Archivos) es un protocolo de red que permite transferir archivos de forma rápida y sencilla entre ordenadores. Se utiliza para compartir archivos y directorios, pudiendo establecer autentificación de usuarios (con nombre y contraseña) y permisos sobre los elementos compartidos. Los servidores FTP se usan principalmente para tres cosas:

  1. subir las páginas web al hosting.
  2. como servidor de archivos de libre acceso (denominado FTP anónimo). Los FTP anónimos son servidores FTP a los que puede conectarse cualquiera empleando como usuario anonymous y como password cualquier dirección de correo (servirá cualquier secuencia de caracteres que incluya "@").
  3. hacer backup (copia de seguridad).

Este protocolo se implementa con arquitectura cliente-servidor, por lo que necesita:

  • un servidor FTP que se esté ejecutando en la máquina remota, y que por defecto, estará escuchando en los puertos 20 y 21 TCP (el puerto 20 se utiliza para la transmisión de datos y el puerto 21 para los comandos de control).
  • un cliente FTP para conectarnos al servidor.

Un problema del protocolo FTP es que no cifra los datos, por lo que es vulnerable a la captura de la información transmitida, especialmente las contraseñas de acceso. Si necesitamos conexiones FTP seguras disponemos de servidores FTP encriptados, como SFTP (FTP sobre SSH) o FTPS (FTP sobre SSL).

En Linux hay muchos servidores FTP, vamos a ver un par de ellos:

  • VS-FTPd: ligero y fácil de configurar, es considerado el servidor FTP más rápido y seguro.
  • ProFTPd: muy configurable y bien documentado.

Equivalencias en Windows: MS-FTP.

Servidor FTP VS-FTPd

VS-FTPd (Very Secure FTP Daemon, vsftpd.beasts.org, paquete vsftpd), ligero y fácil de configurar, es considerado el servidor FTP más rápido y seguro.

El archivo de configuración de VS-FTPd es /etc/vsftpd.conf. Veamos algunas de sus principales directivas, por ejemplo, para el caso de un servidor web que da hosting a varios sitios web:

  • no permitir acceso anónimo al servidor:
    anonymous_enable=NO
  • permitimos acceso a los usuarios locales (excepto los que figuren en /etc/ftpusers):
    local_enable=YES
  • damos permisos de escritura a los usuarios:
    write_enable=YES
  • impedimos a los usuarios locales salir de su directorio personal:
    chroot_local_user=YES

Grabamos los cambios y reiniciamos el demonio vsftpd:

# /etc/init.d/vsftpd restart

Por último, tenemos que crear y securizar los usuarios que usarán el servidor FTP para que tengan los mínimos permisos. En nuestro ejemplo los usuarios son los webmaster de los sitios web alojados:

  • crearemos el grupo ftp al cual asociaremos los usuarios del servidor FTP:
    # groupadd ftp
  • creamos los usuarios del servidor FTP (el shell /bin/false debe existir y figurar en /etc/shells):
    # useradd -g ftp -d /var/www/domain1 -c "Webmaster domain1"
      -s /bin/false webmaster1
  • y asignamos password a los usuarios:
    # passwd webmaster1

Probaremos a conectarnos desde un cliente FTP (por ejemplo con un navegador, con ftp://<IP_del_servidor>). Introduciremos el usuario y su contraseña y comprobaremos que nos redirige al directorio de su web, que podemos subir y bajar archivos al servidor y que no podemos subir de nivel en el árbol de directorios.

Servidor FTP ProFTPd

ProFTPd (proftpd.org, paquete proftpd), es uno de los servidores más utilizados en Linux, es muy configurable y está bien documentado.

Durante la instalación nos preguntará si queremos ejecutar ProFTPd como demonio independiente o mediante inetd (escogeremos standalone) y se creará el usuario ftp, con directorio personal /home/ftp, shell /bin/false y sin contraseña. El directorio /home/ftp sólo contiene el archivo welcome.msg, cuyo contenido se muestra al conectarse.

El archivo de configuración de ProFTPd es /etc/proftpd/proftpd.conf. Veamos algunas de sus principales directivas:

  • directorio al que entrará el usuario (por defecto es su directorio personal "~"):
    DefaultChdir ~
  • directorio donde se encierra el servidor, de modo que no se pueda acceder a directorios superiores. Esto equivale a chrootear el server. Nunca debemos poner el directorio raíz ("/"), ya que los usuarios tendrán acceso a todo el sistema.
    DefaultRoot ~
  • mostrar o no los links (off/on).
    ShowSymlinks off
  • si queremos aplicar directivas sólo a un directorio, las pondremos dentro de un bloque Directory:
    <Directory [directorio]>
        directivas...
    </Directory>
  • para indicarle a ProFTPd que un directorio debe ser tratado como un directorio de acceso anónimo y aplicarle directivas específicas, usaremos:
    <Anonymous [directorio]>
        directivas...
    </Anonymous>
  • podemos especificar quién puede hacer qué:
    <Limit [LOGIN] [READ] [WRITE] [STOR] [ALL]>
        quién...
    </Limit>
  • para limitar el acceso usaremos:
    <Limit LOGIN>
        quién...
    </Limit>

Grabamos los cambios y reiniciamos el demonio proftpd:

# /etc/init.d/proftpd restart

Para probar el servidor nos conectaremos con un cliente FTP (ftp://<IP_del_servidor>), nos loguearemos con usuario y contraseña y comprobaremos que accedemos a la carpeta personal, que podemos subir y bajar archivos al servidor y que no podemos escalar en el árbol de directorios.

Comandos de ProFTPd

ProFTPd proporciona varios comandos útiles.

  • El comando ftpwho nos permite ver qué usuarios están conectados en un momento dado, qué están haciendo y desde cuándo están conectados:
    $ ftpwho
    standalone FTP daemon [2178], up for 2 hrs 22 min
        2420 francis [2m 36s] 2m 01s idle
    Service class           - 1 user
  • El comando ftptop monitoriza ProFTPd en tiempo real:
    $ ftptop
  • Para expulsar a un usuario del servidor FTP, miraremos el ID de su proceso con cualquiera de los dos comandos anteriores (ftpwho o ftptop) y mataremos el proceso. Por ejemplo, para tirar al usuario francis, cuyo ID es 2420, haremos:
    # kill -9 2420

Frontales gráficos para configurar ProFTPd

  • GProFTPd (gadmintools.org, paquete gproftpd): frontal para configurar ProFTPd escrito en GTK.