Lavorare con iptables su Ubuntu [per pinguini in erba]

Obiettivo: configurare il firewall su Ubuntu adatto ad un webserver, compresi servizi FTP e di posta, capendo come funzionano le regole ed i criteri principali

Contenuti

  1. Visualizzare lo stato del firewall (iptables)
  2. Accettare tutte le connessioni e ripristinare il firewall alla configurazione base
  3. Modificare il criterio della catena
  4. Aggiungere una nuova catena personalizzata
  5. Cambiare ordine ai filtri (anelli) sulla catena
  6. Eliminare un filtro (anello) della catena
  7. Aggiungere intervalli di porte ad iptables
  8. Bloccare un indirizzo IP
  9. Firewall su OUTPUT
  10. Configurare il firewall standard per server web con Apache, Webmin, FTP, POP3, SMTP, IMAP e SSH

 

Abbiamo già visto la configurazione base di iptables su Ubuntu, ora propongo una serie di esempi per capire in modo più approfondito come funziona.

Suggerimento: per testare la connessione possiamo usare il webserver creato con Apache e provare via via a collegarci alla porta 80, ovvero all’indirizzo del server tramite browser. Nell’esempio dell’altra volta tale indirizzo era http://192.168.56.1

Iptables è un programma che serve a gestire Netfilter, che è il vero firewall della maggior parte dei più moderni sistemi Linux. Su Wikipedia ci sono maggiori dettagli di base, per ora ne estraggo la citazione fondamentale:

Per configurare netfilter attualmente si usa il programma iptables, che permette di definire le regole per i filtri di rete e il reindirizzamento NAT. Spesso con il termine iptables ci si riferisce all’intera infrastruttura, incluso netfilter.

Iptables si basa su 3 catene principali:

  • INPUT traffico in entrata, per esempio collegarsi da fuori verso il PC in SSH oppure interrogare il server web in HTTP
  • FORWARD traffico reindirizzato, si usa solo nel caso in cui il PC effettui operazioni di routing
  • OUTPUT connessioni in uscita, per esempio operazioni di ping

E 3 criteri fondamentali:

  • ACCEPT permette
  • DROP blocca come se non esistesse
  • REJECT blocca inviando un errore

Ci sono anche altri criteri, ma per ora focalizziamoci su questi che sono essenziali per i nostri scopi.

Prima di proseguire capiamo meglio come funzionano le catene (chain). Sul firewall possono essere configurate diverse catene, che verranno visitate nell’ordine in cui sono inserite.

Immaginiamo di avere del traffico in ingresso e due catene come di seguito:

Alle catene vengono aggiunti anelli successivi, allungandole sempre di più. Un pacchetto che entra cerca di passare da un anello dove gli sia consentito, altrimenti, se non trova passaggi liberi, viene scartato. Per riuscire ad attraversare “indenne” il firewall deve visitare tutte le catene successive (devono essere referenziate, ma questo lo vedremo dopo).

Il primo anello rappresenta il criterio generale della catena, ma anche questo lo capiremo meglio dopo.

Questa è una spiegazione vagamente semplicistica, ma per il momento è sufficiente.

NOTA: E’ molto importante ricordare che mentre si apportano le modifiche ad iptables queste non saranno permanente finché non si salvano definitivamente; questo significa che se aggiungiamo dei criteri e poi riavviamo il computer, al riavvio questi non saranno più presenti. Perché diventino permanenti bisogna salvarli e vedremo come dopo.

1. Visualizzare lo stato del firewall (iptables)

Per visualizzare la configurazione del firewall è sufficiente digitare:

Nel mio caso viene visualizzato qualcosa di simile (ho già effettuato delle configurazioni):

Notiamo che nella prima chain, quella di INPUT (le prime 3 sono predefinite), c’è un comando inutile che tenta di bloccare i pacchetti dpt:http (dpt = destination port, http = 80), ovvero quelli passanti dalla porta 80 utilizzata per le connessioni web HTTP. Poche righe prima è infatti definita una regola che li fa passare attraverso la catena con ACCEPT, quindi questo DROP è inutile.

2. Accettare tutte le connessioni e ripristinare il firewall alla configurazione base

Per fare il reset del firewall è sufficiente digitare:

La -F sta per flush. Questo reimposterà tutte le catene effettuando la cancellazione di tutti gli anelli, lasciando solamente quelli in cima. Questo significa che se la regola per INPUT è ACCEPT resterà ACCEPT, se fosse stata DROP resterà DROP, senza tutte le altre regole a seguire.

Per reimpostare il primo anello della catena è necessario utilizzare:

In questo caso modifichiamo la catena predefinita degli INPUT, impostandola affinché faccia passare tutte le connessioni che non sono state definite. Il primo anello della catena, nel disegno precedente, è il criterio della catena.

Digitando il seguente comando si aprirà l’intero firewall e si cancelleranno tutti i criteri aggiuntivi.

Per non rischiare che il flush chiuda la connessione SSH possiamo concatenare i comandi con &&.

3. Modificare il criterio della catena

Immaginiamo di prendere la configurazione del firewall nel primo grafico, ma di cambiare il criterio della prima catena da DROP ad ACCEPT. Il risultato produrrà qualcosa di simile:

Quando il criterio della catena è ACCEPT significa che ogni pacchetto che non sia proibito, oppure sia esplicitamente accettato, passa, ovvero è ACCEPT di default. Se un pacchetto è DROP, al primo DROP è DROP per tutta la catena.

Per modificare il criterio di una catena, come quella di INPUT per esempio, è sufficiente digitare:

In questo caso l’intera catena è su ACCEPT come la catena1 del disegno. Se su INPUT volessimo riprodurre le medesime regole della catena precedente sarebbe sufficiente digitare, in questo ordine:

Con -A aggiungiamo un filtro (un anello) ad INPUT (o una catena scelta), -p definisce il protocollo da filtrare, per noi TCP, –dport definisce la porta di destinazione, per esempio la porta 80, -j imposta il jump, ovvero se si passa o si precipita.

NB: i protocolli accettati sono tcp, udp, udplite, icmp, esp, ah, sctp oppure all per prenderli tutti

Per visualizzare la configurazione digitiamo:

Il risultato assomiglierà al seguente:

Inutile dire come il criterio ACCEPT presupporrebbe di dover bloccare tutti i pacchetti eccetto quelli desiderati, quindi si preferisce di solito il criterio DROP, per cui sono bloccati tutti i pacchetti eccetto quello desiderati.

Il criterio ACCEPT è invece molto utile in fase di configurazione.

Immaginiamo di voler attivare il firewall solamente sulle seguenti porte: 80, 443, 20, 21, 22 (rispettivamente HTTP, HTTPS, FTP, FTP, SSH). Digitiamo in sequenza:

Interrogando iptables il risultato sarà:

4. Aggiungere una nuova catena personalizzata

Oltre alle catene predefinite, per ora abbiamo visto INPUT, OUTPUT e FORWARD, possiamo aggiungere delle ulteriori catene personalizzate.

Creiamo anzitutto la nostra nuova catena che io chiamerò Cerberus (niente di speciale nel nome, giusto per dare un tono fantasy all’esempio)

Adesso aggiungiamo, alla catena delle regole, ma prima di tutto una confessione:

ATTENZIONE! Solamente le catene predefinite possono avere dei criteri come ACCEPT, DROP, REJECT ecc., le catene personalizzate non possono averli, ma vanno collegate a quelle predefinite

Quindi sulla nostra catena personalizzata Cerberus blocchiamo la porta 80.

Assicuriamoci che la catena INPUT sia sul criterio ACCEPT e senza altri filtri. In tal caso il nostro server è ancora accessibile sulla porta 80.

Adesso colleghiamo la catena Cerberus alla catena predefinita INPUT, inserendo un jump (un salto potremmo dire)

A questo punto il server non è più accessibile dalla porta 80.

Se interroghiamo iptables per vedere le configurazioni presenti, vedremo qualcosa come questo:

Faccio notare come alla chain Cerberus è segnato un riferimento (1 references)

Per rimuovere il riferimento, e quindi riattivare la porta 80, è sufficiente eseguire:

ATTENZIONE! Bisogna tenere conto dell’ordine della catena e dove viene collegata ogni nuova catena. Immaginiamo di eseguire i seguenti comandi:

In questo modo ripristiniamo tutta la catena INPUT, impostando il criterio su ACCEPT, quindi permettiamo l’uscita dei pacchetti sulla porta 80. In questo caso, la catena Cerberus non serve a nulla.

5. Cambiare ordine ai filtri (anelli) sulla catena

Benché sia possibile eliminare i singoli filtri, non è possibile ordinarli. Esiste però un trucco, ed il seguente:

Questo creerà un file iptables.txt nella posizione nella quale ci troviamo. Apriamo e modifichiamo il file:

Quello che ci verrà mostrato è il set di tutte le regole impostate nel firewall. Nel mio caso, dopo le ultime modifiche le regole saranno:

A questo punto modifico il file invertendo tra di loro la riga 8 e la 9, ottenendo il seguente file:

A questo punto salviamo il file ed importiamolo nel firewall digitando:

Adesso controllando di nuovo la configurazione del firewall vedremo:

Adesso possiamo verificare che la porta 80 sia bloccata.

ATTENZIONE! Ricordarsi di cancellare il file iptables.txt se non si trova in un posto sicuro.

6. Eliminare un filtro (anello) della catena

Per eliminare un singolo filtro della catena è sufficiente dichiararlo al “contrario”. Se per esempio per aggiungere il suddetto filtro sulla porta 80 abbiamo digitato:

Per rimuoverlo è sufficiente digitare:

Faccio notare che l’unico parametro che cambia è la -A che diventa -D, che starebbe per delete, ovvero cancella.

La rimozione può essere anche effettuata in base al numero di riga nella catena interessata. La prima riga equivale ad 1.

Se avessi la seguente configurazione:

E volessi cancellare il filtro alla riga 2, ovvero

Mi basterebbe digitare:

Infine un modo ancora più veloce è quello illustrato al punto 5 per ordinare le regole, semplicemente rimuovendole dal file di testo e reimportandolo.

7. Aggiungere intervalli di porte ad iptables

Per aggiungere un intervallo di porte, per esempio dalla 6000 alla 6010, è sufficiente digitare:

Se si interroga iptables all’intervallo scelto si potrebbe vedere qualcosa di simile:

Nella colonna finale notiamo dpts che sta per destination ports, x11 che è il nome della porta 6000, utilizzata da X Windows System. Se la porta non avesse avuto un nome sarebbe comparso il numero.

Se volessimo invece abilitare diverse porte contemporaneamente sarebbe sufficiente digitare:

In questo caso attiviamo le porte 20, 21, 22, 80, 443 e l’intervallo delle porte comprese tra la 6000 e la 6010.

8. Bloccare un indirizzo IP

Per bloccare un indirizzo IP è sufficiente digitare:

-s sta per source (sorgente), ovvero origine della connessione.

Se volessimo bloccare un indirizzo IP ad una determinata porta potremmo digitare:

Questo blocca la porta 80 solo per l’indirizzo 10.0.2.30.

Adesso proviamo a digitare:

Questo bloccherà tutte le connessioni sulla porta 80, eccetto quelle provenienti dall’indirizzo 10.0.2.2.

9. Firewall su OUTPUT

Potremmo dire, per semplificare l’idea, che mentre le regole di INPUT si applicano al modello client ⇒ server (noi siamo il server) quelle di OUTPUT si applicano server ⇒ client. Ovvero al momento in cui il nostro server cerca di uscire verso l’esterno.

Questo avviene praticamente in tutte le connessioni, per esempio quando ci colleghiamo in SSH noi dobbiamo poter parlare da fuori al server (client ⇒ server), ma il server deve anche poterci rispondere (server ⇒ client).

Se digitassimo:

Praticamente nulla uscirebbe dal server.

Per capire meglio questa cosa proviamo a fare la seguente prova. Anzitutto assicuriamoci che l’OUTPUT non abbia filtri e sia su ACCEPT.

Proviamo a scaricare un file sul nostro server (per esempio il file zip di installazione di WordPress). Digitiamo:

Questo scaricherà nella cartella dove ci troviamo un file chiamato latest.tar.gz.

In questo momento non ci interessa tanto il file quanto il fatto che possa scaricarlo. Adesso proviamo a digitare i seguenti due comandi:

Questo aggiungerà due regole, la prima, che abbiamo già visto, per mantenere aperte le connessioni stabilite, la seconda per bloccare tutte le altre connessioni dall’interno. Questo significa che se un client interroga il server, quindi stabilisce una connessione del tipo client ⇒ server (come quando accediamo con putty al server), allora anche la relativa connessione server ⇒ client necessaria sarà permessa. Altrimenti sarà impossibile collegarsi da dentro al server verso l’esterno.

Se adesso tentiamo il comando precedente:

Incontriamo il seguente errore:

Questa connessione dovrebbe avvenire sulla porta 443 (HTTPS) quindi possiamo provare ad aprirla digitando:

Ma anche così facendo il download si blocca sulla risoluzione del dominio. Questo avviene perché il server deve potersi connettere anche in TCP e UDP al DNS sulla porta 53. Quindi è necessario abilitare anche tale filtro digitando:

A questo punto il download può avvenire.

Inutile dire che mantenere questo genere di blocco è di scarso interesse quando siamo noi i soli a gestire il server.

10. Configurare il firewall standard per server web con Apache, Webmin, FTP, POP3, SMTP, IMAP e SSH

Fatti tutti questi esperimenti scriviamo la configurazione per il nostro firewall standard, aprendo le porte per i suddetti servizi:

Il risultato dovrebbe apparire come quello seguente:

Per maggiori dettagli sull’associazione tra protocolli e fare riferimento a questa pagina di Wikipedia.

Le uniche porte non predefinite sono quelle per l’FTP passivo che ho messo, giusto per prova, dalla 6000 alla 6010. In realtà converrebbe associare un range più ampio, in base anche al numero di connessioni che si intende ricevere.

Per salvare il tutto installiamo iptables-persistent (se non lo abbiamo già fatto):

Ed infine digitiamo:

Vi ricordate che netfilter è il vero firewall di Linux e iptables “solo” un programma di gestione? Questo comando salva tutti i dati che abbiamo configurato.

Vedi articolo

Installazione Ubuntu webserver pronto all’uso [per esordienti totali]

Esistono diverse edizioni di Linux chiamate distro (da distribuzione) ed una delle più popolari e maggiormente utilizzate (oltre che da me preferite) è Ubuntu, una distribuzione derivativa da quella di Debian.

Senza entrare in ulteriori dettagli vediamo quindi come realizzare un webserver pronto all’uso con Ubuntu.

Anzitutto dobbiamo scaricare il sistema operativo dal sito ufficiale.

Scegliete il meccanismo di download che più vi aggrada.

La versione che utilizzeremo sarà la 16.04.2 LTS.

Le versioni LTS (long-term support) offrono invece aggiornamenti per cinque anni: l’ideale per chi ha bisogno di maggiore stabilità.

Altri ingredienti necessari saranno:

  1. VirtualBox (se non avete ancora una macchina fisica su cui installare il server)
  2. putty per l’accesso in SSH al nostro server (sui vantaggi nell’usarlo torneremo successivamente)

Una volta tutto preparato usiamo l’ISO scaricata dal sito ufficiale per iniziare con l’installazione.

Anzitutto ci viene richiesta la lingua, possiamo selezionare l’italiano.

A questo punto selezioniamo “Installa Ubuntu Server”, altre funzioni sono molto utili ma non necessarie in questo momento.

Prima che l’installazione cominci, dal momento che abbiamo scelto l’italiano, veniamo avvisati che alcune parti potrebbero non essere tradotte, quindi saranno in inglese. Niente di importante o che possa compromettere il sistema. Scegliamo quindi di proseguire. Ricordo che ci si può muovere tra le impostazioni premendo la tabulazione (tasto TAB, quello sopra BLOC MAIUSC con le frecce in opposizione), quando scegliamo l’opzione desiderata premiamo INVIO.

Confermiamo il paese come Italia.

Scegliamo di NON determinare automaticamente la tastiera, in genere non è necessario se lavoriamo con una tastiera standard.

A questo punto ci viene richiesta la disposizione della tastiera e lasciamo ancora una volta Italian.

Selezioniamo la prima scelta, nella maggior parte dei casi andrà bene. Se siamo a conoscenza del modello esatto della tastiera, se lavoriamo per esempio con la tastiera di un Mac, scegliamo la voce opportuna.

A questo punto ci viene chiesto di dare un nome al nostro computer, detto nome host, per esempio lo possiamo chiamare ubuntu.

A questo punto ci viene chiesto il nome completo dell’utente, potrei mettere Petar Karan, ma per semplificarmi la vita metto semplicemente petar.

Ora ci viene chiesto il nome dell’account, qui è importante scegliere bene perché sarà anche il nome di login e necessario per altre operazioni dopo, quindi conviene che sia pratico da digitare. In teoria sarebbe opportuno che fosse composto di sole minuscole e caratteri alfanumerici senza spazi.

Inseriamo adesso una password per il nostro account. Qui vi ricordo che l’account root resterà disabilitato di default e con l’utente di sopra e questa password, utilizzando sudo, potremo eseguire le operazioni con privilegi di amministratore. La password dovrebbe essere complessa nel caso che il server sia messo in rete.

Adesso ci viene chiesto se vogliamo cifrare la nostra cartella dell’utente; se non abbiamo timore di perdere il disco o che questo possa essere rubato, non è necessario cifrare la cartella, perché questo appesantirebbe le operazioni successive sui file della medesima (anche se non in modo significativo).

Ci viene chiesto di configurare l’orario del nostro computer, per noi in Italia la zona corretta è Europe/Rome; se va bene possiamo proseguire.

Adesso è il momento di partizionare il disco. Scegliamo di farlo con LVM, il che ci permetterà ulteriori operazioni e modifiche dopo, ma non entriamo nel merito adesso. Diciamo che se intendiamo ingrandire lo spazio sul nostro server e poter gestire agilmente il backup, LVM è quello che fa per noi.

A questo punto scegliamo il disco su cui effettuare l’installazione e da partizionare. Il disco stesso sarà ovviamente formattato. Nel mio caso sto lavorando su una macchina virtuale con un disco da 50GB. Faccio notare che 50GB secondo lo standard tradizionale equivalgono a 53.687.091.200 byte che qui vengono mostrati secondo lo standard scientifico, quindi 53,7 GB.

Adesso ci viene chiesto se intendiamo procedere. Diciamo pure di .

Ci viene chiesto di confermare la quantità di memoria da dedicare al gruppo di volumi (LVM). Per adesso su fiducia possiamo dire di selezionare tutto.

Ultima conferma per procedere. Faccio notare che sono stati creati due gruppi di volumi uno per la partizione root e uno per lo swap di sistema (per chi ha familiarità con Windows si tratta di uno spazio sul disco che viene usato per la memoria virtuale del sistema, così come succede su Windows con la memoria fisica – la RAM – e i file di paging)

Adesso ci viene chiesto di configurare, laddove fosse necessario, un server proxy. Nel mio caso, non avendo la rete dietro a proxy, posso saltare la configurazione.

Ci viene chiesto se vogliamo o meno effettuare aggiornamenti automatici. Per quanto siano importanti è bene che li gestiamo noi di persona, verificando via via se sia opportuno o meno aggiornare il server, specialmente se sarà un webserver con servizi offerti a utenti terzi. Qualche aggiornamento potrebbe non andare come ci aspettavamo e potremmo doverlo correggere seduta stante, quindi è meglio gestirli manualmente.

Ora è il momento di selezionare quali software vogliamo aggiungere alla nostra installazione. ATTENZIONE! La selezione viene effettuata premendo il tasto SPAZIO (la barra spaziatrice) e muovendoci con la tabulazione (TAB). Se si preme INVIO l’installazione prosegue con le voci selezionate. Prima di premere invio dovete avere le voci con gli asterischi come nel mio esempio.

In particolare vogliamo installare subito il server LAMP (Linux + Apache + MySQL + PHP) che sarà il nostro classico webserver e il server SSH. Li potremmo installare anche successivamente, ma perché perdere tempo se si può fare subito?

Dal momento che abbiamo deciso per l’installazione del server LAMP ci viene chiesto di configurare la password di root (non è l’utente root di sistema) per il nostro database MySQL. Anche se non sapete ancora di cosa si tratti esattamente, sappiate che serve per avere un webserver LAMP standard e quindi dategli una buona password.

Confermiamo la password.

Infine ci viene chiesto se vogliamo installare il boot loader GRUB. Nel caso in cui il server venga installato ex-novo su una macchina vergine, allora possiamo dire di sì. Questo installerà il boot loader personalizzato che offrirà diverse possibilità di avvio e configurazione dopo.

Quando è tutto completato estraiamo il disco dell’installazione (o rimuoviamo la ISO che abbiamo caricato nella macchina virtuale).

Fatto questo il sistema si riavvierà portandoci alla schermata di accesso.

Per accedere è sufficiente digitare il nome del nostro utente (per me petar) e la password che abbiamo scelto.

Fatto questo abbiamo terminato la prima parte dell’installazione. Adesso il nostro server Ubuntu è pronto e operativo.

Se stiamo utilizzando VirtualBox possiamo cominciare ad inoltrare le prime porte (qualora lo utilizziamo in modalità NAT) verso il nostro server.

Se lavoriamo da Windows possiamo aprire il Prompt dei comandi ed effettuare un ipconfig per trovare l’indirizzo della scheda di rete di VirtualBox. Nel mio caso il risultato è questo (è questo nella maggior parte dei casi standard).

Questo significa che l’IP su cui vedo la rete di VirtualBox è l’indirizzo 192.168.56.1

Per modificare l’inoltro delle porte sulla macchina virtuale è sufficiente andare nelle impostazioni della macchina e poi su Avanzate selezionare “Inoltro delle porte“.

Si aprirà una schermata vuota (se è la prima volta che la usiamo) nella quale dovremo mettere i seguenti dati.

Per aggiungere nuove regole è sufficiente cliccare sul tasto col più verde (freccia rossa). La macchina host è la nostra che vedrà l’IP all’indirizzo suddetto; la macchina guest è la nostra macchina virtuale. Tipicamente, nella configurazione NAT, viene assegnato l’IP 10.0.2.15; per verificarlo è sufficiente utilizzare ifconfig all’interno di Ubuntu nel modo seguente.

Faccio notare che il comando è ifconfig anziché ipconfig come su Windows. Quello che si richiede è la configurazione dell’interfaccia. Ci vengono mostrate due interfacce, enp0s3 (in una configurazione su macchina fisica qui potremmo vedere eht0) e l’interfaccia lo (elle-o, che sta per local), ovvero l’interfaccia degli indirizzi interni alla macchina. Notiamo infatti che sull’interfaccia enp0s3 abbiamo configurato l’indirizzo 10.0.2.15 (che è quello esterno della macchina sulla rete), e sull’interfaccia lo abbiamo configurato 127.0.0.1 che è il nostro localhost.

Fatte tutte queste belle cose, e con la macchina attiva ovviamente, possiamo aprire il browser sulla macchina host (per esempio sul nostro computer Windows) oppure sul computer dal quale ci vogliamo collegare al server con Ubuntu, e digitare nel browser l’indirizzo http://192.168.56.1

Se tutto è andato bene dovremmo vedere una schermata simile a questo. Questo significa che il nostro server web è attivo e pronto all’uso.

Adesso controlliamo che funzioni anche il server SSH. Per farlo ci sarà sufficiente scaricare putty e avviarlo nel modo seguente:

Come potete vedere è sufficiente digitare l’indirizzo del nostro server (tenendo sempre a mente l’inoltro delle porte fatto prima) e cliccare su Open.

Ci verrà chiesto di acquisire la chiave per la crittografia, gli diciamo di .

Ci verrà mostrata la solita schermata di accesso ad Ubuntu dove digitare nome utente e password, come abbiamo fatto al primo accesso.

Il motivo per cui preferisco utilizzare putty anche in una configurazione con la macchina virtuale è la possibilità di copiare ed incollare agilmente i comandi che mi interessano sopra. Infatti per copiare da putty è sufficiente selezionare del testo (qualunque testo selezionato verrà automaticamente copiato). Per incollare è sufficiente cliccare col tasto destro del mouse. Vi consiglio di fare un po’ di pratica prima di cominciare a lavorarci, copiando ed incollando dei comandi elementari per non rischiare di fare pasticci dopo.

Fatto questo passiamo alla configurazione del firewall di Linux.

Firewall su Ubuntu

A prima vista potrebbe sembrare difficile, ma in realtà è tutto semplicissimo.

Anzitutto digitiamo nel terminale il seguente comando:

Siccome è una guida per esordienti totali faccio notare alcune caratteristiche:

  1. sudo server ad eseguire i comandi come SuperUser, significa letteralmente SuperUser do
  2. iptables è il firewall predefinito all’interno di Linux, nello specifico in Ubuntu
  3. -L e -v sono due opzioni per iptables, usando i comandi da terminale possiamo passare ad ogni comando delle opzioni aggiuntive per modificarne il funzionamento, in particolare -L visualizza la lista delle impostazioni e -v lo fa in modo “verbose“, ovvero fornendo numerosi dettagli, per maggiori approfondimenti sui parametri che possiamo passare ad iptables possiamo utilizzare man iptables (man è il manuale interno di Ubuntu)
  4. | questo è un comando di bash che ci permette di effettuare un’operazione successiva sull’output precedente
  5. grep Chain è il comando con il quale “catturiamo” le righe dell’output contenenti la voce Chain che verrà evidenziata

L’output del comando precedente dovrebbe mostrarci qualcosa come:

Prima di proseguire sarà bene chiarire come funziona il firewall dentro Linux. Partiamo con uno schema:

Questo grafico l’ho scopiazzato da qui, dove troverete anche una guida approfondita sul firewall in generale

Come si vede nell’immagine di sopra abbiamo 3 canali principali (detti catene); INPUT, OUTPUT e FORWARD. Il loro scopo potrebbe essere descritto in questo modo:

  • INPUT traffico in entrata, per esempio collegarsi da fuori verso il PC in SSH oppure interrogare il server web in HTTP
  • FORWARD traffico reindirizzato, si usa solo nel caso in cui il PC effettui operazioni di routing
  • OUTPUT connessioni in uscita, per esempio operazioni di ping

Sostanzialmente quello che ci interessa controllare, in un primo momento (senza entrare in configurazioni e monitoraggi più complessi ed articolati) sono le catene in INPUT e FORWARD. Il controllo viene eseguito mediante 3 criteri di “catena”, la chain di cui si parlava prima, ovvero dei criteri che stabiliscono se nel flusso dei dati determinati pacchetti debbano o meno proseguire. I criteri sono i seguenti:

  • ACCEPT permette
  • DROP blocca come se non esistesse
  • REJECT blocca inviando un errore

Se vi sembra tutto complicato aspettate un secondo e vedrete che in realtà è semplicissimo.

Anzitutto chiudiamo tutte le catene in INPUT e FORWARD. Utilizziamo i seguenti due comandi (ATTENZIONE! prima di eseguirli leggere quanto segue):

Faccio notare che:

  • -P cambia i criteri della catena
  • -A aggiunge criterio alla catena esistente

Quando utilizziamo -P significa che vogliamo reimpostare l’intera catena degli INPUT (per esempio), cancellando quindi tutte le impostazioni precedenti. Con il comando -A invece possiamo aggiungere dei criteri.

Se li eseguissimo questi bloccherebbero tutte le connessioni in entrata compresa quella SSH di cui abbiamo bisogno per gestire il sistema, quindi dobbiamo aggiungere un secondo commando nello specifico:

Questo aprirà le connessioni in INPUT.

Se aveste inavvertitamente bloccato tutto (a parte poter lavorare tranquillamente da dentro la macchina) sarà sufficiente eseguire i seguenti comandi per riattivare tutte le porte.

Sarà comunque sufficiente riavviare la macchina, nel caso estremo di inaccessibilità, per ripristinare tutto (e questo ci porta dopo al vedere come salvare le impostazioni).

Comunque sia per effettuare la suddetta chiusura e lasciare aperta solo la porta 22 sarà sufficiente eseguire il seguente comando:

Faccio notare l’utilizzo di && che serve a concatenare i comandi tra di loro, per cui se ho due comandi A e B e digito A && B, B viene eseguito solo se A ha successo. In questo modo collego tutti e tre i comandi e li eseguo di fila, bloccando tutto e aprendo immediatamente la connessione sulla porta 22. Questo mi consente di continuare ad accedere tranquillamente da putty.

Adesso sblocchiamo gli INPUT sulla scheda interna (ricordate la lo di prima?) digitando:

Inoltre sblocchiamo le connessioni in entrata generate da richieste interne (ok, anche qui potremmo avere dei problemi di sicurezza nel caso di malaware interni alla macchina, ma per il momento possiamo supporre di avere un sistema pulito e non preoccuparcene):

Adesso apriamo le porte per l’HTTP e l’HTTPS, rispettivamente le porte 80 e 443 (a meno di non aver cambiato qualcosa):

Fatto questo verifichiamo che sia tutto in regola digitando:

Dovremmo vedere un output simile a questo:

Faccio notare che non abbiamo aperto porte per l’FTP (ma è meglio che resti chiuso), né per IMAP, POP3 o SMTP. Via via che avremo bisogno di tali servizi potremo aprire le specifiche porte.

A questo punto è il momento di salvare la configurazione in modo permanente (ricordate che al riavvio va riconfigurato tutto?), perciò digitiamo:

Questo installerà iptables-persistent (vi ricordo che con apt-get possiamo gestire i pacchetti di installazione Debian/Ubuntu e con il parametro install installarli)

Vi verrà chiesto di confermare l’installazione con un S e poi comparirà una schermata (tipicamente fucsia) dove vi verrà chiesto se salvare la configurazione attuale.

In generale per salvare la configurazione (da Ubuntu 16.04 in poi) è sufficiente utilizzare i seguenti comandi, una volta installato il servizio:

Adesso riavviamo tutto il sistema per verificare di aver configurato tutto correttamente. E’ sufficiente digitare:

Digitando nuovamente:

Verifichiamo che sia tutto al proprio posto. Se è così il firewall è configurato e perfettamente funzionante.

Se volessimo adesso escludere un indirizzo IP bloccandolo ci sarebbe sufficiente digitare:

Dove l’indirizzo 15.15.15.51 è quello ipotetico che vogliamo bloccare. Ad ogni modifica del firewall ricordiamoci di salvare il tutto.

Fail2Ban per bannare i tentativi di accesso illeciti

Siccome abbiamo aperto il server sul SSH la nostra prima preoccupazione dovrebbe essere quella di bloccare tutti gli accessi indesiderati, in particolare di bloccare i tentativi di accesso malevoli. Per farlo su Ubuntu esiste un fantastico programma chiamato Fail2Ban.

Anzitutto installiamo fail2ban digitando:

Una volta installato modifichiamo la configurazione principale digitando:

Visto che siamo degli esordienti totali approfondiamo un paio di cose:

  • cd serve a cambiare cartella, letteralmente change directory, e ci fa posizionare in /etc/fail2ban, ricordiamoci che nella cartella /etc di solito si trovano i file di configurazione dei programmi
  • cp serve a copiare il file jail.conf in jail.local, in questo modo non intaccheremo la configurazione originale di fail2ban e potremo sempre ripristinarla semplicemente cancellando il file appena creato e ricreandolo nella suddetta maniera

Fatto questo digitiamo:

nano è un editor da terminale di Ubuntu, le opzioni che appaiono come ^O oppure ^X sono eseguibili premendo CTRL+O oppure CTRL+X. Queste due in particolare servono a salvare le modifiche apportate e ad uscire dall’editor.

Per muoverci dentro il file utilizziamo le frecce direzionali e spostiamoci verso il basso fino ad individuare le voci che vogliamo modificare. I # servono come commenti, quindi rendono nulle le righe di codice che precedono. Quello che vedremo sarà qualcosa di simile a questo:

Modifichiamo le seguenti voci (cercandole scendendo verso il basso):

Questo imposterà il tempo di ban su 1 ora, ovvero 60*60 secondi e il numero massimo di tentativi sbagliati prima di essere bannati sarà 3.

Il parametro findtime determina invece la finestra temporale per gli errori, impostato a 600 significa che si possono fare 3 errori consecutivi, prima di essere bannati, nell’arco di 10 minuti.

Scendiamo ancora in basso e cerchiamo la jail del SSH che si presenterà così:

Lo modifichiamo per farlo diventare così:

Premiamo CTRL+O per salvare il file.

Faccio notare che abbiamo cambiato il percorso dei file log in modo tale che legga quello giusto.

A questo punto riavviamo il servizio fail2ban (per ricaricare le impostazioni), digitando:

Ci dovrebbe rispondere nel modo seguente:

In caso di errore significa che abbiamo sbagliato a scrivere qualcosa nel file di configurazione.

Per visualizzare gli IP bannati ci sarà sufficiente usare di nuovo iptables.

Mentre per rimuovere un indirizzo IP dalla lista di quelli bloccati sarà sufficiente digitare:

In questo caso la jail dalla quale lo vogliamo sbannare è quella del sshd (la d finale sta per daemon, praticamente un servizio di linux) e sbanniamo l’indirizzo ip 10.0.2.2 che è quello da cui la mia macchia virtuale vede connettersi il sottoscritto.

Adesso passiamo ad installare Webmin, la manna dal cielo per chiunque debba gestire un webserver da remoto.

Installazione Webmin

Anzitutto aggiungiamo la repository di Webmin all’elenco delle sorgenti di installazione per il nostro server. Per farlo modifichiamo il file delle repository digitando:

Aggiungiamo in fondo la seguente riga (con CTRL+V ci spostiamo velocemente verso il basso)

Premiamo CTRL+X per salvare il tutto.

Adesso posizioniamoci nella nostra home (in realtà dovremmo già esserci), qualora non lo fossimo digitiamo:

Chiaramente al posto di petar ci va il vostro nome utente.

Scarichiamo la chiave della repository aggiunta in modo da installarla nel sistema, affinché la riconosca come attendibile.

wget è il comando che permette di scaricare da internet il contenuto di un link e salvare nel computer. In questo caso scaricherà il file dall’indirizzo dato e lo salverà tale e quale nella nostra cartella home.

Appena finito il download digitiamo:

In questo modo registriamo la chiave che ci interessa. Nel terminale dovrebbe comparire un OK di conferma.

A questo punto aggiorniamo la nostra repository interna digitando:

Appena il processo sarà finito possiamo passare all’installazione di webmin.

Per farlo sarà sufficiente digitare (e poi confermare con un S come al solito):

Se tutto è andato come dovrebbe allora vi comparirà un messaggio come il seguente:

Questo significa che possiamo raggiungere webmin alla porta 10.000. Ovvero digitando (nel mio caso, per via della configurazione precedente) https://192.168.56.1:10000

Naturalmente l’indirizzo risulterà irraggiungibile perché va aperta la porta 10.000 sul firewall, per farlo sarà sufficiente digitare:

Ricordiamoci anche di effettuare l’inoltro (qualora usassimo la macchina virtuale) da virtualbox.

Se abbiamo fatto tutto bene dovremmo poter accedere a Webmin in questo modo.

Vi faccio notare che non abbiamo un certificato valido, quindi il browser potrebbe segnalarci la connessione in HTTPS come non sicura. Inoltre, nonostante si siano aperte le porte per l’HTTPS standard, bisogna aprire anche quella di webmin, perché quello standard va sulla 443, mentre webmin (di predefinito) sulla porta 10.000.

Possiamo effettuare il login con i nostri nome utente e password accedendo alla seguente schermata.

Da qui possiamo gestire buona parte delle impostazioni del nostro server, oltre che controllarne sempre lo stato.

E per concludere ultima modifica di sicurezza. Abilitiamo webmin solo verso il nostro indirizzo IP.

Per farlo è sufficiente modificare il file di configurazione, usando sempre il terminale. Digitiamo:

Così apriamo il file di configurazione di webmin.

Subito sotto la riga della porta aggiungiamo una linea dove mettiamo il nostro indirizzo IP (nel mio caso 10.0.2.2, quello da cui mi vede la macchina virtuale)

In questo modo l’accesso sarà consentito solamente dal mio indirizzo. Questo è molto pratico quando avete un indirizzo IP statico, ma anche se non lo aveste potete sempre accedere prima in SSH e abilitare il vostro indirizzo corrente. In questo modo tenete webmin al sicuro e lontano da tentativi di hacking (più o meno, ma non è il momento per approfondire).

Perché la configurazione abbia successo è necessario riavviare webmin digitando:

Quest’ultima operazione è fattibile anche da dentro a Webmin, seguendo le seguenti istruzioni.

Testiamo il PHP

Infine testiamo il nostro webserver creando una semplice pagina PHP.

Anzitutto spostiamoci nella cartella di apache, digitando:

Utilizzando il comando ls vedremo che qui c’è un unico file chiamato index.html, che è quello che abbiamo visto in precedenza quando abbiamo avviato apache.

Cancelliamolo e creiamo un nuovo file index.php

Si aprirà l’editor nano, dentro incolliamo il seguente codice:

Ancora una volta CTRL+O per salvare (e quindi creare) il file, CTRL+X per uscire.

ATTENZIONE! Abbiamo creato il file come root, infatti digitando ls -l dovreste vedere qualcosa di simile a

Per essere un file eseguibile correttamente da apache, e soprattutto per non avere problemi di sicurezza, il file deve essere impostato su www-data, quindi usiamo il comando chown per cambiare proprietario (letteralmente change owner)

Fatto tutto questo visitiamo nuovamente http://192.168.56.1/

Se tutto è andato per il verso giusto dovremmo vedere una simpatica scritta che dichiara a caratteri cubitali: Ciao, Mondo!

 

Ultima revisione: 19 febbraio 2018

Vedi articolo