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.