Come configurare un firewall usando FirewallD su CentOS 7

Introduzione

Firewalld è una soluzione di gestione firewall disponibile per molte distribuzioni Linux che funge da frontend per il sistema di filtraggio dei pacchetti iptables fornito dal kernel Linux. In questa guida, tratteremo come configurare un firewall per il tuo server e ti mostreremo le basi della gestione del firewall con lo strumento di amministrazione firewall-cmd (se preferisci usare iptables con CentOS, segui questa guida).

Nota: è possibile che si stia lavorando con una versione più recente di firewalld di quella disponibile al momento della stesura di questo documento o che il server sia stato impostato in modo leggermente diverso rispetto al server di esempio utilizzato in questa guida. Pertanto, il comportamento di alcuni dei comandi spiegati in questa guida può variare in base alla configurazione specifica.

Concetti di base in Firewalld

Prima di iniziare a parlare di come utilizzare effettivamente l’utility firewall-cmd per gestire la configurazione del firewall, dovremmo familiarizzare con alcuni concetti di base introdotti dallo strumento.

Le Zone

Il demone firewalld gestisce gruppi di regole usando entità chiamate “zone”. Le zone sono fondamentalmente insiemi di regole che stabiliscono quale traffico dovrebbe essere consentito a seconda del livello di fiducia che si ha nelle reti a cui è collegato il computer. Alle interfacce di rete viene assegnata una zona per dettare il comportamento consentito dal firewall.

Per i computer che possono spostarsi frequentemente da una rete all’altra (come i notebook), questo tipo di flessibilità offre un buon metodo per modificare le regole in base all’ambiente. È possibile che siano in vigore regole rigide che vietano la maggior parte del traffico quando si opera su una rete WiFi pubblica, consentendo nel contempo restrizioni più rilassate quando si è connessi alla rete domestica.

Per un server, queste zone non sono così importanti perché l’ambiente di rete cambia raramente, se non mai.

Indipendentemente da quanto possa essere dinamico il tuo ambiente di rete, è comunque utile avere familiarità con l’idea generale alla base di ciascuna delle zone predefinite per firewalld. Nell’ordine dal meno affidabile al più fidato, le zone predefinite all’interno di firewalld sono:

  • drop: il livello più basso di fiducia. Tutte le connessioni in entrata vengono rilasciate senza risposta e solo le connessioni in uscita sono consentite.
  • block: simile a quanto sopra, ma invece di abbandonare semplicemente le connessioni, le richieste in arrivo vengono rifiutate con un messaggio icmp-host-prohibited o con icmp6-adm-prohibited.
  • public: rappresentano le reti pubbliche e non attendibili. Non ti fidi degli altri computer, ma puoi consentire le connessioni in entrata selezionate caso per caso.
  • external: reti esterne nel caso in cui si stia utilizzando il firewall come gateway. È configurato per il masquerading NAT in modo che la rete interna rimanga privata ma raggiungibile.
  • internal: l’altro lato della zona esterna, utilizzato per la parte interna di un gateway. I computer sono abbastanza affidabili e alcuni servizi aggiuntivi sono disponibili.
  • dmz: usato per computer situati in una DMZ (computer isolati che non avranno accesso al resto della rete). Sono consentite solo determinate connessioni in entrata.
  • work: usato per macchine da lavoro. Fidati della maggior parte dei computer nella rete. Potrebbero essere consentiti alcuni altri servizi.
  • home: un ambiente domestico. In genere implica che ti fidi della maggior parte degli altri computer e che alcuni altri servizi saranno accettati.
  • trusted: fidati di tutte le macchine nella rete. La più aperta delle opzioni disponibili e dovrebbe essere usata con parsimonia.

Per utilizzare il firewall, possiamo creare regole e modificare le proprietà delle nostre zone e quindi assegnare le interfacce di rete alle zone più appropriate.

Regole permanenti (Rule Permanence)

In firewalld, le regole possono essere designate come permanenti o immediate. Se viene aggiunta o modificata una regola, per impostazione predefinita viene modificato il comportamento del firewall attualmente in esecuzione. Al prossimo avvio, le vecchie regole verranno ripristinate.

La maggior parte delle operazioni di firewall-cmd può assumere il flag –permanent per indicare che il firewall non-ephemeral deve essere targeted. Ciò influirà sul set di regole che viene ricaricato all’avvio. Questa separazione significa che è possibile testare le regole nell’istanza del firewall attivo e quindi ricaricare se ci sono problemi. Puoi anche utilizzare il flag –permanent per creare un intero set di regole nel tempo che verranno applicate tutte in una volta quando viene emesso il comando di reload.

Installare e abilitare il firewall all’avvio

firewalld è installato di default su alcune distribuzioni Linux, incluse molte immagini di CentOS 7.  Tuttavia, potrebbe essere necessario installare il firewalld manualmente con:

[gidalo@localhost ~]# sudo yum -y install firewalld

Dopo aver installato firewalld, è possibile abilitare il servizio e riavviare il server. Tieni presente che l’attivazione di firewalld farà avviare il servizio all’avvio. È consigliabile creare le regole del firewall e sfruttare l’opportunità per testarle prima di configurare questo comportamento per evitare potenziali problemi

[gidalo@localhost ~]# sudo systemctl enable firewalld
[gidalo@localhost ~]# sudo init 6

Quando il server si è riavviato, il firewall dovrebbe essere attivo, le interfacce di rete devono essere inserite nelle zone configurate (o ricadere nella zona predefinita configurata) e tutte le regole associate alle zone verranno applicate agli associati interfacce.

Possiamo verificare che il servizio sia in esecuzione e raggiungibile digitando:

[gidalo@localhost ~]# sudo firewall-cmd --state

Output:

running

oppure con:

[gidalo@localhost ~]# sudo systemctl status firewalld

Output:

● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-05-30 16:03:21 CEST; 6min ago
     Docs: man:firewalld(1)
 Main PID: 657 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─657 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

May 30 16:03:13 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...

Questo indica che il nostro firewall è attivo e funzionante con la configurazione predefinita.

Esplorazione dei valori predefiniti

Possiamo vedere quale zona è attualmente selezionata come predefinita digitando:

[gidalo@localhost ~]# sudo firewall-cmd --get-default-zone

Output:

public

Dato che non abbiamo dato a firewalld alcun comando per deviare dalla zona predefinita, e nessuna delle nostre interfacce è configurata per collegarsi a un’altra zona, quella zona sarà anche l’unica zona “attiva” (la zona che sta controllando il traffico per il nostro interfacce). Possiamo verificarlo digitando:

[gidalo@localhost ~]# sudo firewall-cmd  --get-active-zones

Output:

public
  interfaces: enp0s3 enp0s8

Qui, possiamo vedere che il nostro server di esempio ha due interfacce di rete controllate dal firewall (enp0s3 e enp0s8). Entrambi sono attualmente gestiti secondo le regole definite per la zona pubblica.

Come facciamo a sapere quali regole sono associate alla zona pubblica? Possiamo visualizzare la configurazione della zona predefinita digitando:

[gidalo@localhost ~]# sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources:
  services: ssh dhcpv6-client http https
  ports: 22/tcp 9600/tcp 9200/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Dall’output possiamo dire che questa zona predefinita è attiva e che le interfacce enp0s3 ed enp0s8 sono associate a questa zona (lo sapevamo già dalle nostre precedenti richieste). Tuttavia, possiamo anche vedere che questa zona consente le normali operazioni associate a un client DHCP (per l’assegnazione dell’indirizzo IP), SSH (per l’amministrazione remota), HTTP e HTTPS(per servizi web) oltre le porte 22 TCP (ssh per l’amministrazione remota), 9600TCP e la 9200TCP (per servizi di Suricata IDS, Elasticsearch, Kibana e Logstash ).

Esplorando le Zone alternative

Ora abbiamo una buona idea sulla configurazione per la zona predefinita e attiva. Possiamo trovare informazioni anche su altre zone.

Per ottenere un elenco delle zone disponibili, digitare:

[gidalo@localhost ~]# sudo firewall-cmd --get-zones

Output:

block dmz drop external home internal public trusted work

Possiamo vedere la configurazione specifica associata a una zona includendo il parametro –zone = nel nostro comando –list-all:

[gidalo@localhost ~]# sudo firewall-cmd --zone=home --list-all

Output:

home
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh mdns samba-client dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

È possibile emettere tutte le definizioni delle zone utilizzando l’opzione –list-all-zones. Probabilmente vorrai visualizzare l’output in una lista per una visualizzazione più semplice:

[gidalo@localhost ~]#sudo firewall-cmd --list-all-zones |less

Output:

block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


dmz
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


drop
  target: DROP
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

ecc.ecc.

Selezione delle zone per  interfacce di rete

A meno che non si siano configurate diversamente le proprie interfacce di rete, ogni interfaccia verrà inserita nella zona predefinita all’avvio del firewall.

Modificare la zona di un’interfaccia di rete

È possibile passare un’interfaccia tra zone durante una sessione utilizzando  “–zone= (parametro)” in combinazione con “–change-interface= (parametro)”. Come con tutti i comandi che modificano il firewall, sarà necessario utilizzare sudo.

Ad esempio, possiamo passare la nostra interfaccia enp0s3 alla zona “home” digitando questo:

[gidalo@localhost ~]# sudo firewall-cmd --zone=home --change-interface=enp0s3

Output:

success

NB: Ogni volta che si sta passando l’interfaccia di rete a una nuova zona, si consapevole che probabilmente stai modificando i servizi che sono attivi. Ad esempio, qui ci spostiamo nella zona “home”, che ha SSH disponibile. Ciò significa che la nostra connessione non dovrebbe cadere. Alcune zone non hanno SSH abilitato per impostazione predefinita e se la connessione viene interrotta mentre si utilizza una di queste zone, potresti non essere in grado di accedere di nuovo.

Possiamo verificare che ciò abbia avuto successo chiedendo di nuovo le zone attive:

[gidalo@localhost ~]# sudo firewall-cmd --get-active-zones

Output:

home
  interfaces: enp0s3
public
  interfaces: enp0s8
Regolazione della zona predefinita

Se tutte le tue interfacce possono essere gestite al meglio da una singola zona, è probabilmente più facile selezionare semplicemente la zona predefinita migliore e quindi utilizzarla per la tua configurazione

È possibile modificare la zona predefinita con “–set-default-zone= (parametro)”. Questo cambierà immediatamente qualsiasi interfaccia che è ritornata sul default alla nuova zona:

[gidalo@localhost ~]# sudo firewall-cmd --set-default-zone=home

Output:

success
Impostazione delle regole per le applicazioni installate

Il modo basilare per definire le eccezioni del firewall per i servizi che desideri rendere disponibili è semplice. Esamineremo l’idea di base qui.

Aggiunta di un servizio alle tue zone

Il metodo più semplice consiste nell’aggiungere i servizi o le porte necessari alle zone che stai utilizzando. Di nuovo, puoi ottenere un elenco dei servizi disponibili con l’opzione “–get-services”:

[gidalo@localhost ~]# sudo firewall-cmd --get-services

Nel mio caso l’output è:

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

NB: È possibile ottenere maggiori dettagli su ciascuno di questi servizi guardando il loro file .xml associato all’interno della directory /usr/lib/firewalld/services. Ad esempio, il servizio SSH è definito in questo modo:

[gidalo@localhost ~]# sudo cat /usr/lib/firewalld/services/ssh.xml


  SSH
  Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
  

È possibile abilitare un servizio per una zona utilizzando “–add-service= (parametro)”. L’operazione avrà come target la zona predefinita o qualsiasi zona specificata da “–zone= (parametro)”. Per impostazione predefinita, questo regolerà solo la sessione corrente del firewall. È possibile regolare la configurazione del firewall permanente includendo il flag “–permanent”.

Per maggiori dettagli vi rimando al sito ufficiale: man-pages firewall-cmd

Per oggi è tutto……comming soon Come migrare da FirewallD a Iptables su CentOS 7

Loading