Configurare le impostazioni del firewall

By | Agosto 15, 2018

Nota: questo è un obiettivo d’esame RHCSA 7 e un obiettivo d’esame RHCE 7.

Presentazione

Firewalld è la nuova interfaccia userland in RHEL 7. Sostituisce l’interfaccia iptables e si connette al codice del kernel netfilter. Migliora principalmente la gestione delle regole di sicurezza consentendo le modifiche alla configurazione senza interrompere le connessioni correnti.

Per sapere se Firewalld è in esecuzione, digitare:

# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Tue 2014-06-17 11:14:49 CEST; 5 days ago
   ...

o in alternativa:

# firewall-cmd --state
running

Nota: se Firewalld non è in esecuzione, comparirà not running.

Se hai molte interfacce di rete in IPv4, dovrai attivare l’ip forwarding.
Per fare ciò, incolla la seguente riga nel file /etc/sysctl.conf:

net.ipv4.ip_forward = 1

Quindi, attiva la configurazione:

# sysctl -p

Nota: se sei interessato alla configurazione dei parametri del kernel, c’è un tutorial sul comando sysctl.

Sebbene Firewalld sia il modo RHEL 7 per gestire i firewall e offra molti miglioramenti, iptables può ancora essere utilizzato (ma entrambi non dovrebbero essere eseguiti contemporaneamente).

Puoi anche guardare le regole di iptables create da Firewalld con il comando iptables-save.

 

Gestione delle Zone

Inoltre, viene visualizzato un nuovo concetto di zona: tutte le interfacce di rete possono trovarsi nella stessa zona predefinita o divise in diverse in base ai livelli di fiducia definiti. In quest’ultimo caso, questo consente di limitare il traffico in base alla zona di origine (leggi questo articolo su lwn.net per maggiori dettagli).
Nota: senza alcuna configurazione, tutto viene eseguito di default nella zona pubblica (public). Se hai più di un’interfaccia di rete o source, sarai in grado di limitare il traffico tra le zone.

Per ottenere la zona predefinita, digitare:

# firewall-cmd --get-default-zone
public

Per ottenere l’elenco delle zone in cui sono state assegnate le interfacce di rete o le origini, digitare:

# firewall-cmd --get-active-zones
public
  interfaces: eth0

Nota: puoi avere più di una zona attiva alla volta.

Per ottenere l’elenco di tutte le zone disponibili, digitare:

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

Per cambiare la zona predefinita home in modo permanente, digita:

# firewall-cmd --set-default-zone=home
success

Nota: questa informazione è memorizzata nel file /etc/firewalld/firewalld.conf.

Le interfacce di rete possono essere assegnate a una zona in modo permanente.
Per assegnare in modo permanente l’interfaccia di rete eth0 alla zona interna (un file chiamato internal.xml viene creato nella directory /etc/firewalld/zone), digitare:

# firewall-cmd --permanent --zone=internal --change-interface=eth0
success
# nmcli con show | grep eth0
System eth0  4de55c95-2368-429b-be65-8f7b1a357e3f  802-3-ethernet  eth0
# nmcli con mod "System eth0" connection.zone internal
# nmcli con up "System eth0"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/1)

Nota 1: questa operazione può essere eseguita anche modificando il file /etc/sysconfig/network-scripts/ifcfg-eth0 e aggiungendo ZONE=internal seguito da # nmcli con reload
Nota 2: ulteriori informazioni sul comando nmcli sono disponibili nella pagina dedicata a nmcli o alla pagina di configurazione IPV4.
Nota3: La release RHEL 7.3 migliora il modo in cui Firewalld gestisce le zone (v0.3.9 -> v0.4.3.2: BZ # 1302802).

Per sapere quale zona è associata all’interfaccia eth0, digita:

# firewall-cmd --get-zone-of-interface=eth0
internal

Per ottenere la configurazione permanente (permanent) della zona pubblica (public), digitare:

# firewall-cmd --permanent --zone=public --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:

È anche possibile creare nuove zone. Per creare una nuova zona (qui test), digita:

# firewall-cmd --permanent --new-zone=test
success
# firewall-cmd --reload
success

Nota: è possibile creare solo zone permanenti.

Source Management

Una zona può essere collegata a un’interfaccia di rete (vedere sopra) e/o a un indirizzamento di rete (chiamato qui una source).
Qualsiasi pacchetto di rete che entra nello stack di rete è associato a una zona.
L’associazione viene eseguita secondo lo schema seguente:
– il pacchetto proviene da una fonte già associata a una zona? (se sì, è associato a questa zona),
– In caso contrario, il pacchetto proviene da un’interfaccia di rete già associata a una zona? (se sì, è associato a questa zona),
– In caso contrario, il pacchetto è associato alla zona predefinita.

In questo modo, è possibile definire più zone anche su un server con una sola interfaccia di rete!

Attenzione: per ottenere questa funzione, Firewalld si affida a NetworkManager (vedi riferimento). Ciò significa che se si intende arrestare NetworkManager per qualsiasi motivo (ad esempio durante la creazione di un host KVM), sarà necessario arrestare Firewalld e utilizzare invece Iptables!
Nota: con la release RHEL 7.3, la robustezza di Firewalld è stata migliorata rispetto a NetworkManager (vedere i dettagli qui).

Per aggiungere una fonte (qui 192.168.2.0/24) a una zona (qui trusted) in modo permanente, digitare:

# firewall-cmd --permanent --zone=trusted --add-source=192.168.2.0/24
success
# firewall-cmd --reload
success

Nota 1: utilizzare l’opzione —remove-source per eliminare una fonte assegnata in precedenza.
Nota 2: utilizzare l’opzione —change-source per spostare l’origine nella nuova zona specificata.
Nota3: se si desidera aggiungere temporaneamente una fonte a una zona, non utilizzare l’opzione —permanent e non ricaricare (reload) la configurazione del firewall. Se si ricarica la configurazione del firewall, questo annullerà tutte le operazioni.
Nota4: è anche possibile apportare alcune modifiche e quando si desidera la nuova configurazione, è necessario che diventi la configurazione permanente con il comando firewall-cmd –runtime-to-permanent .

Con la versione 7.3 di RHEL, è possibile aggiungere una fonte basata su un indirizzo MAC (qui 00:11:22:33:44:55) a una zona (qui trusted) in modo permanente:

firewall-cmd --permanent --zone=trusted --add-source=00:11:22:33:44:55
success
# firewall-cmd --reload
success

Con la versione 7.3 di RHEL, puoi creare un ipset (un insieme di indirizzi IP o reti, vedi sotto) e aggiungere una fonte basata su di esso:

# firewall-cmd --permanent --new-ipset=iplist --type=hash:ip
success
# firewall-cmd --reload
success
# firewall-cmd --ipset=iplist --add-entry=192.168.1.11
success
# firewall-cmd --ipset=iplist --add-entry=192.168.1.12
success
# firewall-cmd --permanent--zone=trusted --add-source=ipset:iplist
success
# firewall-cmd --reload
success

Per ottenere l’elenco delle sorgenti attualmente associate a una zona (qui trusted), digitare:

# firewall-cmd --permanent --zone=trusted --list-sources
192.168.2.0/24 00:11:22:33:44:55 ipset:iplist

Nota: rimuovere l’opzione —permanent se si desidera solo visualizzare le impostazioni temporanee.

Per tenere traccia della configurazione (le zone attive (active) sono zone che hanno un legame con un’interfaccia o una sorgente), digitare:

# firewall-cmd --get-active-zones
public
  interfaces: eth0
trusted
  sources: 192.168.2.0/24

Come esempio della gestione dei sorgenti, supponiamo di voler consentire solo connessioni al tuo server da uno specifico indirizzo IP (qui 1.2.3.4/32).

# firewall-cmd --zone=internal --add-service=ssh --permanent
success
# firewall-cmd --zone=internal --add-source=1.2.3.4/32 --permanent
success
# firewall-cmd --zone=public --remove-service=ssh --permanent
success
# firewall-cmd --reload
success

Fonte: sito Web Serverfault.

Con RHEL 7.3, è disponibile una nuova opzione chiamata —info-zone .
Per ottenere il dettaglio di una zona chiamata public, digitare:

# firewall-cmd --info-zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:

Nota: è anche possibile aggiungere l’opzione —permanent.

Service Management

Dopo aver assegnato ciascuna interfaccia di rete a una zona, è ora possibile aggiungere servizi a ciascuna zona.
Per consentire il servizio http in modo permanente nella zona interna(internal), digitare:

# firewall-cmd --permanent --zone=internal --add-service=http
success
# firewall-cmd --reload
success

Nota 1: digitare —remove-service=http per negare il servizio http.
Nota 2: il comando firewall-cmd –reload è necessario per attivare la modifica. Contrariamente all’opzione –complete-reload, le connessioni attuali non vengono interrotte.
Nota3: se si desidera aggiungere temporaneamente un servizio, non utilizzare l’opzione –permanent e non ricaricare la configurazione del firewall. Se si ricarica (reload) la configurazione del firewall, si annulla (cancel) tutta l’operazione.

Se si desidera aggiungere temporaneamente diversi servizi (qui http, https e dns) allo stesso tempo nella zona interna, digitare:

# firewall-cmd --zone=internal --add-service={http,https,dns}
success

Per ottenere l’elenco dei servizi nella zona predefinita, digitare:

# firewall-cmd --list-services
dhcpv6-client ssh

Nota: per ottenere l’elenco dei servizi in una particolare zona, aggiungere l’opzione –zone=.

Con RHEL 7.3, è disponibile una nuova opzione chiamata –-info-service.
Per ottenere alcune informazioni sul servizio ftp, digitare:

# firewall-cmd --info-service=ftp
ftp
  ports: 21/tcp
  protocols:
  source-ports:
  modules: nf_conntrack_ftp
  destination:

Nota: è anche possibile aggiungere l’opzione –permanent.

Configurazione dei servizi firewall

Con il pacchetto Firewalld, la configurazione del firewall dei servizi principali (ftp, httpd, ecc.) Si trova nella directory /usr/lib/firewalld/services. Ma è ancora possibile aggiungerne di nuovi nella directory /etc/firewalld/services. Inoltre, se i file esistono in entrambe le posizioni per lo stesso servizio, il file nella directory /etc/firewalld/services ha la precedenza.

Ad esempio, è il caso del servizio HAProxy. Non è associata alcuna configurazione del firewall.
Creare /etc/firewalld/services/haproxy.xml e incollare le seguenti righe:

<?xml version="1.0" encoding="utf-8"?>
<service>
 <short>HAProxy</short>
 <description>HAProxy load-balancer</description>
 <port protocol="tcp" port="80"/>
</service>

Nota: è possibile utilizzare il comando firewall-cmd –permanent –new-service=haproxy per creare rapidamente uno scheletro di file di configurazione.

Assegna il contesto SELinux corretto e le autorizzazioni del file al file haproxy.xml:

# cd /etc/firewalld/services
# restorecon haproxy.xml
# chmod 640 haproxy.xml

Aggiungi il servizio HAProxy alla zona predefinita in modo permanente e ricaricare la configurazione del firewall:

# firewall-cmd --permanent --add-service=haproxy
success
# firewall-cmd --reload
success

Nota: secondo Bert Van Vreckem, è possibile andare più rapidamente utilizzando la cronologia dei comandi (vedere i dettagli qui):

# firewall-cmd --add-service=haproxy
success
# firewall-cmd --add-service=haproxy --permanent
success

In RHEL 7.0 (Firewalld v0.3.9.7), ci sono 47 servizi configurati: amanda-client, bacula, bacula-client, dhcp, dhcpv6, dhcpv6-client, dns, ftp, high-availability, http, https, imaps, ipp, ipp-client, ipsec, kerberos, kpasswd, ldap, ldaps, libvirt, libvirt-tls, mdns, mountd, ms-wbt, mysql, nfs, ntp, openvpn, pmcd, pmproxy, pmwebapi, pmwebapis, pop3s, postgresql, proxy-dhcp, radius, rpc-bind, samba, samba-client, smtp, ssh, telnet, tftp, tftp-client, transmission-client, vnc-server, wbem-https.
In RHEL 7.1 (Firewalld v0.3.9.11), il servizio RH-Satellite-6 è stato aggiunto.
In RHEL 7.2 (Firewalld v0.3.9.14), freeipa-ldaps, freeipa-ldap, freeipa-replication, iscsi-target, rsyncd e vdsm sono stati aggiunti..
In RHEL 7.3 (Firewalld v0.4.3.2), i servizi amanda-k5-client, ceph, ceph-mon, docker-registry, dropbox-lansync, imap, kadmin, mosh, pop3, privoxy, ptp, pulseaudio, puppetmaster, sane, smtps, snmp, snmptrap, squid, synergy, syslog, syslog-tls, tinc, tor-socks, xmpp-bosh, xmpp-client, xmpp-local e xmpp-server sono stati aggiunti per un totale di  81 servizi.

Gestione delle porte

La gestione delle porte segue lo stesso modello della gestione dei servizi.

Per consentire temporaneamente la porta 443/tcp nella zona interna, digitare:

# firewall-cmd --zone=internal --add-port=443/tcp
success

Nota 1: per rendere permanente la configurazione, aggiungere l’opzione –permanent e ricaricare la configurazione del firewall.
Nota 2: digitare —remove-port=443/tcp per negare la porta.

Per ottenere l’elenco delle porte attualmente aperte nella zona interna, digitare:

# firewall-cmd --zone=internal --list-ports
443/tcp

Nota: per ottenere l’elenco permanente delle porte permanentemente aperto, aggiungere l’opzione –permanent. Qui, non otterrai nulla.

Regole complete (Rich Rules)

Poiché la sintassi utilizzata dalle regole avanzate è in qualche modo difficile da ricordare, tieni presente il comando man firewalld.richlanguage e la sezione Example alla fine.

Ecco il formato di una regola ricca:

# firewall-cmd --add-rich-rule 'rule ...'

Per consentire tutte le connessioni da 192.168.2.2, digitare:

# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.2" log accept'

Nota 1: l’opzione di registro (log) scrive i pacchetti in arrivo nel file /var/log/messages.
Nota 2: utilizzare l’opzione —remove-rich-rule anziché l’opzione —add-rich-rule se si desidera eliminare una regola già esistente.

Per elencare le regole avanzate impostate nella zona predefinita, digitare:

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="192.168.2.2" log accept

Regole dirette (Direct Rules)

È ancora possibile impostare regole specifiche utilizzando la modalità diretta (direct) (qui per aprire la porta tcp 9000) che bypassa l’interfaccia Firewalld:

# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
success

Nota 1: questo esempio è stato preso in prestito dal blog di Khosro Taraghi.
Nota 2: utilizzare lo stesso comando con —remove-rule anziché —add-rule per eliminare la regola.
Nota3: la configurazione è temporanea tranne se si aggiunge l’opzione —permanent subito dopo l’opzione —direct .
Nota4: non è necessario ricaricare la configurazione del firewall, tutti i comandi sono attivati ​​direttamente.

Per visualizzare tutte le regole dirette aggiunte, digita:

# firewall-cmd --direct --get-all-rules

Nota 1: per informazioni, la configurazione è scritta nel file /etc/firewalld/direct.xml.
Nota 2: le regole dirette non fanno parte degli obiettivi dell’esame RHCSA / RHCE.

Gestione set IP

Con RHEL 7.3 arriva la possibilità di creare ipset. Un ipset è un insieme di indirizzi IP o reti. Le diverse categorie appartengono a hash:ip o hash:net.

Per creare un IPset IPv4 permanente contenente due indirizzi IP e i pacchetti di rilascio provenienti da questi indirizzi, digitare:

# firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
success
# firewall-cmd --reload
success
# firewall-cmd --ipset=blacklist --add-entry=192.168.1.11
success
# firewall-cmd --ipset=blacklist --add-entry=192.168.1.12
success
# firewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
success

Nota: Aggiungi –option=family=inet6 per creare un ipv6 ipset.

Per ottenere il contenuto della lista nera (blacklist) ipset, digitare:

# firewall-cmd --info-ipset=blacklist
blacklist
type: hash:ip
options:
entries: 192.168.1.11 192.168.1.12

Per rimuovere la voce 192.168.1.12 dall’ipset della blacklist, digitare:

# firewall-cmd --ipset=blacklist --remove-entry=192.168.1.12
success
# firewall-cmd --ipset=blacklist --get-entries
192.168.1.11

Per creare un IPset IPv4 permanente contenente due reti, digitare:

# firewall-cmd --permanent --new-ipset=netlist
success
# firewall-cmd --reload
success
# firewall-cmd --ipset=netlist --add-entry=192.168.1.0/24
success
# firewall-cmd --ipset=netlist --add-entry=192.168.2.0/24
success
# firewall-cmd --info-ipset=netlist
netlist
 type: hash:net
 options: 
 entries: 192.168.1.0/24 192.168.2.0/24

Per rimuovere l’ipset netlist, digitare:

# firewall-cmd --permanent --delete-ipset=netlist
success
# firewall-cmd --reload
success
# firewall-cmd --get-ipsets
blacklist

È anche possibile scaricare il contenuto di un ipset da un file (opzione –add-entries-from-file=file) o memorizzarlo con il nome ipset in /etc/firewalld/ipsets/ipset.xml
o /usr/lib/firewalld/ipsets/ipset.xml file in base al seguente formato:

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
  <short>My Ipset</short>
  <description>description</description>
  <entry>192.168.1.11</entry>
  <entry>192.168.1.12</entry>
</ipset>

Per caricare questo ipset, digitare:

# firewall-cmd --reload

masquerading

Se il tuo firewall è anche il tuo gateway di rete e non vuoi che tutti conoscano i tuoi indirizzi interni, puoi impostare due zone, una chiamata interna, l’altra esterna, e configurare il masquerading sulla zona esterna. In questo modo, tutti i pacchetti otterranno il tuo indirizzo IP del firewall come indirizzo sorgente.

Per impostare il masquerading sulla zona esterna in modo temporaneo, digita:

# firewall-cmd --zone=external --add-masquerade
success

Nota 1: per rimuovere il masquerading, utilizzare l’opzione –remove-masquerade.
Nota 2: per sapere se il masquerading è attivo in una zona, utilizzare l’opzione –query-masquerade.
Nota3: per ottenere la configurazione permanente, aggiungere l’opzione –permanent e ricaricare la configurazione del firewall.

Port forwarding

Il port forwarding è un modo per inoltrare il traffico di rete in entrata per una porta specifica verso un altro indirizzo interno o una porta alternativa.

Attenzione: il port forwarding richiede masquerading (source). Questo punto è un errore classico commesso durante l’esame RHCE.

Quindi, è necessario abilitare il masquerading prima di qualsiasi altra cosa:

# firewall-cmd --zone=external --add-masquerade
success

Se si desidera che tutti i pacchetti destinati alla porta 22 vengano ora inoltrati temporaneamente alla porta tcp 3753, digitare:

# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753
success

Nota 1: per rimuovere il port forwarding, utilizzare l’opzione –remove-forward-port.
Nota 2: per sapere se il port forwarding è attivo in una zona, utilizzare l’opzione –query-forward-port.
Nota3: se si desidera rendere permanente la configurazione, aggiungere l’opzione –permanent e ricaricare la configurazione del firewall.

Inoltre, se si desidera definire l’indirizzo IP di destinazione, questa volta in modo permanente, digitare:

# firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=3753:toaddr=10.0.0.1
success
# firewall-cmd --reload
success

Moduli speciali

A volte è necessario scaricare moduli specifici. Invece di usare un file rc.local, è meglio avvisare Firewalld attraverso la directory /etc/modules-load.d.
In questo esempio vogliamo aggiungere i moduli ip_nat_ftp e ip_conntrack_ftp per seguire le connessioni ftp.
Abbiamo solo bisogno di scegliere un nome di file (qui firewall_ftp.conf) e digitare queste istruzioni:

# echo ip_nat_ftp > /etc/modules-load.d/firewall_ftp.conf
# echo ip_conntrack_ftp >> /etc/modules-load.d/firewall_ftp.conf

Fonte: sito Web StackExchange.

Configurazione offline

In alcuni casi (installazioni tramite Anaconda o Kickstart, ad esempio), è necessario impostare le regole del firewall quando Firewalld non è in esecuzione. Il comando firewall-offline-cmd è stato appena creato per questo scopo.
Ad esempio, per aprire la porta tcp 22, devi digitare il file /etc/sysconfig/iptables:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Invece, ora puoi eseguire il seguente comando:

# firewall-offline-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Backup di configurazione

Per memorizzare la configurazione corrente in file, digitare:

# iptables -S > firewalld_rules_ipv4
# ip6tables -S > firewalld_rules_ipv6

Suggerimenti per il debug

Per capire meglio come funziona Firewalld, assegnare il valore ‘–debug‘ alla variabile FIREWALLD_ARGS nel file /etc/sysconfig/firewalld:

# firewalld command line args
# possile values: --debug
FIREWALLD_ARGS='--debug'

Riavvia il daemon Firewalld:

# systemctl restart firewalld

Nota: i messaggi verranno scritti nel file /var/log/firewalld.

Inoltre, con la versione 7.3 di RHEL arriva la direttiva LogDenied nel file /etc/firewalld/firewalld.conf.
Questa direttiva aggiunge le regole di registrazione subito prima del rifiuto e rilascia le regole nelle catene INPUT, FORWARD e OUTPUT per le regole predefinite e anche le regole di rifiuto e rilascio finali nelle zone.
I valori possibili sono: all, unicast, broadcast, multicast e off (valore predefinito).

Ricarica la configurazione di Firewalld:

# firewall-cmd --reload

Nota: i messaggi verranno scritti nel file /var/log/messages. Se vuoi anche che i messaggi vengano scritti in un file chiamato /var/log/custom.log, modifica il file /etc/rsyslog.conf, aggiungi la riga kern.warning /var/log/custom.log e riavvia la configurazione di rsyslog con # systemctl restart rsyslog

Fonti: RHEL7 Security Guide, progetto wiki di Fedora.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.