Quando esponiamo sulla rete un servizio, come un web Server HTTP/HTTPS o un mail Server si pongono sempre notevoli problemi di sicurezza, in quanto ogni servizio esposto sulla rete pubblica è potenzialmente soggetto a tentativi di intrusione e attacco. Allo scopo di aumentare la sicurezza dei sistemi molto spesso si utilizzano dei componenti software chiamati Proxy. Il Reverse Proxy è un tipo particolare di Server Proxy che funge da intermediario tra il servizio che vogliamo distribuire e la rete.
Diamo di seguito una breve panoramica di cosa sono i Proxy, e successivamente vedremo i software più utilizzati per implementare questa importante funzione.
Indice
Cos’è un Server Proxy?
Come già accennato un Server Proxy è un software che si interpone tra la rete pubblica e il servizio che stiamo ospitando sul nostro Server, ovvero funge da intermediario nell’ambito della comunicazione Client/Server.
Abitualmente, ad esempio in una comunicazione HTTP (quando ad esempio chiediamo al nostro browser di restituirci una pagina web) la comunicazione tra il nostro Client e il web Server che ospita la pagina avviene in maniera, per così dire, diretta (o point-to-point). Tuttavia, tra i Client che tentano di accedere al nostro Server spesso e volentieri possono nascondersi dei malintenzionati, interessati ad attaccare il sistema: in questo scenario uno dei tanti strumenti di sicurezza introdotti è il Proxy.
Con la presenza di un Proxy, il Client che ha richiesto accesso alla risorsa pubblica si collegherà prima al Proxy, il quale potrà applicare determinate politiche di sicurezza. In questo modo chiunque voglia accedere alla nostra risorsa pubblica si dovrà prima collegare al Proxy e quindi non avrà accesso diretto alla risorsa sul Server. In pratica il Proxy diventa la porta d’accesso tra il Server e il mondo esterno.
Il ruolo dei Proxy oggi è principalmente orientato ad incrementare la sicurezza, ma anche le performance, oppure garantire la navigazione in pieno anonimato, come nel caso dei Server Proxy della rete TOR. Esistono anche Server Proxy con ruoli particolari, come la gestione dei sistemi di cache del server o di filtraggio del traffico in entrata, svolgendo quindi le funzioni di un firewall verso il web.
Hai bisogno di un sistemista per il tuo server Linux?
Scopri cosa possiamo fare per te.
Varie tipologie di Proxy
Un Server Proxy può essere interposto da qualsiasi parte nella comunicazione tra il Client e il Server, ad esempio anche nel PC locale dell’utente oppure direttamente sullo stesso web Server destinatario (caso più comune), così come può essere su un altro Server remoto e quindi interposto tra i due host. Un Proxy va quindi considerato a tutti gli effetti come un Server intermediario, che opera come una vera e propria interfaccia di rete, e si occupa di gestire e “filtrare” le comunicazioni tra il Client (o la rete) e il mondo esterno. Le principali tipologie di Proxy sono le seguenti:
Forward Proxy
Il Forward Proxy si occupa di gestire tutte le richieste provenienti dall’interno della rete, ovvero provenienti dalla rete locale LAN sulla qual si trovano i Client, e le reindirizza verso la rete esterna pubblica (ovvero Internet) perché ad esempio un Client della rete LAN ha richiesto una risorsa presente su un Server Web.
Quindi all’arrivo delle richieste il Forward Proxy, che le intercetta tutte, si occuperà di inoltrarle (ovvero di effettuarne il forwarding) tramite Internet esponendo il proprio indirizzo IP pubblico, e non quello del Client che ha inviato la richiesta vera e propria.
Le risposte inviate dal Server di destinazione saranno a loro volta reinviate al Proxy, e non direttamente al Client, in quanto sarà proprio il Proxy a farsi carico di reindirizzare (forwarding) le risposte al Client che ne aveva fatto richiesta. Viene quindi introdotto un ulteriore livello di protezione tra il Client e la rete Internet.
In questo modo infatti i Client della rete locale LAN resteranno anonimi, a tutto beneficio della privacy e della sicurezza. Il Forward Proxy ha quindi come compito principale quello di proteggere i Client della sua rete da possibili minacce esterne e garantirne l’anonimato.
Questo genere di Proxy si utilizza quindi in quei contesti applicativi nei quali è necessario che i Client di una rete locale LAN abbiano un elevato livello di sicurezza e anonimato. Ovviamente, come dicevamo in apertura dell’articolo, non basta certo un Server Proxy a garantire la sicurezza, ma si tratta solo di uno dei tanti strumenti da utilizzare.
Reverse proxy
Il Reverse Proxy, come il nome stesso suggerisce, lavora in maniera opposta al Forward Proxy e si interponte tra il Server e le richieste che arrivano a quest’ultimo dai Client e provenienti quindi dalla rete esterna.
Il Reverse Proxy quindi, come il Forward Proxy per i Client, agisce come intermediario tra la rete esterna (i Client che inviano le richieste) e il Server dove si trova il servizio o la risorsa richiesta dai Client.
Molti software del tipo Web Server di comune utilizzo offrono funzionalità di Reverse Proxy, allo scopo di proteggere lo stack software installato sui Server, come ad esempio framework applicativi o database engine, da potenziali problemi legati alle vulnerabilità del protocollo HTTP.
Ad esempio, un caso tipico di utilizzo di un Reverse Proxy è quello di rendere accessibile ad un Client che ne abbia fatto richiesta le risorse o i servizi erogati da un Server che si trova dietro un firewall. Oltre agli impieghi relativi alla sicurezza, i Reverse Proxy vengono utilizzati anche per migliorare le performance delle applicazioni distribuite dai Server ed in generale di tutto il sistema. Come vedremo infatti è possibile utilizzarli per gestire la cache di un sito web oppure per attuare delle politiche di load balancing per quei Server web che possono presentare picchi di traffico che potrebbero mandare in crash il sistema rendendolo inaccessibile. Il Reverse Proxy può anche mappare più risorse, ovvero più servizi o anche più Server, su una stessa URI, distinguendo i servizi in base al loro numero di porta, e quindi aggiunge un ulteriore livello che può essere impiegato, come già detto, per incrementare sia le performance che la sicurezza. Ad esempio, i celebri e utilizzatissimi Web Server Nginx e Apache, sono utilizzati spesso anche in funzione di Server Proxy che si occupano di gestire le richieste HTTP/HTTPS salvando i risultati delle risposte (cioè le pagine web) nella cache in modo da poterle inviare di nuovo e molto velocemente ai Client in caso di una nuova richiesta della stessa pagina.
Nell’ambito dei Web Server che forniscono servizi di hosting è molto comune utilizzare lo stack LAMP (Linux, Apache, MySql, Php) o LEMP (Linux, Nginx, MySql, Php) in cui i web server, per l’appunto Apache o Nginx, vengono utilizzati come Reverse Proxy l’uno dell’altro.
Ad esempio, un utilizzo molto diffuso prevede che in uno stesso Web Server siano installati sia Apache che Nginx, con Nginx che viene utilizzato come Reverse Proxy.
In questo stack Nginx resta in ascolto delle richieste provenienti dalla rete pubblica sulle porte 80 e 443 (a seconda che il protocollo utilizzato sia HTTP o HTTPS) mentre Apache resta in ascolto sulla porta interna 7080 (per le richieste HTTP) o sulla 7081 (per le richieste HTTPS). Nginx quindi intercetta il traffico in ingresso e in uscita verso Apache allo scopo di effettuare operazioni di filtraggio, load balancing o caching. Ad esempio, è comune utilizzare in abbinamento ad Apache ed Nginx anche il celebre software di gestione cache Varnish. Il Reverse Proxy, ovvero Nginx, ha quindi il compito di svolgere le seguenti funzioni: non appena riceve da un Client la richiesta di servire una pagina web adotta due strategie a seconda che si verifichi una delle seguenti condizioni:
- se la pagina richiesta è presente nella cache allora la recupera e la trasmette direttamente al Client, senza alcun intervento da parte di Apache;
- se la pagina richiesta non è presente nella cache, allora NGinX passerà la richiesta ad Apache, il quale a sua volta potrà ad esempio passare la richiesta all’interprete PHP per far generare dinamicamente la pagina, oppure preleverà il file HTML. Ottenuta la risorsa richiesta Apache provvederà a passarla nuovamente ad Nginx, il quale a sua volta la restituirà al client.
Nginx è già di default dotato in un efficiente sistema di caching, ma come dicevamo è possibile aggiungere un ulteriore livello di gestione della cache, utilizzando Varnish che nasce proprio a tale scopo.
In estrema sintesi, quindi, possiamo dire che in linea di massima un Forward Proxy serve a proteggere i Client durante la navigazione su Internet, mentre un Reverse Proxy serve a proteggere un Server dalle richieste che arrivano dall’esterno.
Hai bisogno di assistenza tecnica sul tuo server Linux?
Scopri cosa possiamo fare per te.
Scenari applicativi di un Server Proxy
Adesso che abbiamo capito quali sono le principali differenze tra Forward e Reverse Proxy, facciamo un breve riepilogo dei principali scenari applicativi nei quali è opportuno l’utilizzo di uno dei due sistemi di Server Proxy.
Gestione della privacy: è possibile utilizzare un Forward Proxy per far si che i Client di una rete LAN possano navigare in Internet in modo anonimo. Con un Forward Proxy interposto tra il Cliente di una LAN e un Web Server presente su Internet, la connessione diretta (point-to-point) sarà impedita, dato che i Client si collegheranno su Internet attraverso il Proxy e non direttamente ed esporranno quindi l’indirizzo IP del Proxy anziché il proprio. Un esempio tipico di questo scenario di utilizzo è costituito dai Proxy della rete TOR.
Filtering: un Server Proxy, fungendo da interfaccia tra Client e Server, può essere efficacemente utilizzato come sistema di filtraggio con o senza l’aiuto di un firewall. È possibile, ad esempio, utilizzare un Forward Proxy per bloccare specifici contenuti provenienti dal Web oppure si può usare un Reverse Proxy per filtrare e respingere richieste potenzialmente pericolose effettuate da un Client ad un Web Server.
Load Balancing: uno degli scenari più diffusi è quello che prevede l’impiego di un Reverse Proxy con funzione di Load Balancig. Ad esempio, negli scenari in cui un cluster di Server deve fornire determinati servizi o applicazioni, nel caso di picchi di traffico, il Reverse Proxy con load balancing è in grado di distribuire il carico in entrata bilanciando il traffico tra i vari nodi del cluster, in modo da redistribuire il carico su più macchine ed evitare che una o più di essere possano andare in sovraccarico (overloading) e diventare irraggiungibili. È possibile oltre al carico anche bilanciare la banda, in modo da assegnare ad ogni Client di una rete una porzione della banda disponibile in modo da evitare che una macchina, per qualche motivo, possa saturare l’intera banda disponibile, magari per colpa di un’applicazione buggata o perché sotto attacco.
Caching: un altro dei principali scenari di uso, il più importante in cui intervengono i Reverse Proxy, è la gestione della cache. Nei Web Server su stack LAMP o LEMP, allo scopo di velocizzare il sistema, vengono impiegati dei software di gestione della cache, ovvero si utilizza un sistema che memorizza in memoria (RAM o di massa) una copia statica delle risorse richieste. In presenza di un sisteme di gestione della cache, quando un Cliente effettua una richiesta al Web Server per richiedere una pagina web, il Reverse Proxy controlla prima di tutto se la risorsa richiesta è presente nella cache, in tal caso la preleva e la restituisce immediatamente al Cliente (senza necessità di intervento del Web Server vero e proprio) velocizzando di molto l’esecuzione della richiesta. Se invece la risorsa richiesta non è presente nella cache, allora il Reverse Proxy invia la richiesta al Web Server, che a sua volta provvederà a generare la pagina e restituirla al Reverse Proxy che la restituirà al Client che ne ha fatto richiesta.
Il tuo sito è lento e vorresti velocizzarlo?
Scopri cosa possiamo fare per te.
Altre precisazioni sui vari tipi di Server Proxy
Come vediamo, spesso diventa abbastanza difficile distinguere chiaramente le varie tipologie di Proxy e le funzioni che questi realizzano. Nella pratica quindi si opera una distinzione in base non solo allo scopo principale, che può essere la protezione dei Client (Forward Proxy) o dei Server (Reverse Proxy) ma si distingue la particolare tipologia di realizzazione tecnica delle funzioni che il Proxy svolge. In particolare, si distingue tra Circuit Level Proxy e Application Level Proxy, e tra Proxy di impiego specifico o generico.
Circuit Level Proxy
Questo tipo di Proxy opera al livello 4 dello stack ISO/OSI, ovvero al livello Transport. Esso non si occupa quindi di analisi dei pacchetti ma viene utilizzato come sistema di filtraggio a supporto del firewall, filtrando il traffico sulla base di indirizzo IP e numero di porta. Esso quindi, sulla base delle regole impostate relativamente appunto ad indirizzo IP e numero di porta, provvede a far passare i pacchetti in transito oppure a bloccarli del tutto, senza tuttavia entrare nel merito del loro contenuto, a differenza dell’Application Level Proxy.
Application Level Proxy
Questo tipo di Proxy opera al livello 7 dello stack ISO/OSI, ovvero al livello Application, che è il più alto. L’Application Level Proxy dispone di funzionalità avanzate per l’analisi dei pacchetti in transito e, a seconda del set di regole impostate, può applicare determinate azioni di filtraggio, blocco o inoltro dei pacchetti. Esso è quindi un vero e proprio filtro per un’applicazione.
Server Proxy specifici e generici
Un altro sistema di classificazione distingue i vari tipi di Server Proxy a seconda che questi sia responsabile per un determinato protocollo di comunicazione, come ad esempio HTTP, FTP o SMTP (Proxy specifico) oppure funzioni come interfaccia di comunicazione per una serie di protocolli (Proxy generico).
Nella pratica avremo che spesso un Application Level Proxy viene utilizzato come Proxy specifico per operare su un solo protocollo come sistema di filtraggio, ad esempio per operare sulle richieste Client-Server che arrivano via HTTP/HTTPS, mentre un Proxy generico viene impiegato in modalità Circuit Level Proxy e quindi opera su un set di differenti protocolli.