Mettiamo in sicurezza il server BigBlueButton
Perché proteggere il servizio BigBlueButton?
L’installazione di un server BigBiueButton richiede, come noto, un host dedicato e spesso si predilige la funzionalità alla sicurezza. Proprio per motivi di debug del servizio e per raggiungere rapidamente la messa in produzione si preferisce installare il pacchetto tramite script (bbb-install.sh) senza strumenti di sicurezza.
Questo può alla lunga esporre il servizio agli attacchi brute force e ai portscan che regolarmente bersagliano questi tipi di sistemi. Ecco che ci vengono incontro le solite best practice arcinote sui sistemi Linux.
- Installare un firewall
- Installare fail2ban
- Installare un sistema di monitoraggio delle risorse di sistema e di rete
Installazione del firewall UFW direttamente con BigBlueButton
Lo script utilizzato è https://github.com/bigbluebutton/bbb-install
Abbiamo visto la potenza di questo script per la procedura di installazione e oggi aggiungiamo un’opzione al processo (-w), che permette di installare automaticamente ufw e impostare le rules minime necessarie.
# wget -qO- https://ubuntu.bigbluebutton.org/bbb-install.sh | bash -s -- -w -a -v xenial-22 -s bbb.example.com -e info@example.com -g
-w installa sul sistema UFW (Uncomplicated Firewall) che restringe gli accessi alle porte necessarie 22, 80, e 443, oltre alle porte UDP nell’intervallo 16384-32768,
Se vogliamo vedere le regole impostate possiamo usare il comando:
# ufw status verbose
Stato: attivo
Registrazione: on (low)
Predefinito: deny (in entrata), allow (in uscita), deny (instradato)
Nuovi profili: skip
A Azione Da
ufw allow 22/tcp
ufw allow 443/tcp
ufw allow 80/tcp
ufw allow 16384:32768/udp
Approfondiamo l’utilizzo del firewall UFW
Visto che questo intuitivo sistema di gestione del firewalling è attivo è bene prenderci un po’ di confidenza, imparando almeno la sua logica ed i comandi essenziali per personalizzare lòe regole ed irrobustire la sicurezza per nostro sistema:
Per prima cosa notiamo che con il comando precedente possiamo vedere quale sia la politica di default applicata, questo è essenziale per capire come funziona il nostro firewall e come vadano inserite le regole successive.
# ufw status verbose
Stato: attivo
Registrazione: on (low)
Predefinito: deny (in entrata), allow (in uscita), deny (instradato)
Lo stato è attivo, la registrazione su log è attiva e la politica è quella normalmente di default che prevede di consentire (allow) il traffico in uscita e bloccare (deny) quello in ingresso e in forward (routed). Si può scegliere di cambiare queste politiche, ma per installazioni standard, in cui vogliamo proteggere il servizio BigBlueButton è bene non farlo.
Nel caso comunque è abbastanza semplice modificare queste politiche. Ma attenzione, farlo può avere conseguenze sulle funzionalità del vostro sistema, potete usare l’opzione –dry-run per fare delle prove.
ufw [--dry-run] default allow|deny|reject [incoming|outgoing|routed]
Vediamo invece alcuni comandi che è bene conoscere:
# ufw enable - carica le regole e abilita il firewall al boot
# ufw disable - scarica le regole e disabilita il firewall al boot
# ufw reload - ricarica le regole del firewall
Per limitare l’uso della porta ssh è bene consentire l’accesso al servizio solo a singoli IP o a segmenti di rete affidabili:
# ufw allow from 192.168.1.0/24 to any port 22
# ufw allow from 172.1.1 to any port 22
Verifichiamo lo status delle regole del nostro firewall stampandolo con il numero associato ad ogni regola.
# ufw status numbered
Stato: attivo
A Azione Da
- ------ --
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 443/tcp ALLOW IN Anywhere
[ 3] 80/tcp ALLOW IN Anywhere
[ 4] 16384:32768/udp ALLOW IN Anywhere
[ 5] 22 ALLOW IN 192.168.1.0/24
[ 6] 22 ALLOW IN 172.16.1.1
Eliminiamo la regola che accetta l’accesso per tutti sulla porta 22 (ovviamente si rispetta l’ordine delle regole inserite).
# ufw delete 1
Eliminazione:
allow 22/tcp
Procedere con l'operazione (s|n)? s
Regola eliminata
Adesso ricarichiamo il firewall
# ufw reload
e controlliamone lo stato opportunamente modificato (deve essere scompare l’apertura All sulla porta 22)
# ufw status numbered
A Azione Da
- ------ --
[ 1] 443/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 16384:32768/udp ALLOW IN Anywhere
[ 4] 22 ALLOW IN 192.168.1.0/24
[ 5] 22 ALLOW IN 172.16.1.1
Parte fondamentale della gestione di un firewall è rappresentata dall’analisi dei log, che permette un debug approfondito del suo comportamento, specie in cui effettui blocchi indesiderati.
# ufw logging on Registrazione abilitata
A questo punto possiamo aprire una console e leggere i log
# tail -f /var/log/ufw.log Mar 8 12:43:05 bbb kernel: [1863799.215835] [UFW BLOCK] IN=ens192 OUT= MAC=00:0c:29:e6:4d:fb:00:18:0a:85:e9:e4:08:00 SRC=213.163.86.194 DST=192.168.100.16 LEN=48 TOS=0x00 PREC=0x00 TTL=238 ID=29919 PROTO=UDP SPT=50013 DPT=3478 LEN=28 Mar 8 12:43:05 bbb kernel: [1863799.225868] [UFW BLOCK] IN=ens192 OUT= MAC=00:0c:29:e6:4d:fb:00:18:0a:85:e9:e4:08:00 SRC=213.163.86.194 DST=192.168.100.16 LEN=48 TOS=0x00 PREC=0x00 TTL=238 ID=11857 PROTO=UDP SPT=50013 DPT=3478 LEN=28
La sintassi di questo file di log è comune a tutti i firewall ed è abbastanza intuitiva, ci dice quale IP e quale porta viene bloccata, permettendo di adeguare al configurazione.
Se volete analizzare lo stato del firewall e la configurazione fatta con iptables, attraverso l’interfaccia ufw, si può utilizzare il comando ufw show:
# ufw show [REPORTS] --> mostra le regole di iptables pilotate tramite ufw
raw
builtins
before-rules
user-rules
after-rules
logging-rules
listening
added
Ad esempio se volessimo stampare a video le user-rules (regole utente):
# ufw show user-rules
IPV4 (user):
Chain ufw-user-input (1 references)
pkts bytes target prot opt in out source destination
159 9432 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
586 31024 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 524 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 16384:32768
0 0 ACCEPT tcp -- * * 192.168.1.0/24 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 172.16.1.1 0.0.0.0/0 tcp dpt:22
Chain ufw-user-forward (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-user-output (1 references)
pkts bytes target prot opt in out source destination
Chain ufw-user-limit-accept (0 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain ufw-user-limit (0 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 5 LOG flags 0 level 4 prefix "[UFW LIMIT BLOCK] "
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Installiamo e configuriamo fail2ban
Non esistono delle jail di fail2ban create apposta per il servizio BigBlueButton, ma con un po’ di fantasia si possono adattare quelle già presenti. Ovviamente le jail vanno create in base alla configurazione del nostro firewall. Diciamo che per un setup standard è bene attivare le seguenti jail:
# pico /etc/fail2ban/jail.d/defaults-debian.conf
[sshd]
enabled = true
[recidive]
enabled = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
[portsentry]
enabled = true
Solo la jail di portsentry richiede l’installazione di software aggiuntivo, a cui abbiamo già dedicato un articolo. In realtà, oltre alle jail di nginx, che a poco servono perchè non integrate con il sistema di autenticazione di BigBlueButton, quella che invece è bene attivare è freeswitch.
Non essendo presente di default e con i path sbagliati per l’installazione del servizio e bene configurarla singolarmente:
# pico /etc/fail2ban/freeswich.local
[freeswitch]
enabled = true
# use freeswitch installed by bbb-install.sh
logpath = /opt/freeswitch/log/freeswitch.log
# we do not want mail, so remove that action from standard jail.conf freeswitch config
action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
%(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp]
Riavviamo il serfvizio
# systemctl reload fail2ban
E controlliamone lo status.
# fail2ban-client status
Status
|- Number of jail: 6
`- Jail list: freeswitch, nginx-botsearch, nginx-http-auth, portsentry, recidive, sshd
Possiamo vedere come la dimensione del file freeswitch.log scenda sensibilmente dopo l’attivazione del jail.
installare un sistema di monitoraggio delle risorse di sistema e di rete
Per la configurazione del monitoraggio delle risorse, della banda e degli attacchi al sistema rimandiamo alla lettura di questo precedente articolo.
Risorse
https://markus.heberling.net/2020/04/22/configuring-fail2ban-for-freeswitch-on-bigbluebutton/