FTP/FTPS – File Transfer Protocol

Il protocollo FTP/FTPS

Il File Transfer Protocol (FTP) è stato uno dei primi protocolli sviluppati nell’ambito del Networking, assieme al protocollo HTTP, ed è il protocollo di comunicazione standard utilizzato per il trasferimento di file da un client ad un server all’interno di una rete. FTP è quindi costruito sulla tipica architettura modello client-server che utilizza controlli e connessioni dati separate tra client e server. Gli utenti FTP possono autenticarsi con la versione in chiaro del protocollo (FTP propriamente detto), normalmente utilizzando nome utente, password e nome host (o indirizzo IP) del server remoto, oppure possono connettersi in modo anonimo se il server è configurato per consentire tale modalità di connessione.

Per una trasmissione sicura che protegga il nome utente e la password e provveda inoltre a cifrare il contenuto trasmetto si utilizza la protezione SSL/TLS (FTPS) oppure la connessione in modalità SSH File Transfer Protocol (SFTP).

Modello

Figura 32: Modello FTP
Figura 32: Modello FTP

Dove:

  • PI (Protocol Interpreter) è l’interprete del protocollo, utilizzato da client e server (rispettivamente User-PI e Server-PI) per scambiarsi comandi e risposte. Abitualmente ci si riferisce al Protocol Interpreter come “canale comandi”.
  • DTP (Data Transfer Process) è il processo di trasferimento dati vero e proprio, utilizzato da client (User-DTP) e server (Server-DTP) per lo scambio effettivo di dati. Abitualmente ci si riferisce al DTP come “canale dati”.

Funzionamento generale del protocollo

Il protocollo FTP utilizza due connessioni distinte per gestire comandi e risposte tra Client e Server e trasferimento dati. Il Server FTP in genere resta in ascolto sulla porta 21 (o sulla porta 22, nel caso di FTP over SSH) alla quale si connette il Client. Avviata la connessione il Client inizializza il canale per la trasmissione di comandi e risposte e quindi si attiva un ulteriore canale per procedere con l’effettivo trasferimento dati.

Entrambi i canali di comunicazione attivi durante la connessione FTP, quindi sia il canale di comandi che il canale di trasferimento dati, sono costituiti da connessioni TCP, quindi connection oriented e affidabili. Il Protocollo FTP crea un nuovo canale dati per ogni file trasferito all’interno della sessione corrente di trasferimento, mentre il canale di comando resta unico e invariato per tutta la durata della sessione. Quindi il canale di comando è di tipo persistente, mentre quello dati non lo è.

Tramite FTP è possibile effettuare sul filesystem del Server numerose operazioni, tra cui:

  • Download e Upload di file;
  • Eliminazione e ridenominazione di file e directory;
  • Navigazione tra le directory del filesystem del server;

La sessione di trasferimento inizia tramite un sistema di autenticazione in chiaro (non cifrato) costituito dai seguenti parametri:

  • Nome host: indica il nome host o l’indirizzo IP del server FTP
  • Username
  • Password
  • Numero di porta (di solito la 21, oppure la 22 nelle connessioni FTP over SSH)

è possibile in alcuni server anche la connessione cosiddetta “anonima”, ovvero del tutto priva di credenziali d’accesso. Tale connessione si utilizza solitamente per i repository di file e prevede per il client i privilegi di sola lettura.

Comunicazione e trasferimento dati

Una connessione FTP può essere eseguita in modalità attiva oppure in modalità passiva: la modalità di utilizzo selezionata determina il modo in cui viene stabilita la connessione dati tra client e server. In entrambi i casi, il client crea una connessione di controllo TCP a partire da una connessione casuale, di solito una porta “N” non privilegiata sul client, e si collega alla porta 21 del server FTP.

  • In modalità attiva, il client inizia ad ascoltare le connessioni dati in entrata dal server sulla porta “X” ed invia al server il comando “FTP PORT X” per informarlo su quale porta è in ascolto. Il server dal canto suo avvia un canale di comunicazione dalla sua porta 21, ovvero la porta dati del server FTP.
  • In modalità passiva il client utilizza la connessione di controllo per inviare il comando “PASV” al server e quindi ricevere dal server come risposta un indirizzo IP e un numero di porta. Questi dati saranno utilizzati dal client per aprire una connessione dati. Questa modalità di funzionamento è utilizzata soprattutto nei casi in cui il client si trovi dietro un firewall e quindi non sia in grado di accettare connessioni TCP in entrata.

Il protocollo FTP, quindi, come abbiamo già visto, ha quindi bisogno di due porte per funzionare: una per l’invio e una per la ricezione.

In entrambi i casi il server risponde alla richiesta di connessione con un codice di stato composto da 3 cifre e un messaggio di testo. Ad esempio, il codice “200” indica “OK”, ovvero che la richiesta ricevuta è stata correttamente eseguita.

FTP attraverso NAT e Firewall

Il protocollo FTP come abbiamo visto permette il trasferimento dati tra client e server attraverso una comunicazione Point-to-Point, ma come possiamo immaginare tale scenario si complica in presenza di un host che si trova dietro un NAT o dietro un firewall.

Una delle soluzioni usate, come visto prima, consiste nell’instaurare una connessione in modalità passiva: e questa è la soluzione in assoluto più utilizzata. Un’altra soluzione prevede che in NAT alteri i valori del comando “PORT”, inserendo i dati pubblici relativi a porta e indirizzo IP, utilizzando a questo scopo un gateway a livello Application.

Tipi di dati trasferibili

È possibile effettuare quattro tipo di trasferimento dati:

TIPO A – ASCII: Questo tipo di dato viene utilizzato per il trasferimento di file di testo, e potrebbe presentarsi la necessità di effettuare una conversione prima o dopo la trasmissione a seconda della modalità di rappresentazione dei dati utilizzata dal server. Questa modalità non è appropriata per trasmettere dati che non sia costituiti da solo testo.

TIPO I – Immagine:Detta anche modalità binaria, in questa modalità di trasferimento il mittente invia il file byte per byta e il destinatario memorizza il flusso di byte ricevuto per ricostruire il file originario. Si tratta di una delle modalità di trasferimento più utilizzate.

TIPO E – EBCDIC: Questa modalità si utilizza per trasmettere messaggi di testo semplice in formato EBCDIC.

TIPO L – Locale: Originariamente progettato per supportare il trasferimento di file tra macchine che non utilizzato il byte a 8 bit (ormai è praticamente in disuso).

TIPO U – Unicode: Modalità utilizzata per il trasferimento di dati testuali in formato Unicode.

Notiamo che le tipologie di dati trasmissibili vengono chiamati, in maniera un po’ ambigua e per certi versi impropria, col termine “modalità”. Non dimentichiamo tuttavia che tale termine viene utilizzato, come abbiamo già visto e come vedremo nel seguito, anche per riferirsi alla modalità di comunicazione vera e propria  che può essere attiva-vs-passiva e alle modalità impostate dal comando MODE del protocollo FTP.

Modalità di trasferimento dati

Il trasferimento dati tra Client e Server nell’ambito di una connessione FTP può avvenire in tre differenti modalità:

Modalità Stream (Mode S)

I dati vengono inviati dal Client al Server come un flusso continuo, impedendo al protocollo FTP di eseguire qualsiasi elaborazione sui dati stessi (come ad esempio conversioni, controllo, o altro). In questa modalità l’onere di ogni eventuale elaborazione viene lasciata al protocollo TCP.

Modalità di Blocco (Mode B)

I dati vengono inviati in blocchi di lunghezza predefinita, con inserimento di metadati con informazioni aggiuntive, come header del blocco, lunghezza, fine blocco, etc. Questa modalità è utilizzata per trasferire file dati orientati ai record o che comunque presentano una qualche forma di strutturazione.

Modalità Compressa (Mode C)

Utilizza lo stesso sistema della Modalità di Blocco, ovvero trasmette i dati in blocchi o “pacchetti”, ma aggiunge un sistema di compressione per ridurre la dimensione dei dati da trasferire e velocizzare quindi il trasferimento e l’utilizzo della banda.

La modalità in assoluto più utilizzato oggi è la Stream, mentre la Mode B e Mode C sono quasi del tutto in disuso.

Versioni orientate alla sicurezza

FTP over SSH

Il protocollo FTP standard non prevede alcun sistema di cifratura: persino la password viene trasmessa in chiaro tra client e server, con tutti i problemi che ne possono derivare. Per ovviare a questi inconvenienti si è provveduto ad implementare una versione più sicura che consiste nel creare una comunicazione FTP attraverso un tunnelling SSH, ovvero attraverso una connessione Secure Shell, ovvero FTP over SSH.

Dal momento che il protocollo FTP utilizza più connessione TCP (una per lo scambio di comandi e un’altra o più per la trasmissione dati) è abbastanza complicato eseguire il tunnelling su SSH.

Ad esempio, alcuni client SSH prevedono la protezione del solo canale di controllo, ovvero di quello più delicato, dal momento che su di esso viene trasmessa la password, ma senza prevedere alcun sistema di cifratura per il canale di trasferimento dati.

FTPS

Per superare queste limitazioni è stato sviluppato il protocollo FTPS, che prevede la cifratura di tutti i canali: sia quello di comunicazione che quelli di trasferimento dati. FTPS è quindi un’estensione di FTP che consente ai client di chiedere la cifratura di tutte le sessioni FTP.

SSH File Transfer Protocol (SFTP)

Un altro derivato di FTP è il protocollo di trasferimento file SSH. Questo protocollo trasferisce i file in maniera completamente cifrata utilizzando il protocollo Secure Shell (SSH) attraverso la porta 22. Oggi è la soluzione più utilizzata e preferita per trasferire file in maniera sicura.