Linux Tutorial – Puntata 30

di jolek78

Care/i fruitrici e fruitori del blog, in questi post – ogni domenica mattina – si parlerà del sistema operativo GNU/Linux e degli strumenti per utilizzarlo al massimo delle potenzialità. Cercheremo di spiegare come funziona, cosa è il kernel, come costruirsi una vpn, come settare un firewall e giocare col terminale, usare adb e altro. Se il capitalismo della sorveglianza ci vuole passivi consumatori-consumatrici di servizi noi si risponde con un po’ di “cultura informatica” e un MARAMEO (quasi affettuoso). Buona lettura!

Devo dire che questa settimana non ho avuto molto tempo a disposizione, ma nonostante tutto, di tanto in tanto, riguardavo a che punto siamo arrivati col tutorial. Questa è soltanto la puntata 30 e obiettivamente mi sembra di non aver parlato di nulla d’importante ancora. Una delle cose che proprio vanno trattate è l’utilizzo del firewall su Linux. L’abbiamo usato varie volte nelle scorse puntate, in particolare quando abbiamo settato le connessioni, e quando abbiamo modificato la porta di default per ssh. Un firewall è molto banalmente una sorta di dogana che controlla gli ingressi e le uscite da una macchina all’altra. Semplice e noioso nel concetto, più interessante nella sua esecuzione. Quando si parla di firewall in informatica normalmente si intende roba fisica, macchine, hardware, che al loro interno hanno dei settaggi tali da poter controllare tutto, magari dividendo il network in più settori, con diverse regole per ogni vlan. Cisco, giusto per citarne una, è l’azienda leader per la produzione di questo genere di dispositivi. Ma ogni dispositivo ha la possibilità di avere un firewall, o detto in italiano “muro di fuoco”, che impone l’alt a chi o cosa non ha il permesso di entrare o uscire.

Iptables – Nftables – Ufw

Su Linux il firewall più popolare è iptables e, nel tempo, sarà completamente sostituito da un altro chiamato nftables. La scelta dunque è ardua: parlare di iptables che è ancora il firewall “de facto” per Linux, ma che verrà completamente dismesso nei prossimi anni, o di nftables che è il presente/futuro dei firewall su Linux? Ho preso una tazza di caffè, il mio ukulele, ed ho pensato “qual’e’ il firewall di default installato sulla distribuzione che stiamo utilizzando per il tutorial?” La risposta è stata semplice: iptables. La sua interfaccia di controllo sulla nostra Ubuntu LTS si chiama UFW, ovvero “uncomplicated firewall”. E allora cosa c’e’ di meglio di una cosa “uncomplicated” per partire a settare le porte e il traffico su Linux per un tutorial? Parleremo di nftables il prossimo anno, quando passeremo alla nuova LTS, nftables verrà introdotto finalmente come firewall di default e magari, chissà, UFW sarà modificato per gestire non più le regole di iptables ma quelle di nftables. Accedete la vostra macchina virtuale dunque: si ricomincia.

 Netfilter

Il manuale prima di tutto:

bottega@bottegadelbarbieri  ~  man ufw |head -n 20 
UFW:(8) February 2016 UFW:(8)

NAME
ufw - program for managing a netfilter firewall

DESCRIPTION
This program is for managing a Linux firewall and aims to provide an easy to use interface for the user.

Dunque, netfilter e’ un framework all’interno del kernel Linux che permette letteralmente il filtraggio dei pacchetti da un punto A ad un punto B. Davvero, fatevi un giro sul loro sito perché c’e’ tanto da imparare. UFW è invece un tentativo, ben riuscito a dir la verità, di rendere semplice qualcosa che è strutturalmente molto complesso. Vediamo prima di tutto quali sono sono le regole gia’ attivate

ufw status

Verifichiamo ora lo stato di ufw:

bottega@bottegadelbarbieri  ~  sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To Action From
-- ------ ----
2121/tcp ALLOW IN Anywhere

Come possiamo vedere, l’unica regola che abbiamo aggiunto a quelle di default è quella della porta 2121 per ssh. Ma quali sono le regole di default?

rules

– allow (incoming),
– allow (outgoing),
– disabled (routed)

il che banalmente vuol dire che la macchina virtuale della bottega può accettare tutte le connessioni in ingresso e in uscita. Ma

– 2121/tcp ALLOW IN Anywhere

per quanto riguarda le connessioni ssh, che abbiamo settato nel nostro config_file giusto due settimane fa, accetta connessioni sulla porta 2121. Semplice.

webmin – test

Ora pero’ facciamo una cosa, e come esperimento proviamo a giocare sulla porta 10000. Proviamo a installare un pacchetto interessante, webmin, che permette di gestire molte operazioni di sistema da una semplice pagina web.

bottega@bottegadelbarbieri  ~  sudo apt install software-properties-common apt-transport-https wget 
Reading package lists... Done
Building dependency tree 
Reading state information... Done
wget is already the newest version (1.20.3-1ubuntu1).
software-properties-common is already the newest version (0.98.9.5).
software-properties-common set to manually installed.
The following NEW packages will be installed
apt-transport-https
[...]
bottega@bottegadelbarbieri  ~  wget -q -O- http://www.webmin.com/jcameron-key.asc | sudo apt-key add ; sudo add-apt-repository "deb [arch=amd64] http://download.webmin.com/download/repository sarge contrib"
[...]
bottega@bottegadelbarbieri  ~  sudo apt install webmin 
Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
libauthen-pam-perl libio-pty-perl
The following NEW packages will be installed
libauthen-pam-perl libio-pty-perl webmin
[...]
Unpacking webmin (1.981) ...
Setting up libio-pty-perl (1:1.12-1) ...
Setting up libauthen-pam-perl (0.16-3build7) ...
Setting up webmin (1.981) ...
Webmin install complete. You can now login to https://bottegadelbarbieri:10000/

Verifichiamo prima di tutto l’ip della macchina virtuale

bottega@bottegadelbarbieri  ~  ip a s enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:aa:f0:a5 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.27/24 brd 192.168.0.255 scope global dynamic noprefixroute enp0s3
valid_lft 82410sec preferred_lft 82410sec
inet6 fe80::b1b3:b800:e909:56e5/64 scope link noprefixroute 
valid_lft forever preferred_lft forever

e apriamo il nostro browser all’indirizzo: http://192.168.0.27:10000/

Perfetto, funziona tutto. Bella la bottega vista cosi’ vero?

ufw deny

Ora proviamo a bloccare le connessioni sulla porta 10000

bottega@bottegadelbarbieri  ~  sudo ufw deny 10000
Rule added

e poi ricontrolliamo che le rules siano state effettivamente cambiate:

bottega@bottegadelbarbieri  ~  sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To                         Action      From
--                         ------      ----
2121/tcp                   ALLOW IN    Anywhere                  
10000                      DENY IN     Anywhere       <<<<<<<<
Proviamo ora a riconnetterci all’indirizzo: http://192.168.0.27:10000/

et voilà, connessione bloccata. Semplice.

status numbered

Ora elenchiamo le regole in maniera numerata. Il perché di questa scelta ci sarà evidente fra un attimo:

bottega@bottegadelbarbieri  ~  sudo ufw status numbered 
[sudo] password for bottega: 
Status: active
     To                         Action      From
     --                         ------      ----
[ 1] 2121/tcp                   ALLOW IN    Anywhere                  
[ 2] 10000                      DENY IN     Anywhere
ufw delete

Ora rimuoviamo la regola numero 2, ovvero quella che blocca le connessioni in ingresso sulla porta 10000:

bottega@bottegadelbarbieri  ~  sudo ufw delete 2
Deleting:
deny 10000
Proceed with operation (y|n)? y
Rule deleted
bottega@bottegadelbarbieri  ~  sudo ufw status numbered 
Status: active
To Action From
-- ------ ----
[ 1] 2121/tcp ALLOW IN Anywhere

proviamo a riconnetterci

et voilà, connessione attiva.

ufw allow

Ora pero’ una buona idea sarebbe quella di dichiarare, all’interno delle regole, che la porta 10000 sia sempre aperta per connessioni in ingresso.

bottega@bottegadelbarbieri  ~  sudo ufw allow 10000
Rule added

bottega@bottegadelbarbieri  ~  sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
2121/tcp ALLOW IN Anywhere 
10000 ALLOW IN Anywhere

e infatti, giusto per capire meglio anche il funzionamento di questo tool, possiamo vedere che anche all’interno di webmin la regola viene dichiarata ed esplicitata:

ufw allow from 

Ora facciamo in modo che la connessione a bottega sia attivata solo per la mia subnet, cioè la rete interna all’interno della quale ho deciso d’installare la macchina virtuale della bottega:

bottega@bottegadelbarbieri  ~  sudo ufw allow from 192.168.0.0/24
Rule added

bottega@bottegadelbarbieri  ~  sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To Action From
-- ------ ----
2121/tcp ALLOW IN Anywhere 
10000 ALLOW IN Anywhere 
Anywhere ALLOW IN 192.168.0.0/24               <<<<<<<<<<<<<<<<<

perché sapete, la sicurezza non è mai abbastanza.

ufw deny from

E poi facciamo in modo, per esempio, che le connessioni sulla porta 10000 vengano bloccate per l’ip del mio cellulare, che come avreste dovuto capire dal luuungo tutorial per i 30 anni di Linux, è un Nexus5 che monta una Ubuntu Touch:

phablet@ubuntu-phablet:~$ ip a wlan0
Command "wlan0" is unknown, try "ip address help".
phablet@ubuntu-phablet:~$ ip a s wlan0
21: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 8c:3a:e3:72:38:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.26/24 brd 192.168.0.255 scope global wlan0
inet6 fe80::8e3a:e3ff:fe72:3809/64 scope link 
valid_lft forever preferred_lft forever

Quindi:

bottega@bottegadelbarbieri  ~  sudo ufw deny from 192.168.0.26 to any port 10000
Rule added

bottega@bottegadelbarbieri  ~  sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To Action From
-- ------ ----
2121/tcp ALLOW IN Anywhere 
10000 ALLOW IN Anywhere 
Anywhere ALLOW IN 192.168.0.0/24 
10000 DENY IN 192.168.0.26     <<<<<<<<<<<<<<<<<<<

Piccolo test:

Connessione bloccata come da programma.

as a service

Trattiamo ora ufw come un servizio gestito da systemd. In questo modo creeremo un link simbolico e ci assicureremo che il servizio parta all’avvio della nostra macchina virtuale, senza bisogno di preoccuparsene più in seguito. Disabilitiamo ufw:

bottega@bottegadelbarbieri  ~  sudo ufw disable
Firewall stopped and disabled on system startup

Ed ora abilitiamolo da systemd:

bottega@bottegadelbarbieri  ~  sudo systemctl enable ufw
Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ufw

bottega@bottegadelbarbieri  ~  sudo systemctl start ufw

bottega@bottegadelbarbieri  ~  sudo systemctl status ufw
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
Active: active  since Sat 2021-10-16 10:38:53 BST; 7s ago
Docs: man:ufw(8)
Process: 48560 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
Main PID: 48560 (code=exited, status=0/SUCCESS)

Oct 16 10:38:53 bottegadelbarbieri systemd[1]: Starting Uncomplicated firewall...
Oct 16 10:38:53 bottegadelbarbieri systemd[1]: Finished Uncomplicated firewall.

Di cose da dire ancora ce ne sarebbero tante, e due test in croce come questi servono soltanto a darvi il gusto delle innumerevoli configurazioni possibili. Ergo: a me lo sforzo d’invogliarvi, a voi il piacere d’interessarvi. A proposito: c’e’ una sorpresa in ballo. Aspettate qualche settimana e vedrete…

Alla prossima settimana!
jolek78

>> Indice <<
Puntata 29 < > Puntata 31

Il logo “Tux Linux” e’ stato realizzato e distribuito dall’artista deiby-ybied su Deviantart in licenza Creative Commons BY-NC-SA 3.0

jolek78 on Email
jolek78
Un tizio che pensava di essere uno scienziato. Si ritrovò divulgatore scientifico. Poi si addormentò su un aereo e si risvegliò informatico. Ma era sempre lui.

Lascia un commento

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