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:

  • alpine-base: Máquina virtual que incluye docker, docker Compose y ssh para facilitar la conexión remota y la gestión del entorno.
  • Importa la máquina virtual descargada y accede con usuario: alumno, password: alumno
  • Crea un directorio ftp y accede a él
  • Obtén la IP de la máquina virtual:

ip a

  • Desde tu máquina, copia la imagen docker mediante ssh:

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

  • Carga la imagen docker en la máquina virtual:

docker load < smr-ftp-server.tar

  • Comprueba que se ha cargado la imagen docker correctamente:

docker image ls

  • Crea la carpeta data-ftp donde almacenaremos los archivos de los usuarios.
  • Dentro del directorio /home/alumno/ftp de la máquina virtual crea un archivo llamado docker-compose.yml (puedes crear el archivo en tu máquina local y copiarlo en la máquina virtual mediante ssh);

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

  • Arranca el contenedor y comprueba que está todo correcto
  • Configura la conexión en FileZilla desde tu máquina local:
    • Servidor: «ip_máquina_virtual>
    • Nombre de usuario: alpineftp
    • Password: alpineftp
    • Puerto: 21
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
  • Conéctate al servidor FTP y sube cualquie archivo
  • Comprueba que el archivo subido está en la carpeta data-ftp de la máquina virtual

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

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.

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

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.

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

  • openssl req: Este comando de OpenSSL se utiliza para generar una solicitud de certificado (CSR) o, en este caso, un certificado autofirmado.
  • -x509: Esta opción indica que deseas generar un certificado autofirmado (en lugar de una solicitud de firma de certificado). El formato X.509 es el estándar utilizado para certificados digitales en SSL/TLS.
  • -nodes: Significa “no DES”, lo que quiere decir que no se cifrará la clave privada generada con una contraseña. Esto es útil cuando no deseas tener que ingresar una contraseña cada vez que inicies el servidor. Sin embargo, hay que tener en cuenta que la clave privada no estará protegida por una contraseña, lo que puede no ser adecuado para entornos de producción.
  • -days 365: Esta opción indica que el certificado será válido por 365 días (un año). Puedes cambiar este valor según el tiempo que desees que dure el certificado.
  • -newkey rsa:2048: Esta opción genera una nueva clave privada utilizando el algoritmo RSA, con un tamaño de 2048 bits. Cuanto mayor es el tamaño de la clave, mayor es la seguridad, pero también más lenta es la operación.
  • -keyout /etc/letsencrypt/ftp-site.key: Aquí se define la ruta donde se guardará la clave privada generada. En este caso, se guardará en /etc/letsencrypt/ftp-site.key. Esta clave se usará para cifrar las conexiones.
  • -out /etc/letsencrypt/ftp-site.crt: Esta opción define el archivo donde se guardará el certificado público autofirmado. En este caso, se guardará en /etc/letsencrypt/ftp-site.crt. Este archivo se utilizará para cifrar las conexiones de los clientes al servidor FTP.

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

  • Country Name (2 letter code): El código de dos letras de tu país: ES
  • State or Province Name (full name): El nombre completo de tu estado o provincia: Valencia
  • Locality Name (e.g., city): El nombre de tu ciudad: Mislata
  • Organization Name (e.g., company): El nombre de tu organización: CIPFP Mislata
  • Organizational Unit Name (e.g., section): El nombre de la unidad organizativa: SMR
  • Common Name (e.g., server FQDN or YOUR name): El nombre común (Common Name), que generalmente debe ser el dominio completo o la dirección IP de tu servidor: ftp.cipfpmislata.smr.sr.com
  • Email Address: Un correo electrónico de contacto: smr.sr@cipfpmislata.com

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

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:

  • Cifrado de las comunicaciones: Los certificados permiten cifrar todas las comunicaciones entre el cliente FTP (como FileZilla) y el servidor FTP. Esto asegura que los datos, como contraseñas y archivos, no puedan ser interceptados y leídos por terceros en la red. Sin cifrado, la información viaja en texto claro, lo que puede ser riesgoso, especialmente en redes públicas o no confiables.
  • Autenticación del servidor: Un certificado garantiza que el cliente se conecta con el servidor legítimo y no con un impostor. Al verificar el certificado del servidor, el cliente puede asegurarse de que está interactuando con el servidor correcto, evitando ataques como el “man-in-the-middle”.
  • Integridad de los datos: Los certificados ayudan a garantizar que los datos no sean alterados mientras se transmiten. Si los datos fueran modificados en el camino (por ejemplo, por un atacante), la conexión sería rechazada debido a que el certificado y la clave no coincidirían, alertando al cliente de un posible ataque.
  • clase/smr/sr/2eval/ftp2.txt
  • Última modificación: 2025/01/13 12:40
  • por cesguiro