martedì 21 aprile 2015

Configurare pfSense per l'accesso ad un server FTP

Configurare correttamente pfSense per garantire l'accesso ad un server FTP è abbastanza semplice ma in alcuni casi può trasformarsi in un vero e proprio bagno di sangue. Per averne la conferma basta fare una veloce ricerca con google o semplicemente visitare il forum ufficiale di pfSense per scoprire che in molti sono rimasti vittime di questo semplice e vecchio protocollo.
In quest'articolo cercheremo di capire quali sono le insidie che si nascondono dietro questo servizio e come configurarlo in modo corretto pfSense.

Per prima cosa cerchiamo di capire come funziona questo protocollo.

Il File Transfer Protocol (FTP) è un protocollo per la trasmissione di dati tra host basato su TCP.
FTP è uno dei primi protocolli definiti della Rete Internet, la prima specifica, sviluppata presso il MIT, risale al 1971 (RFC-114). Negli anni ha subito numerose modifiche e l'attuale specifica fa riferimento all'RFC-959.

Gli obiettivi principali di FTP descritti nella sua RFC ufficiale furono: 
  • Promuovere la condivisione di file (programmi o dati);
  • Incoraggiare l'uso indiretto o implicito di computer remoti;
  • Risolvere in maniera trasparente incompatibilità tra differenti sistemi di stoccaggio file tra host;
  • Trasferire dati in maniera affidabile ed efficiente.

FTP a differenza della gran parte dei protocolli internet, utilizza due connessioni separate per gestire comandi e dati. Un server FTP generalmente rimane in ascolto sulla porta 21 TCP a cui si connette il client. La connessione da parte del client determina l'inizializzazione del canale comandi attraverso il quale client e server si scambiano comandi e risposte. Lo scambio effettivo di dati (come per esempio un file) richiede l'apertura del canale dati, che può essere di due tipi.

Quest'affermazione ci porta a scoprire i primi due dati fondamentali:
  1. Il protocollo sfrutta la porta 21 TCP per il canale comandi;
  2. Deve essere aperto un altro canale per il transito dei dati.
Il secondo punto viene molto spesso ignorato ed è la vera causa dei problemi di chi tenta di configurare un firewall per il passaggio del traffico FTP.

Il canale dati di una connessione FTP può essere aperto in due modalità differenti:

Modalità Attiva

Il client comunica al server, tramite il canale comandi, quale porta (Superiore alla 1023) intende usare per la trasmissione dei dati. Il server apre il canale di connessione che va dalla sua porta TCP 20 alla porta TCP scelta dal client;


Questa modalità richiede che il client sia disposto ad accettare connessioni su porte superiori alla 1023 ed originate da un qualsiasi host su internet. Se il pc dispone di un firewall anche basilare questo andrà ad impedire questo tipo di connessioni.

Modalità Passiva

Il server sceglie quale porta (Superiore alla 1023) intende usare per la trasmissione dati, la comunica al client tramite il canale comandi ed il client si connette su questa porta. 


A differenza della modalità attiva, la modalità passiva prevede sia il server ad aprire un certo numero di porte superiori alla 1023 per consentire l'apertura di canali dati. Anche in questo caso se non debitamente istruito il firewall andrà a bloccare tutti i tentativi di trasferimento dati nonostante la connessione venga stabilita.

Con questi ultimi due punti abbiamo il quadro completo, oltre alla porta TCP 21 dobbiamo scegliere la modalità con cui vogliamo operare e configurare di conseguenza server e firewall.

Configurazione in modalità Attiva

Selezioniamo Firewall > NAT

Creiamo una nuova regola di nat così costituita

Interface: WAN
Protocol: TCP
Destination: WAN Address
Destination Port: 21
Redirect Target IP: IP_Server_FTP
Redirect Target Port: 21
Filter rule association: Add Associated filter rule

Ora se necessario creiamo la regola per permettere al traffico in uscita di passare

Selezioniamo Firewall > Rules

Creiamo una nuova regola di firewall così costituita

Action: Pass
Interface: LAN
Protocol: TCP
Source: IP_Server_FTP
Source Port Range: 20
Destination: Any
Destination Port: Any

A questo punto non ci resta che verificare la possibilità da parte del client di accettare connessioni in entrata.

Configurazione in modalità Passiva

Per prima cosa sul server FTP scegliamo il range di porte da utilizzare per le connessioni dati es: dalla 10100 alla 10200

Selezioniamo Firewall > NAT

Creiamo due regole di nat così costituite

Interface: WAN
Protocol: TCP
Destination: WAN Address
Destination Port: 21
Redirect Target IP: IP_Server_FTP
Redirect Target Port: 21
Filter rule association: Add Associated filter rule

Selezioniamo Firewall > NAT
Creiamo una nuova regola di nat così costituita
Interface: WAN
Protocol: TCP
Destination: WAN Address
Destination Port: from 10100 to 10200
Redirect Target IP: IP_Server_FTP
Redirect Target Port: 10100 (automaticamente verrà esteso il range fino alla 10200)
Filter rule association: Add Associated filter rule

A questo punto il server può ricevere le connessioni sulla porta 21, comunicare quale porta tra la 10100 e la 10200 ha scelto per il canale dati ed attendere che il client apra il canale dati.

FTP Helper ed FTP Proxy

Molti router e firewall dispongono di un servizio che in base all'implementazione può essere denominato FTP Helper o FTP Proxy. Questo meccanismo ha tra le varie cose il compito di agevolare l'utente nella configurazione occupandosi di gestire in modo più o meno automatico il canale dati.

In pfSense dalla versione 2.2 questo meccanismo è stato rimosso rendendo insufficiente la sola apertura della porta 21 (soprattutto nella modalità passiva). Questo cambiamento ha creato molti problemi soprattutto a chi ignorava il funzionamento del protocollo FTP e lo aveva sempre considerato simile all'HTTP o ad altri protocolli che fanno uso di una sola porta per poter operare.

Considerazioni sulla sicurezza

Come abbiamo visto FTP nasce molto lontano nel tempo, quando la necessità di proteggere le comunicazioni non esisteva e tantomeno i firewall. Questo fa si che racchiuda in se una serie di elmenti che lo rendono un protocollo poco orientato alla sicurezza: le password viaggiano in chiaro, richiede un numero arbitrario di porte aperte, i dati non sono cifrati ecc...

Per ovviare al problema è stata definita una nuova specifica che aggiunge al protocollo FTP originale un layer di cifratura SSL/TLS. Il protocollo prende il nome di FTPS ed è definito nella RFC-4217. Da non confondersi con SFTP che è comunque un'alternativa per ovviare ai problemi di sicurezza dell'FTP.
Posta un commento