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:
ip a
scp ./smr-ftp-server.tar alumno@<<ip_máquina_virtual>>:/home/alumno/ftp
docker load < smr-ftp-server.tar
docker image ls
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
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
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).
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: