Transferència de fitxers en Linux
1. Servidor SFTP en Linux: La solució recomanada
1.1 Per què començar amb SFTP?
Començarem per SFTP perquè és la solució més recomanable per a la majoria d'escenaris actuals. Com hem vist a la part teòrica, SFTP ofereix excel·lent seguretat, simplicitat de configuració i integració natural amb sistemes Linux. A més, si estàs treballant amb un servidor Linux modern, gairebé segur que ja tens tot el necessari instal·lat.
La majoria de distribucions Linux modernes vénen amb OpenSSH preinstal·lat, i OpenSSH inclou el suport per SFTP de manera nativa. Això significa que en molts casos, el servidor SFTP ja està funcionant i només cal configurar-lo adequadament per als teus usuaris.
1.2 Verificant que OpenSSH està instal·lat
Abans de començar amb la configuració, verificarem que OpenSSH està instal·lat i funcionant al teu servidor. Aquests exemples estan testats amb les versions actuals de les distribucions més populars el 2024-2025.
En sistemes basats en Debian (Ubuntu, Debian, Linux Mint), executarem aquestes comandes al terminal com a root o utilitzant sudo:
# Comprovar si OpenSSH està instal·lat i quina versió tens
ssh -V
# Hauries de veure quelcom com:
# OpenSSH_9.6p1 Ubuntu-3ubuntu13, OpenSSL 3.0.13 30 Jan 2024
# Aquesta és la versió que ve amb Ubuntu 24.04 LTS (Noble Numbat)
Si OpenSSH no està instal·lat (cosa poc probable en un servidor modern), pots instal·lar-lo amb aquesta comanda:
# Per a Ubuntu/Debian 24.04 LTS i posteriors
sudo apt update
sudo apt install openssh-server
# Després de la instal·lació, el servei s'inicia automàticament
# Però podem verificar-ho:
sudo systemctl status ssh
# Per assegurar-nos que s'inicia automàticament en arrencar el sistema:
sudo systemctl enable ssh
Per a sistemes basats en Red Hat (Rocky Linux, AlmaLinux, CentOS Stream, Fedora), el procés és similar però utilitza el gestor de paquets dnf:
# Comprovar la versió d'OpenSSH en Rocky Linux 9
ssh -V
# Hauries de veure:
# OpenSSH_8.7p1, OpenSSL 3.0.7 1 Nov 2022
# Aquesta és la versió estable que ve amb Rocky Linux 9.3
# Si cal instal·lar-lo:
sudo dnf install openssh-server
# Iniciar i habilitar el servei (en sistemes RHEL el servei es diu sshd):
sudo systemctl start sshd
sudo systemctl enable sshd
# Verificar l'estat:
sudo systemctl status sshd
És important entendre que aquestes versions d'OpenSSH (8.7 en Rocky Linux 9, 9.6 en Ubuntu 24.04) són versions molt madures i segures. OpenSSH té un historial de seguretat excepcional, amb poques vulnerabilitats crítiques al llarg dels anys. Qualsevol d'aquestes versions suporta SFTP protocol versió 3 i les versions més recents també suporten la versió 6.
1.3 Configuració bàsica de SFTP per a tots els usuaris
El fitxer de configuració principal d'OpenSSH és /etc/ssh/sshd_config. Aquest fitxer controla tots els aspectes del servidor SSH, incloent SFTP. Anem a revisar les opcions més importants per a una configuració segura el 2024-2025.
Primer, farem una còpia de seguretat del fitxer de configuració original, una pràctica que sempre hauries de seguir:
# Crear una còpia de seguretat amb la data actual
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d)
# Ara podem editar el fitxer amb l'editor que prefereixis
sudo nano /etc/ssh/sshd_config
# o bé
sudo vim /etc/ssh/sshd_config
Dins d'aquest fitxer, buscarem o afegirem les següents línies. És important entendre què fa cada una d'aquestes opcions:
# Subsistema SFTP: aquesta línia indica quin programa s'executarà
# quan un client demani el subsistema SFTP
# En sistemes moderns, sftp-server està ubicat aquí:
Subsystem sftp /usr/lib/openssh/sftp-server
# Nota: En sistemes Red Hat/Rocky Linux, la ruta pot ser diferent:
# Subsystem sftp /usr/libexec/openssh/sftp-server
# Pots trobar la ruta correcta amb: which sftp-server
# Opcions de seguretat recomanades per al 2024-2025:
# Només permetre Protocol 2 de SSH (el Protocol 1 és obsolet i insegur)
# Nota: En versions modernes d'OpenSSH (7.0+), això és el valor per defecte
# i aquesta opció fins i tot pot haver desaparegut de la configuració
Protocol 2
# Permetre autenticació per clau pública (recomanat)
PubkeyAuthentication yes
# Permetre autenticació per contrasenya (desactiva-ho si només vols claus)
PasswordAuthentication yes
# Emmagatzematge de les claus autoritzades dels usuaris
# Per defecte, cada usuari té les seves claus a ~/.ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
# Desactivar autenticació per host (generalment no necessària)
HostbasedAuthentication no
# No permetre login directe com a root via SSH (bona pràctica de seguretat)
PermitRootLogin no
# Només permetre algorismes de xifratge moderns i segurs
# Aquesta és una configuració conservadora però segura per al 2024:
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
# Algorismes de MAC (Message Authentication Code) segurs:
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
# Algorismes d'intercanvi de claus moderns:
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
# Algorismes de clau pública del servidor:
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
# Port SSH (per defecte 22, però pots canviar-lo per augmentar la seguretat)
Port 22
# Temps màxim per autenticar-se (2 minuts)
LoginGraceTime 120
# Nombre màxim d'intents d'autenticació
MaxAuthTries 3
# Nombre màxim de sessions SSH simultànies
MaxSessions 10
Després de fer aquests canvis, és molt important validar la configuració abans de reiniciar el servei, ja que un error en aquest fitxer podria deixar-te sense accés SSH al servidor:
# Validar la configuració sense reiniciar el servei
# Aquesta comanda comprova la sintaxi i mostra errors si n'hi ha
sudo sshd -t
# Si no hi ha cap error, no mostrarà res (silenci = èxit)
# Si hi ha errors, els mostrarà i caldrà corregir-los
# Un cop validat, podem reiniciar el servei
# En Ubuntu/Debian:
sudo systemctl restart ssh
# En Rocky Linux/RHEL:
sudo systemctl restart sshd
# Verificar que el servei s'ha reiniciat correctament
# En Ubuntu/Debian:
sudo systemctl status ssh
# En Rocky Linux/RHEL:
sudo systemctl status sshd
Important
Un aspecte molt important és que aquesta configuració aplica a totes les connexions SSH, no només a SFTP. Si un usuari pot connectar-se via SSH amb un terminal, també pot utilitzar SFTP automàticament. Més endavant veurem com restringir usuaris només a SFTP sense accés a un shell.
1.4 Creant usuaris SFTP
Ara que tenim el servidor configurat, crearem usuaris que podran utilitzar SFTP. Hi ha diferents maneres de fer-ho depenent dels teus requisits de seguretat.
Opció 1: Usuari del sistema amb accés complet
Aquesta és l'opció més senzilla. Crearem un usuari normal del sistema que podrà utilitzar tant SSH com SFTP:
# Crear un nou usuari anomenat 'usuarisftp1'
# -m crea el directori home automàticament
# -s especifica el shell que tindrà l'usuari
sudo useradd -m -s /bin/bash usuarisftp1
# Establir una contrasenya per a l'usuari
sudo passwd usuarisftp1
# El sistema et demanarà que introdueixis la contrasenya dues vegades
# Verificar que l'usuari s'ha creat correctament
id usuarisftp1
# Hauries de veure quelcom com:
# uid=1001(usuarisftp1) gid=1001(usuarisftp1) groups=1001(usuarisftp1)
# El directori home de l'usuari serà /home/usuarisftp1
# Podem verificar-ho:
ls -ld /home/usuarisftp1
Aquest usuari ja pot connectar-se via SFTP immediatament. Provem-ho des del propi servidor o des d'un altre sistema:
# Connectar-se localment (des del mateix servidor)
sftp usuarisftp1@localhost
# O des d'un altre sistema (substitueix IP_SERVIDOR per la IP real)
sftp usuarisftp1@IP_SERVIDOR
# Un cop connectat, pots utilitzar comandes SFTP:
sftp> pwd # Mostra el directori actual (serà /home/usuarisftp1)
sftp> ls # Llista els arxius del directori
sftp> mkdir proves # Crear un directori
sftp> cd proves # Canviar de directori
sftp> put arxiu.txt # Pujar un arxiu
sftp> get arxiu.txt # Descarregar un arxiu
sftp> bye # Sortir
Opció 2: Usuari restringit només a SFTP (sense accés SSH)
En molts casos, voldrem que els usuaris puguin transferir arxius via SFTP però no voldrem que tinguin accés a un shell del sistema per raons de seguretat. Això s'aconsegueix mitjançant la funcionalitat de "chroot" (canvi d'arrel) d'OpenSSH.
Primer, crearem l'usuari amb un shell especial que no permet executar comandes:
# Crear un grup per als usuaris SFTP
sudo groupadd sftponly
# Crear un usuari que només pot fer SFTP
# -g assigna el grup principal
# -s /usr/sbin/nologin significa que no pot fer login amb shell
sudo useradd -m -g sftponly -s /usr/sbin/nologin usuarisftp2
# Establir contrasenya
sudo passwd usuarisftp2
Ara configurarem el chroot al fitxer /etc/ssh/sshd_config. Afegirem això al final del fitxer:
# Editar el fitxer de configuració
sudo nano /etc/ssh/sshd_config
# Afegir al final del fitxer:
# Configuració de chroot per a usuaris SFTP
# Això farà que els usuaris del grup 'sftponly' quedin
# confinats al seu directori home i només puguin fer SFTP
Match Group sftponly
# Forçar que només puguin utilitzar SFTP (no SSH)
ForceCommand internal-sftp
# Canviar l'arrel al directori home de l'usuari
ChrootDirectory /home/%u
# Desactivar forwarding de ports i X11 per seguretat
AllowTcpForwarding no
X11Forwarding no
# Limitar a només autenticació per contrasenya o clau
PasswordAuthentication yes
PubkeyAuthentication yes
Requisits
Hi ha un requisit molt important per a que el chroot funcioni correctament: el directori que especifiquem com a ChrootDirectory (en aquest cas /home/usuarisftp2) ha de complir aquests requisits de seguretat:
- Ha de ser propietat de root
- Ha de tenir permisos 755 (rwxr-xr-x)
- Cap element del path fins arribar a aquest directori pot ser escribible per l'usuari
Això significa que l'usuari no podrà escriure directament al seu home. Hem de crear un subdirectori dins del home on sí que pugui escriure:
# El directori home ha de ser de root amb permisos específics
sudo chown root:root /home/usuarisftp2
sudo chmod 755 /home/usuarisftp2
# Crear un subdirectori on l'usuari sí que podrà escriure
sudo mkdir /home/usuarisftp2/uploads
sudo chown usuarisftp2:sftponly /home/usuarisftp2/uploads
sudo chmod 755 /home/usuarisftp2/uploads
# Podem crear més subdirectoris si volem diferents carpetes
sudo mkdir /home/usuarisftp2/downloads
sudo chown usuarisftp2:sftponly /home/usuarisftp2/downloads
sudo chmod 755 /home/usuarisftp2/downloads
Després de fer aquests canvis, validem i reiniciem el servei:
# Validar la configuració
sudo sshd -t
# Si no hi ha errors, reiniciar
sudo systemctl restart ssh # Ubuntu/Debian
# o
sudo systemctl restart sshd # Rocky Linux/RHEL
Ara podem provar la connexió:
# Aquest usuari només podrà fer SFTP
sftp usuarisftp2@localhost
# Un cop dins, estarà a /home/usuarisftp2 (que veurà com /)
sftp> pwd
# Mostrarà: /
sftp> ls
# Veurà: downloads uploads
sftp> cd uploads
sftp> put arxiu.txt
# Funcionarà correctament
# Si intentem connectar amb SSH normal (des d'un altre terminal):
ssh usuarisftp2@localhost
# Rebrà un missatge d'error indicant que només pot fer SFTP
Aquesta configuració és ideal per a escenaris on vols proporcionar un servei de transferència d'arxius però vols minimitzar els riscos de seguretat mantenint els usuaris confinats i sense accés al shell del sistema.
1.5 Autenticació per clau pública (recomanat per a administradors)
L'autenticació per clau pública és molt més segura que l'autenticació per contrasenya i és especialment recomanable per a administradors de sistemes i scripts automatitzats. Vegem com configurar-la pas a pas.
Primer, generarem un parell de claus al sistema client (l'ordinador des d'on et connectaràs):
# Generar un parell de claus Ed25519 (l'algorisme més modern i segur el 2024)
# Ed25519 és més ràpid i segur que RSA, i genera claus més petites
ssh-keygen -t ed25519 -C "usuarisftp1@exemple.cat"
# Alternativament, si necessites compatibilitat amb sistemes molt antics,
# pots utilitzar RSA amb 4096 bits:
# ssh-keygen -t rsa -b 4096 -C "usuarisftp1@exemple.cat"
# El sistema et farà aquestes preguntes:
# Enter file in which to save the key (/home/teu_usuari/.ssh/id_ed25519):
# [Prem Enter per acceptar la ubicació per defecte]
# Enter passphrase (empty for no passphrase):
# [Introdueix una passphrase forta o deixa-ho buit si és per scripts]
# Nota: una passphrase afegeix una capa extra de seguretat - la clau privada
# estarà xifrada i caldrà la passphrase per usar-la
# Enter same passphrase again:
# [Repeteix la passphrase]
# Això crearà dos fitxers:
# ~/.ssh/id_ed25519 (clau privada - MAI compartir això)
# ~/.ssh/id_ed25519.pub (clau pública - això és el que copiem al servidor)
Ara hem de copiar la clau pública al servidor. Hi ha diverses maneres de fer-ho:
Mètode 1: Utilitzant ssh-copy-id (el més senzill)
# Aquesta comanda copia automàticament la clau pública al servidor
# i la col·loca al lloc correcte amb els permisos adequats
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuarisftp1@IP_SERVIDOR
# Et demanarà la contrasenya de l'usuari una última vegada
# Després d'això, podràs connectar sense contrasenya
Mètode 2: Còpia manual (útil per entendre el procés)
# Des del client, veure el contingut de la clau pública
cat ~/.ssh/id_ed25519.pub
# Veuràs quelcom com:
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILo... usuarisftp1@exemple.cat
# Copia aquesta línia sencera al portapapers
# Connecta't al servidor amb contrasenya
ssh usuarisftp1@IP_SERVIDOR
# Un cop al servidor, crear el directori .ssh si no existeix
mkdir -p ~/.ssh
# Establir els permisos correctes (molt important!)
chmod 700 ~/.ssh
# Afegir la clau pública al fitxer authorized_keys
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILo... usuarisftp1@exemple.cat" >> ~/.ssh/authorized_keys
# Establir els permisos correctes per al fitxer
chmod 600 ~/.ssh/authorized_keys
# Sortir del servidor
exit
Ara podem provar la connexió amb clau:
# Des del client, connectar sense contrasenya
ssh usuarisftp1@IP_SERVIDOR
# O amb SFTP:
sftp usuarisftp1@IP_SERVIDOR
# Si vas posar una passphrase a la clau, te la demanarà
# Sinó, connectaràs directament sense demanar res
Els permisos són crítics per a la seguretat de SSH. Si els permisos no són correctes, SSH refusarà utilitzar les claus per motius de seguretat. Aquests són els permisos correctes:
# Directori .ssh
drwx------ (700) usuari:usuari /home/usuari/.ssh
# Clau privada (al client)
-rw------- (600) usuari:usuari /home/usuari/.ssh/id_ed25519
# Clau pública (al client)
-rw-r--r-- (644) usuari:usuari /home/usuari/.ssh/id_ed25519.pub
# Claus autoritzades (al servidor)
-rw------- (600) usuari:usuari /home/usuari/.ssh/authorized_keys
Desactivar l'autenticació per contrasenya (només després de verificar que les claus funcionen)
Un cop has verificat que pots connectar amb la clau pública, pots desactivar l'autenticació per contrasenya per augmentar la seguretat:
# Al servidor, editar /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
# Canviar o afegir aquesta línia:
PasswordAuthentication no
# També pots voler desactivar altres mètodes d'autenticació menys segurs:
ChallengeResponseAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
# Validar i reiniciar
sudo sshd -t
sudo systemctl restart ssh # o sshd en sistemes RHEL
Aquesta configuració garanteix que només es pot accedir al servidor amb claus públiques autoritzades, eliminant completament el risc de forcós brut de contrasenyes.
2. Servidors FTP i FTPS Tradicionals en Linux
2.1 Introducció als servidors FTP en Linux: vsftpd
Ara que hem cobert SFTP, que és la solució moderna recomanada, és important que entenguis també com funcionen els servidors FTP tradicionals i FTPS. Aquests coneixements són valuosos per diverses raons: primer, perquè encara trobarem molts servidors FTP antics en producció que necessitaran manteniment; segon, perquè alguns sistemes legacy o aplicacions antigues poden requerir específicament FTP o FTPS; i tercer, perquè entendre les limitacions i problemes d'FTP ens ajuda a apreciar per què les alternatives modernes són tan superiors.
El servidor FTP més popular i recomanable en sistemes Linux és vsftpd, que significa "Very Secure FTP Daemon". El nom pot semblar irònic tenint en compte que estem parlant d'un protocol inherentment insegur, però vsftpd ha estat dissenyat amb la seguretat com a prioritat dins de les limitacions del protocol FTP. Va ser creat per Chris Evans el 2001 amb un enfocament especial en la seguretat del codi, i ha demostrat ser molt resistent a vulnerabilitats al llarg dels anys.
vsftpd és especialment popular per diverses raons tècniques que el fan atractiu per a administradors de sistemes. És extremadament eficient amb els recursos del sistema, pot gestionar milers de connexions simultànies sense problemes, i té un historial de seguretat excel·lent comparat amb altres servidors FTP. A més, la seva configuració és relativament senzilla però alhora molt flexible i potent.
2.2 Instal·lació de vsftpd
Començarem instal·lant vsftpd a les distribucions Linux més populars. La versió actual estable de vsftpd és la 3.0.5, que va ser llançada el febrer de 2022. Encara que pot semblar una versió antiga, vsftpd és un programari molt madur que no necessita actualitzacions freqüents, i aquesta versió incorpora totes les correccions de seguretat necessàries.
En sistemes Ubuntu o Debian moderns, la instal·lació és molt directa:
# Actualitzar la llista de paquets disponibles
sudo apt update
# Instal·lar vsftpd
sudo apt install vsftpd
# Verificar la versió instal·lada
vsftpd -v
# Hauries de veure quelcom com:
# vsftpd: version 3.0.5
# El servei s'inicia automàticament després de la instal·lació
# Podem verificar el seu estat:
sudo systemctl status vsftpd
# Assegurar-nos que s'inicia automàticament en arrencar:
sudo systemctl enable vsftpd
Per a sistemes basats en Red Hat com Rocky Linux, AlmaLinux o CentOS Stream, el procés és similar però utilitza dnf:
# Instal·lar vsftpd amb dnf
sudo dnf install vsftpd
# Verificar la versió
vsftpd -v
# En sistemes RHEL, el firewall (firewalld) està actiu per defecte
# Hem d'obrir els ports necessaris per a FTP:
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --reload
# Iniciar i habilitar el servei
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
# Verificar que està funcionant
sudo systemctl status vsftpd
Un aspecte important que has de comprendre és que després de la instal·lació, vsftpd ja està funcionant amb una configuració per defecte. Aquesta configuració per defecte és bastant restrictiva per raons de seguretat, però no és adequada per a la majoria d'usos reals. Abans de començar a utilitzar-lo, haurem de personalitzar la configuració segons les nostres necessitats.
2.3 Estructura de fitxers de vsftpd
Abans d'entrar en la configuració, és útil entendre on es troben els fitxers importants de vsftpd i què fa cadascun d'ells:
El fitxer de configuració principal és /etc/vsftpd.conf (o /etc/vsftpd/vsftpd.conf en algunes distribucions RHEL). Aquest és el fitxer més important que modificarem per controlar el comportament del servidor FTP. És un fitxer de text pla amb una sintaxi molt senzilla: cada línia conté una directiva en el format nom_opcio=valor. Les línies que comencen amb el símbol coixinet (#) són comentaris i són ignorades.
Els fitxers de registre (logs) per defecte es guarden a /var/log/vsftpd.log. Aquests logs són crucials per diagnosticar problemes, monitoritzar l'activitat i detectar intents d'accés no autoritzats. És una bona pràctica revisar regularment aquests logs.
Si configures usuaris virtuals (que veurem més endavant), la base de dades d'usuaris normalment es troba a /etc/pam.d/vsftpd per a la configuració de PAM (Pluggable Authentication Modules), i les credencials poden estar a /etc/vsftpd/virtual_users.db.
El directori arrel per a usuaris anònims (si els actives) és /srv/ftp o /var/ftp/pub depenent de la distribució.
2.4 Configuració bàsica de vsftpd: FTP simple sense xifrar
Començarem amb una configuració bàsica de FTP que permeti als usuaris del sistema connectar-se i transferir arxius. És important remarcar que aquesta configuració no és segura perquè transmet les contrasenyes en text pla, i només hauria d'utilitzar-se en xarxes internes de confiança o per a propòsits educatius per entendre com funciona FTP. Més endavant afegirem TLS per convertir-lo en FTPS.
Primer, farem una còpia de seguretat del fitxer de configuració original, una pràctica que sempre hauries de seguir:
# Crear còpia de seguretat amb la data actual
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup.$(date +%Y%m%d)
# Ara editarem el fitxer
sudo nano /etc/vsftpd.conf
Aquí tens una configuració bàsica ben comentada que explica què fa cada opció. Pots copiar aquesta configuració sencera, esborrant el contingut anterior del fitxer:
# ============================================================================
# Configuració bàsica de vsftpd (sense xifrar - només per entorns de confiança)
# Versió per a vsftpd 3.0.5
# ============================================================================
# CONNEXIONS I ESCOLTA
# --------------------
# Posar vsftpd en mode "standalone" (funcionament independent)
# En lloc de ser gestionat per xinetd/inetd, vsftpd funcionarà com a dimoni
listen=YES
# No escoltar en IPv6 (desactiva-ho si necessites IPv6)
# Si poses listen_ipv6=YES, has de posar listen=NO
listen_ipv6=NO
# Port on escoltarà vsftpd (21 és l'estàndard per a FTP)
listen_port=21
# ACCÉS D'USUARIS LOCALS
# ----------------------
# Permetre que usuaris del sistema (usuaris locals) puguin connectar-se
local_enable=YES
# Permetre que els usuaris locals puguin pujar arxius (escriure)
write_enable=YES
# Quan un usuari local es connecta, queda "empresonat" (chroot) al seu home
# Això significa que no pot navegar per directoris fora del seu home
# És una mesura de seguretat important
chroot_local_user=YES
# Aquesta opció és necessària des de vsftpd 2.3.5 per permetre
# escriptura dins d'un directori chroot
# Sense això, els usuaris no podrien pujar arxius
allow_writeable_chroot=YES
# ACCÉS ANÒNIM
# ------------
# Desactivar l'accés anònim (usuaris sense autenticació)
# En un servidor de producció, gairebé mai voldràs això activat
anonymous_enable=NO
# PERMISOS I MÀSCARES
# -------------------
# Màscara per arxius creats per usuaris locals (per defecte 022)
# Amb 022, els arxius es creen amb permisos 644 (rw-r--r--)
local_umask=022
# Màscara per arxius pujats per usuaris anònims (si estigués activat)
# 077 significa que només el propietari pot llegir (més restrictiu)
anon_umask=077
# MISSATGES I BANNERS
# -------------------
# Mostrar missatges de benvinguda si hi ha un fitxer .message al directori
dirmessage_enable=YES
# Banner que es mostra quan algú es connecta
# No posis informació sensible aquí (versió del sistema, etc.)
ftpd_banner=Benvingut al servidor FTP del centre educatiu
# LOGGING (REGISTRES)
# -------------------
# Activar el registre de pujades/baixades
xferlog_enable=YES
# Utilitzar el format estàndard de log de vsftpd
xferlog_std_format=YES
# Ubicació del fitxer de log
xferlog_file=/var/log/vsftpd.log
# També registrar connexions i errors en el log del sistema
syslog_enable=YES
# MODE PASSIU
# -----------
# Rang de ports per a mode passiu (cal obrir-los al firewall)
# El mode passiu és essencial per funcionar darrere de NAT/firewalls
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
# Si el servidor està darrere d'un NAT, especifica l'IP pública aquí
# Descomenta i modifica si cal:
# pasv_address=LA_TEVA_IP_PUBLICA
# TIMEOUTS I LÍMITS
# -----------------
# Temps màxim que un client pot estar inactiu abans de ser desconnectat
idle_session_timeout=600
# Temps màxim que pot durar una transferència de dades parada
data_connection_timeout=120
# Nombre màxim de clients connectats simultàniament
max_clients=50
# Nombre màxim de connexions per IP (prevé abusos)
max_per_ip=3
# SEGURETAT ADDICIONAL
# --------------------
# No permetre que els usuaris de la llista userlist es connectin
# Això és útil per bloquejar comptes de sistema (root, etc.)
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.userlist
# Ocultar IDs d'usuari i grup en els llistats (mostra "ftp" per a tots)
# Això prevé que atacants obtinguin informació sobre els usuaris del sistema
hide_ids=YES
# No mostrar fitxers que comencin amb punt (fitxers ocults)
hide_file={.*}
# OPCIONS DE RENDIMENT
# --------------------
# Utilitzar el sendfile del kernel per a millor rendiment
use_sendfile=YES
# Habilitar local_umask, però aquesta ja està configurada més amunt
# (aquesta línia és redundant però a vegades es veu en configuracions)
Després d'editar el fitxer de configuració, sempre hem de fer dues coses: primer, verificar que no hi ha errors de sintaxi; i segon, crear els fitxers i directoris necessaris que hem referenciat a la configuració.
# No hi ha una eina específica de validació per a vsftpd.conf
# però podem comprovar que el servei arrenca correctament
# Si hi ha errors de configuració, el servei fallarà en arrencar
# Crear el fitxer userlist per bloquejar usuaris de sistema
# Aquí posarem usuaris que NUNCA haurien de poder fer FTP
sudo nano /etc/vsftpd.userlist
# Afegeix aquests usuaris (un per línia):
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
nobody
Aquest fitxer userlist és una mesura de seguretat important. Els usuaris del sistema com root, bin, daemon, etc., són comptes administratius que mai haurien de poder connectar-se via FTP. Si un atacant aconsegueix la contrasenya de root, l'últim que volem és que pugui accedir al sistema via FTP.
Ara reiniciarem el servei i comprovarem que tot funciona correctament:
# Reiniciar vsftpd per aplicar els canvis
sudo systemctl restart vsftpd
# Verificar que el servei està funcionant correctament
sudo systemctl status vsftpd
# Comprovar que vsftpd està escoltant al port 21
sudo ss -tlnp | grep vsftpd
# Hauries de veure quelcom com:
# LISTEN 0 32 *:21 *:* users:(("vsftpd",pid=12345,fd=3))
# També podem veure el log per detectar possibles errors
sudo tail -f /var/log/vsftpd.log
# Deixa això executant en un terminal mentre proves connexions
AC0375/04/03 — Miniactivitat
RA4 · CA4b, CA4c, CA4d, CA4e
Instal·la vsftpd en una màquina virtual o contenidor Linux amb la configuració bàsica d'aquest apartat (usuari restringit al seu directori amb chroot_local_user, userlist_file amb els comptes administratius exclosos). Connecta-t'hi amb un client FTP i comprova que no pots sortir del directori assignat.
2.5 Configuració del firewall per a FTP
Un aspecte crucial que sovint s'oblida quan s'ensenya FTP és la configuració correcta del firewall. FTP és especialment complicat amb firewalls perquè utilitza múltiples ports i connexions dinàmiques. Vegem com configurar-ho correctament.
En sistemes Ubuntu amb ufw (Uncomplicated Firewall):
# Primer, verificar l'estat de ufw
sudo ufw status
# Si no està activat, pots activar-lo (però vigila de no perdre l'accés SSH!)
# Primer assegura't que SSH està permès:
sudo ufw allow 22/tcp
# Ara permetre FTP (port 21)
sudo ufw allow 21/tcp
# Permetre el rang de ports per a mode passiu que hem configurat
sudo ufw allow 40000:40100/tcp
# Si necessites més control, pots permetre només des de certes IPs:
# sudo ufw allow from 192.168.1.0/24 to any port 21 proto tcp
# Activar o recarregar ufw
sudo ufw enable
# o
sudo ufw reload
# Verificar les regles
sudo ufw status numbered
En sistemes Rocky Linux o RHEL amb firewalld:
# firewalld té predefinits "serveis" que inclouen múltiples ports
# El servei 'ftp' inclou el port 21
sudo firewall-cmd --permanent --add-service=ftp
# Per al mode passiu, hem d'afegir el rang de ports manualment
sudo firewall-cmd --permanent --add-port=40000-40100/tcp
# Si vols limitar l'accés a una xarxa específica:
# sudo firewall-cmd --permanent --zone=internal --add-source=192.168.1.0/24
# sudo firewall-cmd --permanent --zone=internal --add-service=ftp
# Aplicar els canvis
sudo firewall-cmd --reload
# Verificar les regles actives
sudo firewall-cmd --list-all
Hi ha un problema addicional amb FTP i els firewalls amb seguiment de connexió (connection tracking). El kernel de Linux té un mòdul anomenat nf_conntrack_ftp que ajuda el firewall a entendre i seguir les connexions FTP dinàmiques. Aquest mòdul hauria d'estar carregat automàticament, però podem verificar-ho:
# Comprovar si el mòdul està carregat
lsmod | grep nf_conntrack_ftp
# Si no està carregat, podem carregar-lo manualment:
sudo modprobe nf_conntrack_ftp
# Per fer-ho permanent, afegir a /etc/modules
echo "nf_conntrack_ftp" | sudo tee -a /etc/modules
2.6 Proves de connexió FTP bàsica
Ara que tenim el servidor configurat i el firewall obert, és hora de provar que tot funciona correctament. Utilitzarem diversos mètodes per connectar-nos i transferir arxius.
Primer, necessitem un usuari per fer les proves. Utilitzarem un usuari del sistema que ja existeixi o en crearem un de nou:
# Crear un usuari de prova
sudo useradd -m -s /bin/bash usuariftp
# Establir una contrasenya
sudo passwd usuariftp
# Crear un directori per a fitxers de prova dins del seu home
sudo -u usuariftp mkdir /home/usuariftp/fitxers_prova
# Crear un fitxer de prova
sudo -u usuariftp bash -c 'echo "Aquest és un fitxer de prova" > /home/usuariftp/fitxers_prova/prova.txt'
Ara provarem diverses maneres de connectar al servidor FTP:
Mètode 1: Client FTP de línia de comandes
El client FTP més bàsic ve instal·lat a la majoria de sistemes Linux:
# Connectar al servidor (substitueix localhost per la IP si és un altre servidor)
ftp localhost
# El sistema et demanarà el nom d'usuari i la contrasenya
# Name (localhost:actual_user): usuariftp
# Password: [introdueix la contrasenya]
# Un cop connectat, veuràs el prompt ftp>
# Ara pots utilitzar comandes FTP:
ftp> pwd
# Mostra: 257 "/" is the current directory
# (Recorda que estem en chroot, així que / és realment /home/usuariftp)
ftp> ls
# Llista els arxius i directoris
# Veuràs:
# 227 Entering Passive Mode (127,0,0,1,156,192).
# 150 Here comes the directory listing.
# drwxr-xr-x 2 1001 1001 4096 Nov 25 10:30 fitxers_prova
# 226 Directory send OK.
ftp> cd fitxers_prova
# 250 Directory successfully changed.
ftp> ls
# 227 Entering Passive Mode (127,0,0,1,156,193).
# 150 Here comes the directory listing.
# -rw-r--r-- 1 1001 1001 30 Nov 25 10:30 prova.txt
# 226 Directory send OK.
ftp> get prova.txt
# Descarrega el fitxer al directori actual del teu sistema local
# 227 Entering Passive Mode (127,0,0,1,156,194).
# 150 Opening BINARY mode data connection for prova.txt (30 bytes).
# 226 Transfer complete.
# Crear un fitxer localment per pujar-lo
ftp> !echo "Fitxer pujat des del client" > fitxer_local.txt
# El signe d'exclamació (!) executa comandes al sistema local
ftp> put fitxer_local.txt
# Puja el fitxer al servidor
# 227 Entering Passive Mode (127,0,0,1,156,195).
# 150 Ok to send data.
# 226 Transfer complete.
ftp> ls
# Verifica que el fitxer s'ha pujat correctament
ftp> bye
# Sortir del client FTP
# 221 Goodbye.
Mètode 2: Client lftp (més modern i potent)
lftp és un client FTP molt més avançat que ofereix més funcionalitats. Si no el tens instal·lat:
# Instal·lar lftp
sudo apt install lftp # Ubuntu/Debian
# o
sudo dnf install lftp # Rocky Linux/RHEL
# Connectar amb lftp
lftp -u usuariftp localhost
# lftp té autocompletat amb Tab i moltes més funcionalitats
lftp usuariftp@localhost:~> ls
# Mostra un llistat més llegible amb colors
lftp usuariftp@localhost:~> mirror fitxers_prova
# Descarrega recursivament tot el directori mantenint l'estructura
lftp usuariftp@localhost:~> mirror -R directori_local directori_remot
# Puja un directori complet al servidor
lftp usuariftp@localhost:~> exit
Mètode 3: Client gràfic FileZilla
FileZilla és el client FTP més popular i està disponible per a Linux, Windows i macOS. L'última versió estable el 2024 és FileZilla 3.66.5 (llançada el novembre de 2024).
# Instal·lar FileZilla a Ubuntu/Debian
sudo apt install filezilla
# O descarregar des del web oficial:
# https://filezilla-project.org/
Per connectar amb FileZilla, s'ha d'introduir:
- Servidor: L'adreça IP o nom del servidor
- Nom d'usuari: usuariftp
- Contrasenya: la contrasenya que han establert
- Port: 21
FileZilla és especialment útil per demostrar visualment com funcionen les dues connexions de FTP (control i dades) i com el mode passiu resol els problemes amb firewalls.
2.7 Capturant tràfic FTP amb Wireshark per demostrar la inseguretat
Una de les millors maneres d'explicar per què FTP sense xifrar és insegur és veure directament com qualsevol persona pot interceptar les contrasenyes. Wireshark és l'eina perfecta per aquesta demostració.
# Instal·lar Wireshark
sudo apt install wireshark
# Durant la instal·lació, et preguntarà si vols que usuaris no-root
# puguin capturar paquets. Respon que sí.
# Afegir el teu usuari al grup wireshark
sudo usermod -aG wireshark $USER
# Tancar la sessió i tornar a iniciar-la perquè els canvis tinguin efecte
Per fer la demostració:
-
Obre Wireshark i comença a capturar paquets a la interfície de xarxa (per exemple, eth0 o lo per a localhost).
-
Aplica un filtre per veure només tràfic FTP: escriu
ftpa la barra de filtres. -
En un altre terminal, connecta't al servidor FTP amb el client de línia de comandes i introdueix el teu usuari i contrasenya.
-
A Wireshark, veuràs els paquets de la connexió FTP. Busca els paquets que diuen "Request: USER usuariftp" i "Request: PASS lacontrasenya". Si fas clic dret sobre aquests paquets i selecciones "Follow > TCP Stream", veuràs tota la conversa entre client i servidor en text pla completament llegible.
Amb aquesta demostració visual que dona Wireshark es pot entendre immediatament per què necessitem xifrat.
3. Afegint Seguretat a FTP: Configuració de FTPS amb TLS/SSL
3.1. Preparant vsftpd per a TLS: Conceptes previs
Ara que has vist com funciona FTP bàsic i has pogut comprovar amb Wireshark com de vulnerable és enviar credencials i dades en text pla, és el moment d'afegir la capa de seguretat que converteix FTP en FTPS.
Abans de començar amb la configuració tècnica, vull que entenguis bé què farem exactament. Anem a configurar vsftpd perquè utilitzi TLS (Transport Layer Security) per xifrar les comunicacions. Això significa que necessitarem un certificat digital que el servidor presentarà als clients per demostrar la seva identitat i per establir les claus de xifrat.
En entorns de producció reals, aquest certificat hauria de ser emès per una autoritat certificadora (CA) reconeguda com Let's Encrypt, DigiCert, o Sectigo. Aquests certificats són validats pels navegadors i clients FTP automàticament perquè les autoritats certificadores ja són de confiança al sistema. Però per a propòsits educatius i per a entorns de desenvolupament o xarxes internes, crearem un certificat autosignat, que és perfectament vàlid criptogràficament però que els clients mostraran com a "no confiat" perquè no està signat per una CA reconeguda.
És important que veieu les diferències i similituds: un certificat autosignat ofereix exactament el mateix nivell de xifrat que un certificat d'una CA comercial, la diferència està en la cadena de confiança i la verificació d'identitat. El xifrat és igualment fort en tots dos casos.
3.2. Creant un certificat autosignat per a vsftpd
Utilitzarem OpenSSL per crear el nostre certificat autosignat. OpenSSL és l'eina estàndard per a criptografia en sistemes Unix i Linux, i ve preinstal·lada a pràcticament totes les distribucions modernes. Crearem un certificat que combina la clau privada i el certificat públic en un sol fitxer, que és el format que vsftpd espera.
Abans de generar el certificat, assegurem-nos que tenim OpenSSL instal·lat i comprovem la versió:
# Verificar la versió d'OpenSSL instal·lada
openssl version
# En Ubuntu 24.04 veuràs: OpenSSL 3.0.13 30 Jan 2024
# En Rocky Linux 9 veuràs: OpenSSL 3.0.7 1 Nov 2022
# Aquestes versions són completament actualitzades i segures
# OpenSSL 3.0.x és la branca actual de suport a llarg termini (LTS)
Ara crearem el certificat. La comanda que utilitzarem és força llarga i té molts paràmetres, així que l'explicaré detalladament:
# Crear el directori per als certificats si no existeix
sudo mkdir -p /etc/ssl/private
# Generar el certificat autosignat
# Aquesta comanda genera la clau privada i el certificat en un sol pas
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:4096 \
-keyout /etc/ssl/private/vsftpd.pem \
-out /etc/ssl/private/vsftpd.pem
Desglossem aquesta comanda perquè entenguis cada part:
req li diu a OpenSSL que volem treballar amb sol·licituds de certificats i certificats. En aquest cas, generarem directament un certificat en lloc de crear primer una sol·licitud.
-x509 indica que volem crear un certificat autosignat en lloc d'una sol·licitud de signatura de certificat (CSR). Un certificat X.509 és l'estàndard per a certificats digitals a Internet.
-nodes significa "no DES" (no Data Encryption Standard), i el que fa és que la clau privada no estarà protegida amb una contrasenya. Això és necessari perquè vsftpd pugui arrencar automàticament sense que algú hagi d'introduir una contrasenya. En un entorn on la seguretat física del servidor és crítica, podries voler protegir la clau amb contrasenya, però això complicaria l'administració.
-days 3650 estableix la validesa del certificat a deu anys. Per a entorns de producció amb certificats d'una CA, normalment tindràs certificats amb validesa d'un any o menys per raons de seguretat. Però per a un certificat autosignat en un entorn educatiu, deu anys és pràctic perquè no hauràs de renovar-lo constantment.
-newkey rsa:4096 crea una nova clau privada RSA de quatre mil noranta-sis bits. El 2024, quatre mil noranta-sis bits és la mida recomanada per RSA. Tot i que dues mil quaranta-vuit bits encara es considera segur, quatre mil noranta-sis bits ofereix un marge de seguretat molt més gran i és el que recomanen els estàndards moderns de seguretat.
-keyout i -out especifiquen on guardar la clau privada i el certificat. En aquest cas, estem posant-los al mateix fitxer, que és un format que vsftpd accepta sense problemes. Aquest fitxer conté primer la clau privada i després el certificat públic.
Quan executis aquesta comanda, OpenSSL te farà una sèrie de preguntes per emplenar els camps del certificat. Aquests camps formen el que s'anomena Distinguished Name (DN) del certificat:
# El sistema et farà aquestes preguntes:
Country Name (2 letter code) [AU]: ES
# Introdueix el codi de país de dues lletres (Espanya és ES)
State or Province Name (full name) [Some-State]: Catalunya
# El nom complet de la província o comunitat autònoma
Locality Name (eg, city) []: Blanes
# La ciutat on es troba el servidor
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Centre Educatiu XYZ
# El nom de la teva organització o centre educatiu
Organizational Unit Name (eg, section) []: Departament d'Informàtica
# La unitat o departament (opcional)
Common Name (e.g. server FQDN or YOUR name) []: ftp.centre-xyz.cat
# MOLT IMPORTANT: Aquí has de posar el nom de domini complet (FQDN) del servidor
# o la seva adreça IP si no té nom de domini. Aquest camp és crític perquè
# els clients verificaran que el nom al que es connecten coincideix amb aquest camp
Email Address []: admin@centre-xyz.cat
# Una adreça de correu de contacte (opcional)
El camp més important aquí és el Common Name. Aquest és el nom que els clients FTP compararan amb el nom del servidor al que s'estan connectant. Si poses aquí el nom de domini del teu servidor, per exemple ftp.exemple.cat, els clients esperaran connectar-se exactament a aquest nom. Si intenten connectar-se utilitzant la IP o un altre nom, veuran un avís de seguretat. Per a un entorn educatiu on potser utilitzareu adreces IP directament, pots posar aquí la IP del servidor.
Després que OpenSSL hagi generat el certificat, establirem els permisos correctes per protegir la clau privada:
# Establir permisos restrictius al fitxer
# Només root ha de poder llegir aquest fitxer perquè conté la clau privada
sudo chmod 600 /etc/ssl/private/vsftpd.pem
# Verificar que el fitxer s'ha creat correctament
sudo ls -lh /etc/ssl/private/vsftpd.pem
# Hauries de veure quelcom com:
# -rw------- 1 root root 7.2K Nov 25 11:30 /etc/ssl/private/vsftpd.pem
# Podem examinar el contingut del certificat per verificar que és correcte
sudo openssl x509 -in /etc/ssl/private/vsftpd.pem -noout -text
Aquesta última comanda mostrarà tots els detalls del certificat: la versió, el número de sèrie, l'algorisme de signatura, l'emissor (que en un certificat autosignat és el mateix que el subjecte), les dates de validesa, i la clau pública.
3.3. Configurant vsftpd per utilitzar TLS (FTPS explícit)
Ara que tenim el nostre certificat, és hora de configurar vsftpd per utilitzar-lo. Editarem el fitxer de configuració per afegir les directives relacionades amb TLS. Continuarem utilitzant el mode explícit de FTPS, que és el més compatible i recomanable.
# Editar el fitxer de configuració de vsftpd
sudo nano /etc/vsftpd.conf
# Afegir aquestes línies al final del fitxer
# o modificar-les si ja existeixen
Afegeix o modifica aquestes directives al fitxer de configuració. He organitzat les opcions en seccions lògiques amb comentaris detallats perquè entenguis què fa cadascuna:
# ============================================================================
# CONFIGURACIÓ TLS/SSL PER A FTPS
# ============================================================================
# ACTIVACIÓ DE TLS
# ----------------
# Habilitar SSL/TLS per a connexions de control i dades
ssl_enable=YES
# UBICACIÓ DELS CERTIFICATS
# -------------------------
# Ruta al fitxer que conté tant la clau privada com el certificat
# Aquest és el fitxer que acabem de crear amb OpenSSL
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
# Nota: En versions més antigues de vsftpd, aquestes directives es deien
# ssl_cert_file i ssl_private_key_file. Les noves versions accepten ambdues.
# REQUERIMENTS DE XIFRAT
# ----------------------
# NO permetre connexions anònimes sense SSL
# Això garanteix que fins i tot si anonymous_enable=YES, hauran d'usar SSL
allow_anon_ssl=NO
# FORÇAR SSL per a usuaris locals (recomanat)
# Si poses això a YES, els clients que no suportin TLS no podran connectar
# Per a propòsits educatius, pots deixar-ho en NO inicialment per demostrar
# la diferència entre connexions xifrades i no xifrades
force_local_data_ssl=YES
force_local_logins_ssl=YES
# Aquestes dues directives anteriors són crítiques per a la seguretat.
# force_local_logins_ssl=YES significa que les credencials (usuari/contrasenya)
# han de viatjar xifrades. force_local_data_ssl=YES significa que la
# transferència d'arxius també ha d'estar xifrada.
# VERSIONS DE PROTOCOLS SSL/TLS
# ------------------------------
# Aquesta és una de les configuracions més importants per a la seguretat.
# Desactivarem protocols antics i insegurs i només permetrem TLS modern.
# Desactivar SSLv2 i SSLv3 (completament obsolets i vulnerables)
ssl_sslv2=NO
ssl_sslv3=NO
# Activar TLS 1.0, 1.1, 1.2 i 1.3
# Tot i que TLS 1.0 i 1.1 estan obsolets, alguns clients antics encara
# només suporten aquestes versions. Per a màxima seguretat, desactiva-les.
ssl_tlsv1=NO # TLS 1.0 - obsolet, NO recomanat el 2024
ssl_tlsv1_1=NO # TLS 1.1 - obsolet, NO recomanat el 2024
ssl_tlsv1_2=YES # TLS 1.2 - encara considerat segur
ssl_tlsv1_3=YES # TLS 1.3 - la versió més moderna i segura
# Nota: vsftpd 3.0.3 i posteriors suporten TLS 1.3 si OpenSSL 1.1.1 o
# posterior està instal·lat. Pots verificar-ho amb: openssl version
# CIPHERS (ALGORISMES DE XIFRATGE)
# --------------------------------
# Especificar quins algorismes de xifratge permetre
# Aquesta és una llista conservadora però segura per al 2024
ssl_ciphers=HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4
# Desglossem aquesta configuració:
# HIGH: Només ciphers considerats "alts" en seguretat (generalment 128 bits o més)
# !aNULL: Excloure ciphers sense autenticació
# !eNULL: Excloure ciphers sense xifratge (null ciphers)
# !EXPORT: Excloure ciphers d'exportació (deliberadament febles)
# !DES: Excloure DES (obsolet, només 56 bits)
# !MD5: Excloure ciphers que usen MD5 (vulnerable a col·lisions)
# !PSK: Excloure Pre-Shared Key ciphers (no els necessitem)
# !RC4: Excloure RC4 (té biaixos coneguts)
# VALIDACIÓ DE CERTIFICATS DE CLIENT
# -----------------------------------
# Si vols requerir que els clients també presentin certificats (mutual TLS),
# pots configurar-ho aquí. Per a la majoria d'usos, no és necessari.
require_cert=NO
# Si require_cert=YES, necessitaries especificar un fitxer amb les CA de confiança:
# ca_certs_file=/etc/ssl/certs/ca-bundle.crt
# REUTILITZACIÓ DE SESSIONS SSL
# ------------------------------
# Permetre la reutilització de sessions SSL per millorar el rendiment
# Això evita haver de fer un handshake TLS complet per cada connexió de dades
require_ssl_reuse=NO
# Nota: Alguns clients FTP tenen problemes amb require_ssl_reuse=YES
# FileZilla, per exemple, per defecte no reutilitza sessions SSL.
# Per compatibilitat, és millor deixar-ho en NO.
# OPCIONS ADDICIONALS DE DEPURACIÓ
# ---------------------------------
# Durant la configuració inicial, pot ser útil activar el debug
# Això afegirà més informació als logs sobre les connexions SSL
# debug_ssl=YES
# Un cop tot funcioni correctament, desactiva aquesta opció per no
# omplir els logs innecessàriament
Després d'afegir totes aquestes directives, el teu fitxer /etc/vsftpd.conf haurà de contenir tant la configuració bàsica que vam fer abans com aquestes noves directives de TLS. Guarda el fitxer i sorteix de l'editor.
Ara validarem que la configuració és correcta i reiniciarem el servei:
# vsftpd no té una eina de validació específica, però podem comprovar
# que arrenca correctament després dels canvis
sudo systemctl restart vsftpd
# Verificar que el servei està funcionant
sudo systemctl status vsftpd
# Si hi ha errors, els veurem aquí. Els errors comuns inclouen:
# - Ruta incorrecta al certificat
# - Permisos incorrectes al fitxer del certificat
# - Sintaxi incorrecta a vsftpd.conf
# Revisar els logs per veure si hi ha warnings o errors
sudo tail -50 /var/log/vsftpd.log
# També podem veure els logs del sistema
sudo journalctl -u vsftpd -n 50
Si el servei arrenca correctament sense errors, felicitats! Ara tens un servidor FTPS funcionant amb xifratge TLS. Però encara no hem acabat: hem de provar que funciona correctament.
3.4. Provant la connexió FTPS
3.4.1 Prova amb el client de línia de comandes tradicional
El client FTP tradicional de línia de comandes (ftp) normalment no suporta TLS. Si intentes connectar amb ell, funcionarà però sense xifratge (assumint que no has forçat SSL a la configuració). Per veure realment FTPS en acció, necessitem clients que suportin TLS.
3.4.2 Prova amb lftp
El client lftp té suport excel·lent per a FTPS i és perfecte per fer proves des de la línia de comandes:
# Assegurar-nos que lftp està instal·lat
sudo apt install lftp # Ubuntu/Debian
# o
sudo dnf install lftp # Rocky Linux/RHEL
# Connectar amb FTPS explícit
# L'opció 'set ftp:ssl-force true' força l'ús de TLS
lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no" -u usuariftp localhost
# Desglossem aquesta comanda:
# -e executa comandes abans de mostrar el prompt
# set ftp:ssl-force true: Força l'ús de TLS (fallarà si el servidor no el suporta)
# set ssl:verify-certificate no: No verificar el certificat del servidor
# (necessari perquè estem usant un certificat autosignat)
# -u usuariftp: Especifica l'usuari
# localhost: El servidor al que connectar
Quan executis aquesta comanda, lftp demanarà la contrasenya. Després de connectar, veuràs el prompt de lftp i podràs executar comandes exactament igual que abans, però ara tota la comunicació estarà xifrada:
lftp usuariftp@localhost:~> ls
# Si tot funciona correctament, veuràs el llistat de directoris
# Però ara, si algú estigués capturant el tràfic amb Wireshark,
# només veurien dades xifrades indescriptibles
lftp usuariftp@localhost:~> put fitxer_prova.txt
# Pujar un fitxer amb xifratge TLS
lftp usuariftp@localhost:~> exit
Si veus errors relacionats amb SSL/TLS, revisa: - Que el certificat existeix i té els permisos correctes - Que les directives SSL estan ben escrites a vsftpd.conf - Que el servei vsftpd s'ha reiniciat després dels canvis - Els logs de vsftpd per veure missatges d'error específics
3.4.3 Prova amb FileZilla
FileZilla és excel·lent per demostrar FTPS visualment. Quan connectis amb FileZilla a un servidor FTPS amb un certificat autosignat, veuràs un diàleg de seguretat molt instructiu.
Obre FileZilla i configura la connexió: - Host: La IP o nom del teu servidor - Protocol: Selecciona "FTP - File Transfer Protocol" (FileZilla detectarà automàticament que el servidor suporta FTPS) - Encryption: Selecciona "Require explicit FTP over TLS" - Logon Type: Normal - User: usuariftp - Password: la contrasenya de l'usuari
Quan facis clic a "Connect", FileZilla intentarà establir una connexió TLS. Com que estem utilitzant un certificat autosignat, FileZilla mostrarà un diàleg titulat "Unknown certificate" (Certificat desconegut) amb informació sobre el certificat del servidor.
El diàleg mostrarà:
- L'emissor del certificat (en un certificat autosignat, emissor i subjecte són el mateix)
- El subjecte (el Common Name que vas introduir quan vas crear el certificat)
- Les dates de validesa
- L'empremta digital (fingerprint) del certificat
FileZilla et preguntarà si vols confiar en aquest certificat. Tens tres opcions:
- "OK": Acceptar el certificat només per aquesta sessió
- "Always trust certificate in future sessions": Confiar sempre en aquest certificat i no tornar a preguntar
- "Cancel": Cancel·lar la connexió
Per a propòsits educatius i de desenvolupament, pots seleccionar "Always trust". En un entorn de producció real amb un certificat d'una CA reconeguda, no veuràs aquest diàleg perquè el certificat ja seria de confiança automàticament.
Després d'acceptar el certificat, la connexió s'establirà i podràs navegar pels directoris, pujar i descarregar arxius exactament igual que amb FTP normal, però ara tot estarà xifrat amb TLS.
A la part superior de FileZilla, a la secció "Status", pots veure els detalls de la connexió. Busca línies com aquestes:
Status: Connecting to 192.168.1.100:21...
Status: Connection established, initializing TLS...
Status: Verifying certificate...
Status: TLS connection established, waiting for welcome message...
Response: 220 Microsoft FTP Service
Aquesta seqüència mostra clarament com s'estableix primer la connexió TCP, després s'actualitza a TLS, i finalment comença la comunicació FTP xifrada.
3.5. Comparant FTP i FTPS amb Wireshark
Ara que tens tant FTP com FTPS funcionant, pots fer una demostració paral·lela que mostri visualment la diferència entre tràfic xifrat i no xifrat.
Prepara dues finestres de terminal i Wireshark:
Primer, connecta amb FTP sense TLS (si has deixat force_local_logins_ssl=NO temporalment per aquesta demostració):
# Terminal 1: Connexió FTP sense xifratge
ftp localhost
# Introdueix usuari i contrasenya
# Puja o descarrega algun fitxer
# Surt
A Wireshark, selecciona un paquet FTP, fes clic dret i selecciona "Follow > TCP Stream". Veuràs tot el diàleg entre client i servidor completament llegible, incloent les credencials i les dades dels arxius.
Ara connecta amb FTPS:
# Terminal 2: Connexió FTPS amb TLS
lftp -e "set ftp:ssl-force true; set ssl:verify-certificate no" -u usuariftp localhost
# Introdueix la contrasenya
# Puja o descarrega el mateix fitxer
# Surt
Torna a Wireshark i intenta seguir el stream d'aquesta connexió. Després del handshake TLS inicial (que és visible perquè ha de negociar el xifratge), totes les dades posteriors apareixeran com a bytes aleatoris incomprensibles. No hi ha manera de veure ni les credencials, ni els noms dels fitxers, ni el contingut dels arxius. Tot està perfectament xifrat.
3.6. Certificats de Let's Encrypt per a producció
Fins ara hem treballat amb certificats autosignats, que són perfectes per a aprenentatge i entorns de desenvolupament. Però quan configuris un servidor FTPS real en producció, voldràs utilitzar un certificat d'una autoritat certificadora reconeguda perquè els clients no rebin avisos de seguretat.
Let's Encrypt és una autoritat certificadora gratuïta, automatitzada i oberta que emet certificats SSL/TLS vàlids sense cost. És el projecte que ha democratitzat l'accés a certificats SSL i ha contribuït enormement a fer Internet més segur. L'any dos mil vint-i-quatre, Let's Encrypt emet més de tres milions de certificats nous cada dia.
Per utilitzar Let's Encrypt amb vsftpd, primer necessites tenir un nom de domini real que apunti al teu servidor. Let's Encrypt verifica que realment controles el domini abans d'emetre el certificat. Utilitzarem Certbot, que és el client oficial recomanat per Let's Encrypt.
# Instal·lar Certbot a Ubuntu/Debian
sudo apt update
sudo apt install certbot
# O a Rocky Linux/RHEL
sudo dnf install certbot
# Verificar la versió de Certbot instal·lada
certbot --version
# Versió actual el 2024: Certbot 2.8.0 o posterior
Per obtenir un certificat de Let's Encrypt per al teu servidor FTP, utilitzarem el mètode "standalone", que fa que Certbot executi temporalment el seu propi servidor web per completar la verificació:
# IMPORTANT: El port 80 ha d'estar lliure i accessible des d'Internet
# Certbot necessita aquest port per a la verificació del domini
# Obtenir un certificat per al teu domini
sudo certbot certonly --standalone -d ftp.elteudomi.cat
# Certbot et farà algunes preguntes:
# - Email per a notificacions urgents i renovacions
# - Acceptació dels termes de servei
# - Si vols compartir el teu email amb l'EFF (opcional)
# Si tot va bé, Certbot crearà els certificats a:
# /etc/letsencrypt/live/ftp.elteudomi.cat/fullchain.pem
# /etc/letsencrypt/live/ftp.elteudomi.cat/privkey.pem
Ara cal configurar vsftpd per utilitzar aquests certificats en lloc del nostre certificat autosignat:
# Editar /etc/vsftpd.conf
sudo nano /etc/vsftpd.conf
# Canviar les línies dels certificats per:
rsa_cert_file=/etc/letsencrypt/live/ftp.elteudomi.cat/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/ftp.elteudomi.cat/privkey.pem
# Guardar i reiniciar vsftpd
sudo systemctl restart vsftpd
Els certificats de Let's Encrypt només són vàlids durant noranta dies per raons de seguretat. Això pot semblar inconvenient, però en realitat afavoreix bones pràctiques de seguretat i facilita l'automatització. Certbot inclou un sistema de renovació automàtica:
# Certbot instal·la automàticament un timer de systemd que renova els certificats
# Podem verificar-ho:
sudo systemctl list-timers | grep certbot
# També podem provar la renovació manualment (en mode dry-run, sense fer canvis reals)
sudo certbot renew --dry-run
# Si la prova funciona correctament, Certbot renovarà automàticament
# els certificats quan faltin menys de 30 dies per caducar
Després de renovar un certificat, vsftpd necessita ser reiniciat per carregar el nou certificat. Podem automatitzar això creant un hook de Certbot:
# Crear un script que es executarà després de renovar els certificats
sudo nano /etc/letsencrypt/renewal-hooks/deploy/restart-vsftpd.sh
# Afegir aquest contingut:
#!/bin/bash
systemctl restart vsftpd
# Fer el script executable
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/restart-vsftpd.sh
Ara, cada vegada que Certbot renovi el certificat, reiniciarà automàticament vsftpd perquè carregui el nou certificat. Això fa que tot el procés sigui completament automàtic i no hagis de preocupar-te mai més dels certificats.
Referències
- Let's Encrypt
- Certbot Documentation
- Let's Encrypt Statistics
- OpenSSH Release Notes
- Ubuntu 24.04 LTS Packages
- Rocky Linux 9 Documentation
- OpenSSH sshd_config manual
- Mozilla SSH Guidelines
- NIST Guide to SSH
- SSH Key Management Best Practices - NIST
- Ed25519 Algorithm Details
- vsftpd Official Website
- vsftpd Documentation
- FileZilla Official
- lftp Manual
- FileZilla Documentation
- lftp Manual
- OpenSSL Documentation
- X.509 Certificate Standard
- Let's Encrypt (CA gratuïta per a producció)