Tabla de Contenidos

10 - FTP: ftp-server

En esta práctica se configurará un servidor FTP utilizando una imagen docker sobre una máquina virtual con Alpine Linux. Los componentes para la práctica serán:

Preparar la máquina virtual

ip a

scp ./smr-ftp-server.tar alumno@<<ip_máquina_virtual>>:/home/alumno/ftp

docker load < smr-ftp-server.tar

docker image ls

Preparar el entorno con Docker Compose

name: 'ftp'

services:
  ftp-server:
    image: smr/ftp-server
    container_name: ftp-server
    ports:
      - "21:21"       # Puerto FTP
      - 21000-21010:21000-21010 # Rango de puertos pasivos
    volumes:
      - ./data-ftp:/ftp   # Carpeta para almacenar los archivos
    environment:
      - ADDRESS=<<ip_máquina_virtual>
    restart: always

Por defecto, el usuario y contraseña del servidor ftp es alpineftp. Más adelante ya añadiremos nuevos usuarios.

Para los puertos pasivos, el rango por defecto es 21000 - 21010. Si quisiéramos cambiarlos tendríamos que usar las variables de entorno MIN_PORT y MAX_PORT

Una vez tengas configurado el servidor FTP, puedes probar a subir, descargar, renombrar… archivos o directorios.

Añadiendo usuarios

Para añadir usuarios, podemos definir la variable de entorno USERS con el formato:

name1|password1|[folder1][|uid1] name2|password2|[folder2][|uid2]

Las variables folder y uid son opcionales

Vamos a añadir un par de usuarios:

name: 'ftp'

services:
  ftp-server:
    image: smr/ftp-server
    container_name: ftp-server
    ports:
      - "21:21"       # Puerto FTP
      - 21000-21010:21000-21010 # Rango de puertos pasivos
    volumes:
      - ./data-ftp:/ftp   # Carpeta para almacenar los archivos
    environment:
      - USERS=user1|user1 user2|user2
      - ADDRESS=<<ip_máquina_virtual>
    restart: always

Ahora nos debería dejar conectarnos con esos dos nuevos usuarios. Además, cada usuario debería poder acceder sólo a su carpeta ftp.

Cambiando el directorio de trabajo

El contenedor está preparado para trabajar con la carpeta /ftp. Si queremos, por ejemplo, que los usuarios puedan trabajar con su carpeta /home, deberíamos modificar la definición de los mismos. Además, crearemos otra carpeta en nuestra máquina local para mapear /home del contenedor (podríamos haber eliminado el mapeo de data-ftp:/ftp, pero lo dejamos por simplicidad y para evitar confusiones):

name: 'ftp'

services:
  ftp-server:
    image: smr/ftp-server
    container_name: ftp-server
    ports:
      - "21:21"       # Puerto FTP
      - 21000-21010:21000-21010 # Rango de puertos pasivos
    volumes:
      - ./data-ftp:/ftp   # Carpeta para almacenar los archivos
      - ./home-ftp:/home
    environment:
      - USERS=user1|user1|/home/user1 user2|user2|/home/user2
      - ADDRESS=<<ip_máquina_virtual>
    restart: always

Configurando FTPS

Para habilitar FTPS (FTP sobre TLS/SSL) en el servidor, necesitamos generar un certificado y configurarlo en el contenedor. Aunque se podría generar un certificado utilizando Certbot, en este caso, para pruebas y por si la conexión a Internet falla, utilizaremos un certificado autofirmado.

Crear un certificado autofirmado con OpenSSL

Primero, crea la carpeta donde almacenaremos los certificados:

sudo mkdir -p /etc/letsencrypt

Para generar un certificado autofirmado que puedas usar con FTPS, puedes utilizar openssl:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/letsencrypt/ftp-site.key -out /etc/letsencrypt/ftp-site.crt

Al ejecutar este comando, openssl te pedirá que ingreses cierta información para asociar al certificado:

Una vez completes estos campos, openssl generará la clave privada (ftp-site.key) y el certificado público (ftp-site.crt).

Configurar el servidor FTP para usar el certificado

Una vez que tengas el certificado y la clave privada, modifica el archivo docker-compose.yml para incluir las rutas a estos archivos y habilitar el soporte FTPS. Además, mapearemos la carpeta que contiene los certificados en la máquina local a la del contenedor Docker:

 
name: 'ftp'

services:
  ftp-server:
    image: smr/ftp-server
    container_name: ftp-server
    ports:
      - "21:21"       # Puerto FTP
      - 21000-21010:21000-21010 # Rango de puertos pasivos
    volumes:
      - ./data-ftp:/ftp   # Carpeta para almacenar los archivos
      - ./home-ftp:/home
      - /etc/letsencrypt:/etc/letsencrypt  # Mapear certificados      - 
    environment:
      - USERS=user1|user1|/home/user1 user2|user2|/home/user2
      - ADDRESS=<<ip_máquina_virtual>
      - TLS_CERT=/etc/letsencrypt/ftp-site.crt  # Ruta al certificado
      - TLS_KEY=/etc/letsencrypt/ftp-site.key  # Ruta a la clave privada
    restart: always

Cuando configures FTPS, FileZilla te advertirá que el certificado es “desconocido” o “no confiable”. Esto es normal si estás usando un certificado autofirmado, ya que no ha sido emitido por una autoridad certificadora (CA) reconocida. En este caso, puedes optar por aceptar el certificado manualmente. Esta advertencia solo aparece porque el certificado no ha sido validado por una entidad externa confiable.

El uso de certificados en el contexto de FTPS tiene varias ventajas importantes: