Introduzione

Un firewall correttamente configurato è uno degli aspetti più importanti della sicurezza generale del sistema.

FirewallD è una soluzione firewall completa che gestisce le regole iptables del sistema e fornisce un'interfaccia D-Bus per operare su di esse. A partire da CentOS 7, FirewallD sostituisce iptables come strumento di gestione firewall predefinito.

In questo tutorial, ti mostriamo come impostare un firewall con FirewallD sul tuo sistema CentOS 8 e ti spieghiamo i concetti di base di FirewallD.

Prerequisiti

Prima di iniziare con questa esercitazione, assicurarsi di aver effettuato l'accesso al server con un account utente con privilegi sudo o con l'utente root. La migliore pratica è eseguire comandi amministrativi come utente sudo anziché root. Se non hai un utente sudo sul tuo sistema CentOS, puoi crearne uno seguendo queste istruzioni.

Se desideri installare e configurare FirewallD su un server in remoto continua a leggere, altrimenti salta il primo paragrafo "Connessione al Server" e leggi il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Concetti di base di Firewalld

FirewallD utilizza i concetti di zone e servizi, anziché di catena e regole di iptables. In base alle zone e ai servizi che configurerai, puoi controllare quale traffico è consentito o non consentito da e verso il sistema.

FirewallD può essere configurato e gestito utilizzando l'utility firewall-cmd della riga di comando.

Firewalld Zones

Le zone sono insiemi predefiniti di regole che specificano a quale traffico deve essere consentito in base al livello di attendibilità sulle reti a cui è connesso il computer. È possibile assegnare interfacce e fonti di rete a una zona.

Di seguito sono elencate le zone fornite da FirewallD ordinate in base al livello di attendibilità della zona da non attendibile a attendibile:

  • drop: tutte le connessioni in entrata vengono eliminate senza alcuna notifica. Sono consentite solo connessioni in uscita.
  • block: tutte le connessioni in entrata vengono rifiutate con un messaggio icmp-host-prohibited per IPv4 e icmp6-adm-prohibited per IPv6n. Sono consentite solo connessioni in uscita.
  • public: per l'uso in aree pubbliche non attendibili. Non ti fidi di altri computer sulla rete, ma puoi consentire connessioni in entrata selezionate.
  • external: per l'uso su reti esterne con mascheramento NAT abilitato quando il sistema funge da gateway o router. Sono consentite solo le connessioni in entrata selezionate.
  • internal: da utilizzare su reti interne quando il sistema funge da gateway o router. Altri sistemi sulla rete sono generalmente affidabili. Sono consentite solo le connessioni in entrata selezionate.
  • dmz: utilizzato per computer situati nella zona smilitarizzata che hanno accesso limitato al resto della rete. Sono consentite solo le connessioni in entrata selezionate.
  • work: usato per macchine da lavoro. Altri computer sulla rete sono generalmente affidabili. Sono consentite solo le connessioni in entrata selezionate.
  • home: utilizzato per macchine domestiche. Altri computer sulla rete sono generalmente affidabili. Sono consentite solo le connessioni in entrata selezionate.
  • trusted: sono accettate tutte le connessioni di rete. Fidati di tutti i computer della rete.

Servizi firewall

I servizi Firewall sono regole predefinite che si applicano all'interno di una zona e definiscono le impostazioni necessarie per consentire il traffico in entrata per un servizio specifico.

Firewalld Runtime e impostazioni permanenti

Firewalld utilizza due set di configurazione separati, runtime e configurazione permanente.

La configurazione di runtime è l'effettiva configurazione in esecuzione e non è persistente al riavvio. All'avvio del servizio Firewalld, carica la configurazione permanente, che diventa la configurazione di runtime.

Per impostazione predefinita, quando si apportano modifiche alla configurazione di Firewalld utilizzando l'utilità firewall-cmd, le modifiche vengono applicate alla configurazione di runtime. Per rendere permanenti le modifiche è necessario utilizzare l'opzione --permanent.

Installare e abilitare FirewallD

Firewalld è installato di default su CentOS 8, ma se non è installato sul tuo sistema, puoi installare il pacchetto digitando:

sudo dnf install firewalld

Il servizio Firewalld è disabilitato per impostazione predefinita. Puoi controllare lo stato del firewall con:

sudo firewall-cmd --state

Se hai appena installato o non hai mai attivato prima, il comando stamperà not running. Altrimenti, vedrai running.

Per avviare il servizio FirewallD e abilitarlo al tipo di avvio:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Lavorare con le zone di Firewalld

Dopo aver abilitato il servizio FirewallD per la prima volta, la zona public viene impostata come zona predefinita. È possibile visualizzare la zona predefinita digitando:

sudo firewall-cmd --get-default-zone
public

Per ottenere un elenco di tutte le zone disponibili, digitare:

sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Per impostazione predefinita, a tutte le interfacce di rete viene assegnata la zona predefinita. Per verificare quali zone sono utilizzate dal tuo tipo di interfaccia di rete:

sudo firewall-cmd --get-active-zones
public
  interfaces: eth0 eth1

L'output sopra ci dice che entrambe le interfacce eth0 e eth1 sono assegnate alla zona pubblica.

È possibile stampare le impostazioni di configurazione della zona con:

sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Dall'output sopra, possiamo vedere che la zona pubblica è attiva e impostata come predefinita, usata da entrambe le interfacce eth0 e eth1. Inoltre, sono consentite le connessioni relative al client DHCP e SSH.

Se si desidera verificare le configurazioni di tutte le zone disponibili digitare:

sudo firewall-cmd --list-all-zones

Il comando stampa un enorme elenco con le impostazioni di tutte le zone disponibili.

Modificare la zona di un'interfaccia

È possibile modificare facilmente la zona di interfaccia utilizzando l'opzione --zone in combinazione con l'opzione --change-interface. Il comando seguente assegnerà l'interfaccia eth1 alla zona di lavoro:

sudo firewall-cmd --zone=work --change-interface=eth1

Verifica le modifiche digitando:

sudo firewall-cmd --get-active-zones
work
  interfaces: eth1
public
  interfaces: eth0

Modificare la zona predefinita

Per modificare la zona predefinita, utilizzare l'opzione --set-default-zone seguita dal nome della zona che si desidera impostare come predefinita.

Ad esempio, per modificare la zona predefinita in home è necessario eseguire il comando seguente:

sudo firewall-cmd --set-default-zone=home

Verifica le modifiche con:

sudo firewall-cmd --get-default-zone
home

Aperire una porto o un servizio

Con FirewallD puoi consentire il traffico per porte specifiche in base a regole predefinite chiamate servizi.

Per ottenere un elenco di tutti i servizi disponibili predefiniti digitare:

sudo firewall-cmd --get-services
....
ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex plexmediaserver pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client
....

Puoi trovare ulteriori informazioni su ciascun servizio aprendo il file .xml associato all'interno della directory /usr/lib/firewalld/services. Ad esempio, il servizio HTTP è definito in questo modo:

Per consentire il traffico HTTP in entrata (porta 80) per le interfacce nell'area pubblica, solo per la sessione corrente (configurazione runtime) digitare:

sudo firewall-cmd --zone=public --add-service=http

Se si sta modificando la zona predefinita, è possibile escludere l'opzione --zone.

Per verificare che il servizio sia stato aggiunto correttamente, utilizzare l'opzione --list-services:

sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http

Se si desidera mantenere aperta la porta 80 dopo il riavvio, è necessario digitare nuovamente lo stesso comando, ma questa volta con l'opzione --permanent:

sudo firewall-cmd --permanent --zone=public --add-service=http

Utilizzare --list-services insieme all'opzione --permanent per verificare le modifiche:

sudo firewall-cmd --permanent --zone=public --list-services
ssh dhcpv6-client http

La sintassi per la rimozione del servizio è la stessa di quando si aggiunge un servizio. Basta usare --remove-service invece dell'opzione --add-service:

sudo firewall-cmd --zone=public --remove-service=http --permanent

Il comando sopra rimuove il servizio http dalla configurazione permanente della zona pubblica.

Cosa succede se si esegue un'applicazione come Plex Media Server per la quale non è disponibile un servizio appropriato?

In situazioni come queste, hai due opzioni. È possibile aprire le porte appropriate o definire un nuovo servizio FirewallD.

Ad esempio, il server Plex è in ascolto sulla porta 32400 e utilizza TCP, per aprire la porta nell'area pubblica per la sessione corrente utilizzare l'opzione --add-port=:

sudo firewall-cmd --zone=public --add-port=32400/tcp

I protocolli possono essere tcp o udp.

Per verificare che la porta sia stata aggiunta correttamente utilizzare l'opzione --list-ports:

sudo firewall-cmd --zone=public --list-ports
32400/tcp

Per mantenere la porta 32400 aperta dopo il riavvio, aggiungere la regola alle impostazioni permanenti eseguendo lo stesso comando utilizzando l'opzione --permanent.

La sintassi per la rimozione di una porta è la stessa di quando si aggiunge una porta. Basta usare --remove-port invece dell'opzione --add-port.

sudo firewall-cmd --zone=public --remove-port=32400/tcp

Creare un nuovo servizio FirewallD

Come abbiamo già detto, i servizi predefiniti sono memorizzati nella directory /usr/lib/firewalld/services. Il modo più semplice per creare un nuovo servizio è copiare un file di servizio esistente nella directory /etc/firewalld/services, che è il percorso per i servizi creati dall'utente e modificare le impostazioni del file.

Ad esempio, per creare una definizione di servizio per Plex Media Server possiamo usare il file di servizio SSH:

sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml

Aprire il file plexmediaserver.xml appena creato e modificare il nome breve e la descrizione per il servizio all'interno dei tag <short> e <description>. Il tag più importante che è necessario modificare è il tag port, che definisce il numero di porta e il protocollo che si desidera aprire.

Nel seguente esempio, stiamo aprendo le porte 1900 UDP e 32400 TCP.

sudo vi /etc/firewalld/services/plexmediaserver.xml

Modificare il file in questo modo:

<?xml version="1.0" encoding="utf-8"?>
<service version="1.0">
<short>plexmediaserver</short>
<description>Plex is a streaming media server that brings all your video, music and photo collections together and stream them to your devices at anytime and from anywhere.</description>
<port protocol="udp" port="1900"/>
<port protocol="tcp" port="32400"/>
</service>

Salvare il file e e chiudere il file.

Ricaricare il servizio FirewallD:

sudo firewall-cmd --reload

Ora puoi utilizzare il servizio plexmediaserver nelle tue zone come qualsiasi altro servizio.

Porta di inoltro con Firewalld

Per inoltrare il traffico da una porta a un'altra porta o indirizzo, abilitare innanzitutto il mascheramento per la zona desiderata utilizzando lo switch --add-masquerade. Ad esempio per abilitare il mascheramento per il tipo external di zona:

sudo firewall-cmd --zone=external --add-masquerade
  • Inoltrare il traffico da una porta all'altra sullo stesso server

Nel seguente esempio stiamo inoltrando il traffico da porta 80 a porta 8080 sullo stesso server:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
  • Inoltrare il traffico a un altro server

Nel seguente esempio stiamo inoltrando il traffico da porta 80 a porta 80 su un server con IP 10.12.12.22:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.12.12.22
  • Inoltrare il traffico a un altro server su una porta diversa

Nel seguente esempio stiamo inoltrando il traffico da porta 80 a porta 8080 su un server con IP 10.12.12.22:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.12.12.22

Se vuoi rendere permanente l'inoltro, aggiungi l' --permanentopzione.

Creare un set di regole con FirewallD

Nel seguente esempio, mostreremo come configurare il firewall se si esegue un server Web. Supponiamo che il tuo server abbia una sola interfaccia eth0 e tu desideri consentire il traffico in entrata solo su porte SSH, HTTP e HTTPS.

  • Cambia la zona predefinita in dmz.

Useremo la zona dmz (demilitarizzata) perché di default consente solo il traffico SSH. Per modificare la zona predefinita in dmz e assegnarla all'interfaccia eth0, eseguire i comandi seguenti:

sudo firewall-cmd --set-default-zone=dmz
  • Apri le porte HTTP e HTTPS:

Per aprire le porte HTTP e HTTPS aggiungere regole di servizio permanenti alla zona dmz:

sudo firewall-cmd --permanent --zone=dmz --add-service=http

Rendi effettive le modifiche immediatamente ricaricando il firewall:

sudo firewall-cmd --reload
  • Verifica le modifiche

Per verificare il tipo di impostazioni di configurazione della zona dmz:

sudo firewall-cmd --zone=dmz --list-all
dmz (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http https
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

L'output sopra ci dice che il dmz è la zona predefinita, è applicato all'interfaccia eth0 e le porte ssh (22) http (80) e https (443) sono aperte.

Conclusione

Hai imparato a configurare e gestire il servizio FirewallD sul tuo sistema CentOS.

Assicurarsi di consentire tutte le connessioni in entrata necessarie per il corretto funzionamento del sistema, limitando al contempo tutte le connessioni non necessarie.