Hardening RaspbianOS. Il Raspberry Pi in sicurezza.
Tutti i possessori di un Raspberry Pi devono considerare di mettere in sicurezza il loro sistema, a prescindere dall'uso che ne verrà fatto. Un Raspberry Pi esposto su internet per una semplice pagina web potrebbe essere un punto di accesso per i malintenzionati al nostro sistema, e quindi alla nostra rete LAN, dalla quale possono utilizzare il nostro IP per lanciare degli attacchi verso altri sistemi. Vediamo come limitare al minimo queste possibilità con l'articolo sull'hardening di RaspbianOS per Raspberry Pi!
Prerequisiti
- Raspberry Pi, ora siamo alla 4B ma la procedura è la stessa per tutte.
- RaspbianOS installato e configurato.
- Connessione SSH tramite terminale (Linux/MacOS) o Putty (Windows)
Cambiare l'utente di default
Per questioni di sicurezza creiamo un nuovo utente con il nome che preferiamo, assegniamolo al gruppo 'sudo' e cambiamogli la password:
# adduser nomeUtente
# adduser nomeUtente sudo
# passwd nomeUtente
Apriamo una nuova sessione di Putty con il nuovo utente e cancelliamo l'utente 'pi':
# deluser -remove-home pi
Provate a ri-loggarvi con l'utente 'pi', non dovreste riuscirci.
Configurare SSH
SSH (Secure Shell) è un protocollo di comunicazione cifrata tramite riga di comando (CLI) tra due host in rete. Per stabilire la connessione sono sufficienti il nome utente e la rispettiva password.
Creiamo una copia di backup e modifichiamo il file /etc/ssh/sshd_config:
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bck
# nano /etc/ssh/sshd_config
Modificate le seguenti righe inserendo il vostro nome utente:
AllowUsers nomeUtente
PermitEmptyPasswords no
PermitRootLogin no
MaxAuthTries 2
MaxSessions 2
Protocol 2
ClientAliveInterval 180
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
TCPKeepAlive no
Compression delayed
ClientAliveCountMax 2
ChallengeResponseAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
Riavviate il servizio:
# systemctl restart sshd.service
Questa è la configurazione minima da applicare al servizio SSH. Se volete dare un ulteriore livello di sicurezza conviene utilizzare solo il login tramite doppia chiave crittografata (pubblica + privata). Con questo tipo di sicurezza nessuno potrà effettuare il login senza avere la vostra chiave privata.
SSH Passwordless
Per fare questo bisogna per prima cosa generare le chiavi pubblica e privata:
# cd ~/.ssh
# ssh-keygen
Salvate le chiavi nella stessa directory e (OPZIONALE) assegnate una password per criptare le chiavi. Nel caso dovessero rubarvi la chiave non potranno decifrarla senza password. E' un'ulteriore sicurezza.
Avrete due nuovi file nella directory: id_rsa e id_rsa_pub. Il primo file andrà copiato nel dispositivo dalla quale volete collegarvi al Raspberry Pi, il secondo file bisogna rinominarlo ed assegnare i permessi come segue (sostituendo a 'pi' il vostro nome utente):
# mv ~/.ssh/id_rsa_pub ~/.ssh/authorized_keys
# chmod 644 ~/.ssh/authorized_keys
# chown pi:pi ~/.ssh/authorized_keys
Come ultima cosa bisogna copiare la chiave privata (id_rsa) sul dispositivo che vogliamo usare per collegarci al Raspberry Pi. Mi raccomando si tratta di una chiave PRIVATA, nessuno a parte voi dovete possedere questo file. Non azzardatevi a spostarla sui dispositivi tramite mail, drive o altri mezzi di trasporto. Spostatela solo in locale tramite penne USB, Hard Disk, Samba o quello che avete a vostra disposizione.
A seconda di quale dispositivo utilizzate per collegarvi al vostro Raspberry Pi tramite SSH ci sono procedure differenti. Putty per esempio non supporta le chiavi id_rsa e questa deve essere convertita in un file .ppk tramite PuttyGen (ci sono diverse guide online, Google It!).
Un altro sistema Linux richiede di avere il file id_rsa all'interno della cartella ~/.ssh. Lanciando il comando ssh@IP_RASPBERRYPI avrete questa situazione:
Ora bisogna modificare il file di configurazione di SSH per obbligare l'utilizzo di chiavi crittografate e non la password utente. Per fare questo modificate il file /etc/ssh/sshd_config modificando queste righe:
PubkeyAuthentication yes
PasswordAuthentication no
Salvate e riavviate il servizio con:
# systemctl restart sshd.service
Provando a collegarvi tramite user e password il Raspberry Pi rifiuterà la connessione.
Abilitare la password per sudo
Avrete notato che tutti i comandi che lanciate tramite 'sudo' vengono eseguiti senza la richiesta di una password. Ebbene il comando 'sudo' significa "Superuser do". Chiunque esegua dei comandi con il comando 'sudo' avrà gli stessi privilegi dell'utente 'root', ma senza che gli venga chiesta alcuna password.
Per abilitare la password modificare il seguente file:
# nano /etc/sudoers.d/010_pi-nopasswd
Con questa riga, sostituendo a nomeUtente il nome del vostro utente:
nomeUtente ALL=(ALL) NOPASSWD: ALL
Installare un firewall
Per chi non ha mai configurato un firewall questa potrebbe essere un'operazione delicata. Un firewall configurato in maniera non corretta potrebbe essere totalmente inutile, forse peggio. Per questo vi darà un'infarinatura ma troverete delle guide molto esaustive su Internet. Google It!
IPTables è un software utilizzato per il controllo e la manipolazione dei pacchetti. Tramite questi comandi è possibile decidere cosa potrà o non potrà fare un pacchetto da e per il nostro Raspberry Pi.
Iniziamo a capirne il funzionamento lanciando il seguente comando:
# iptables -L
Vedremo stampate a video le seguenti righe:
Questo significa che attualmente il nostro Raspberry Pi ha tre catene (chain) configurate, quelle di default, e tutte 3 accettano qualsiasi connessione (policy ACCEPT).
- La catena INPUT è riferita alle connessioni ENTRANTI quindi ad esempio una connessione SSH al terminale oppure una richiesta di una pagina web.
- La catena FORWARD è riferita ad i pacchetti che ATTRAVERSANO il nostro Raspberrypi; ad esempio utilizzando il Raspberry come server VPN o PROXY.
- La catena OUTPUT è riferita alle connessioni USCENTI quindi ad esempio la navigazione web o l'invio di posta elettronica.
E' bene rimarcare che IPTables ha un funzionamento di tipo "First match win" ovvero la prima regola che corrisponde vince.
Vediamo allora una configurazione base:
# Blocco eventuali IP di comprovate intenzioni malevoli, i primi che verranno analizzati
iptables -A INPUT -s vvv.xxx.yyy.zzz -j DROP
# Accetto tutte le connessioni già stabilite e correlate
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accetto tutto dalla mia rete LAN
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
# Accetto tutto dalla interfaccia di loopback
iptables -A INPUT -i lo -j ACCEPT
# Accetto connessioni SSH solo da un IP fidato
iptables -A INPUT -i eth0 -p tcp -s aaa.bbb.ccc.ddd --dport 22 -j ACCEPT
# Accetto connessioni HTTP/S da tutti (web server esposto)
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
# Blocco l'invio di mail, qualora non vi servisse
iptables -A OUTPUT -o eth0 -p tcp --dport 25 -j DROP
# Log dei pacchetti
iptables -I INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables: " --log-level 7
# Imposto le policy di default, le ultime che verranno analizzate
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
Provate a dare nuovamente il seguente comando ed osservate il risultato:
# iptables -L
Per analizzare i log:
# tail -f /var/log/syslog | grep "iptables"
Bada che al momento del riavvio del Raspberry Pi le regole IPTables verranno cancellate, è bene inserirle in uno script che le ricarichi al riavvio.
Ovviamente le regole da impostare per una macchina esposta sono molto più articolate. E' necessario bloccare spoofing, DDos e molto altro ma uscirà un articolo dedicato.
Installare Fail2Ban per prevenire attacchi bruteforce
Fail2Ban è un software di analisi dei file di log per prevenire attacchi bruteforce verso il nostro server. Qualora Fail2Ban riscontrasse un tentativo di forza bruta si combinerà con IPTables per droppare tutte le richieste pervenute da quell'indirizzo IP.
Procediamo con l'installazione:
# apt-get install fail2ban
# cd /etc/fail2ban
Ci troveremo all'interno della directory di Fail2Ban, date un comando 'ls -l' e vediamo il contenuto:
- fail2ban.conf: contiene le configurazioni globali del software
- filter.d/*.conf: sono tutti i filtri che specificano, per ogni servizio, come identificare i tentativi di autenticazione
- action.d/*.conf: sono tutte le azioni da eseguire in caso di match del rispettivo filtro
- jail.conf o jail.d/*.conf: contengono le configurazioni per ogni jail.
Le JAIL sono le regole de eseguire per ogni servizio configurato (http, https, ssh ...).
Prendiamo ad esempio la jail ssh, modifichiamo il file /etc/fail2ban/jail.d/jail.local:
[ssh]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 1h
bantime = 24h
Con queste regole indichiamo:
- enabled: che è attiva
- port: che è in ascolto sulla porta 22 (quella di default per SSH)
- filter: il filtro applicato sarà 'sshd'
- logpath: utilizza il file di log '/var/log/auth.log'
- maxretry: concede un massimo di 3 tentativi
- findtime: nell'arco di 1 ora
- bantime: se trova 3 tentativi falliti in 1 ora banna l'IP per 24 ore
Verificate che la configurazione sia corretta, riavviate il servizio e verificate lo stato:
# fail2ban-server -t
OK: configuration test is successful
# systemctl restart fail2ban.service
# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
Per provare il funzionamento mettetevi in ascolto sul file di log di Fail2Ban e sbagliate 3 volte la password SSH:
# tail -f /var/log/fail2ban
Questo è un esempio delle mie JAIL.
Per sbannare l'IP è sufficiente eseguire:
# fail2ban-client set sshd unbanip 192.168.1.x
Analizzeremo nel dettaglio il funzionamento di Fail2Ban in un articolo dedicato.
Conclusioni
Questi sono i passaggi minimi per mettere in sicurezza il nostro Raspberry Pi. Ho deciso di approfondire l'utilizzo di IPTables e Fail2Ban con degli articoli dedicati per via della complessità dei pacchetti.
E voi? L'avete messo in sicurezza il vostro Pi dopo aver letto la guida all'hardening di RaspbianOS per Raspberry Pi?