Torino ITA)
+39 01119115797
info@netpic.it

Mettiamo in sicurezza il server BigBlueButton

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/