Un server Linux sicuro dovrebbe essere l’obbiettivo minimo di ogni amministratore di sistema che punti ad impostare un server in modo che sia quanto più possibile al riparo dagli attacchi informatici più devastanti.
Rendere un server Linux sicuro potrebbe a prima vista sembrare una specie di rompicapo. Destreggiarsi con la sicurezza dei server, pacchetti da installare, Firewall, configurazioni varie e via dicendo potrebbero intimorire e scoraggiare più di qualche amministratore di sistema.
Ma sono certo che la sicurezza dei server è una tematica che chiunque abbia anche solo un minimo di dimestichezza sulla materia può affrontare serenamente; almeno se dispone degli strumenti adeguati. Insomma: la sicurezza dei server Linux non è una prerogativa solo dei Sysadmin più navigati.
Rendere un server linux sicuro, come vedremo tra breve, è più facile a farsi che a dirsi.
Questa breve guida ti accompagnerà passo-passo in una breve procedura per metterti nella condizione di impostare la sicurezza di base del server Linux ad un livello quantomeno accettabile.
Nel redigere questo articolo, ho fatto un piccolo sforzo in più per rendere questa guida applicabile sia per le distribuzioni Debian/Ubuntu e derivate, che per l’altra grande famiglia di distribuzioni GNU Linux; ossia, Fedora/CentOS/RHEL.
1. Per un server Linux sicuro, aggiorna il sistema
La prima cosa da fare subito per proteggere il server è aggiornare immediatamente i repository locali e aggiornare il sistema operativo e le applicazioni installate applicando al sistema le patch più recenti.
Con Ubuntu e Debian
$ sudo apt update && sudo apt upgrade -y
Con Fedora, CentOS, e RHEL
$ sudo dnf upgrade
Aggiornamenti automatici di sicurezza
Oltre ad aggiornare subito il tuo server, può essere di grande aiuto fare in modo che alcuni pacchetti, almeno quelli di sicurezza, si possano aggiornare automaticamente senza l’intervento del Sysadmin.
Niente paura! Se vuoi tenere costantemente aggiornato il tuo server, la cosa più opportuna da fare fin da subito è installare un pacchetto che si prenderà cura di eseguire automaticamente gli aggiornamenti di sicurezza.
Quindi proseguiamo con l’installazione del pacchetto che si occupa proprio di questo problema.
Con Ubuntu e Debian
Il pacchetto in questione è unattended-upgrades
e si installa come segue:
$ sudo apt update && sudo apt install unattended-upgrades -y
Con Fedora, CentOS, o RHEL
Per questa famiglia di distribuzioni, il pacchetto in questione è dnf-automatic
che si installa come segue:
$ sudo dnf install dnf-automatic -y
Da ora in poi dovrai solo dare un’occhiata di tanto in tanto che qualcosa non sia andato storto che richieda il tuo intervento manuale.
2. Crea un nuovo utente privilegiato
Crea un nuovo account per un utente privilegiato. Nessuno dovrebbe mai accedere ad un server con le credenziali di root
.
Crea quindi il un nuovo account, ad esempio: pilot
, e concedi a questo nuovo utente i diritti di sudo
. D’ora in poi usa sempre questo account per accedere al tuo server quando dovrai fare manutenzione.
Crea quindi il nuovo utente pilot
:
Con Ubuntu e Debian
$ sudo adduser -G sudo pilot
Notare che in Debian, Ubuntu e distribuzioni derivate solitamente il gruppo predefinito in /etc/sudoers
è sudo.
Con Fedora, CentOS, o RHEL
$ sudo adduser -G wheel pilot
Notare inoltre che in Fedora, CentOS, RHEL e distribuzioni derivate, a differenza delle altre, il gruppo predefinito in /etc/sudoers
è wheel.
3. Carica la tua chiave SSH nel server
Considerando che è sempre buona regola utilizzare sempre ssh
per accedere al tuo server, sarà ora necessario caricare la chiave SSH del tuo client, quello che utilizzi per accedere al server, utilizzando il comando ssh-copy-id
.
$ ssh-copy-id <username>@<ip_del_server>
Dove ovviamente <username>
è lo user che hai appena creato in uno dei passi precedenti, ad esempio pilot
. Mentre <ip_del_server>
non è altro che l’indirizzo IP del tuo server che stai mettendo in sicurezza.
4. Server linux sicuro con la sicurezza del servizio SSH
Per mettere in sicurezza il servizio ssh
del tuo server dovrai fare qualche semplice modifica al file /etc/ssh/sshd_config
. In particolare, dovrai:
- Disabilitare l’autenticazione con password del servizio ssh;
- Bloccare l’accesso da remoto al servizio ssh con lo user
root
; - Restringere l’accesso IPv4 o IPv6 al servizio ssh.
Abbiamo già affrontato in modo approfondito questo argomento in un precedente post dedicato appunto alla configurazione di ssh per la sicurezza, quindi non mi dilungherò oltre sull’argomento.
5. Un Server Linux sicuro ha sempre il suo Firewall
Una delle regole d’oro del Sysadmin consiste nell’abilitare il firewall interno del sistema il prima possibile, in modo da evitare accessi indesiderati e potenzialmente nocivi.
In questo passaggio procederemo passo-passo con l’installazione, la configurazione e l’abilitazione del firewall interno del sistema. Un Server linux sicuro ha sempre il proprio firewall a bordo attivo e ben configurato; può essere l’ultimo baluardo di difesa, in caso di attacchi informatici devastanti.
Questo passaggio è profondamente diverso tra le distribuzioni basate su Debian (Debian, Ubuntu, Mint, ecc.) da quelle basate su Red Hat (RHEL, Fedora, CentOS, ecc); quindi le sezioni dedicate a queste due famiglie di distribuzioni GNU Linux sono un po’ più corpose e ricche di dettagli.
Installa, configura ed abilita il Firewall di sistema.
Con Ubuntu e Debian
Installa il pacchetto ufw
(Uncomplicated Firewall):
$ sudo apt update && sudo apt install ufw -y
Ora che il firewall ufw
è installato, ma non ancora attivo; esegui la configurazione definendo alcune regole di base per il firewall, come segue:
$ sudo ufw default deny incoming $ sudo ufw default allow outgoing
Poi, abilita il protocollo ssh
per permettere l’accesso al Sysadmin, in modo che possa accedere per gestire il sistema in sicurezza:
$ sudo ufw allow ssh
Infine, se il tuo server espone pagine web sulle porte http
e https
(rispettivamente, porta 80
e 443
), allora dovrai istruire il firewall in modo che accetti connessioni per questi servizi:
$ sudo ufw allow in http $ sudo ufw allow in https
È giunto il momento per abilitare finalmente il firewall:
$ sudo ufw enable
In ultimo; una rapida occhiata alle regole appena impostate:
$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), deny (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6) 80/tcp (v6) ALLOW IN Anywhere (v6) 443/tcp (v6) ALLOW IN Anywhere (v6)
Con Fedora, CentOS, o RHEL
Installa il pacchetto firewalld
(Firewall Daemon):
$ sudo dnf install firewalld -y
Ora che il pacchetto firewalld
è installato (ma non ancora attivo), lo dovrai abilitare.
Ricordati che con le distribuzioni Red Hat non è possibile configurare il firewall se questo non è stato prima attivato; questo ha pro e contro, riguardo alla sicurezza.
Ricorda inoltre che attivare il firewall potrebbe significare interrompere la tua sessione ssh, se sei connesso al server dal tuo client. Quindi è buona regola avere sempre a disposizione una connessione diretta con il server, prima di agire su questa sensibile componente del sistema.
Per abilitare il firewall, usa il seguente comando:
$ sudo systemctl enable --now firewalld
Prima di tutto definisci la zona di default:
$ sudo firewall-cmd --set-default-zone=public
Poi, abilita il protocollo ssh
per permettere l’accesso al Sysadmin, in modo che possa accedere per gestire il sistema in sicurezza:
$ sudo firewall-cmd --zone=public --add-service=ssh --permanent
Infine, come già detto, se il tuo server espone pagine web sulle porte http
e https
(rispettivamente, porta 80
e 443
), allora dovrai istruire il firewall in modo che accetti connessioni per questi servizi:
$ sudo firewall-cmd --zone=public --add-service=http --permanent $ sudo firewall-cmd --zone=public --add-service=https --permanent
Notare che è stato usato l’argomento --permanent
per impostare in modo permanente (appunto) la regola. In caso contrario essa rimarrebbe altrimenti definita solo in memoria, andando pertanto perduta al prossimo riavvio del sistema o del servizio firewalld
.
In ultimo; una rapida occhiata alle regole appena impostate:
$ sudo firewall-cmd --zone=public --list-services dhcpv6-client http https ssh
6. Il tuo server Linux sicuro con Fail2ban
Un altro elemento che contribuisce a rendere il tuo server Linux sicuro è fail2ban.
Fail2ban è un’applicazione estremamente utile per bloccare o mitigare attacchi automatizzati e ripetuti che tentano con la forza bruta (Brute Force) di accedere al sistema, di causare danni occupando tutta la banda di rete disponibile; oppure tenendo occupato il sistema con un effetti negativi sul consumo delle risorse interne.
In buona sostanza, Fail2Ban osserva costantemente i file di log del sistema e quando rileva un tentativo ripetuto di accesso al sistema non andato a buon fine, blocca completamente l’indirizzo IP che sta causando il problema. Trascorso un predeterminato periodo di tempo, il blocco dell’indirizzo IP verrà rimosso automaticamente.
Detto questo; installa, configura ed abilita fail2ban.
Installa fail2ban
Con Ubuntu e Debian
Installa il pacchetto fail2ban
con il seguente comando:
$ sudo apt install fail2ban -y
Con Fedora, CentOS, o RHEL
Installa il pacchetto fail2ban con il seguente comando:
$ sudo dnf install fail2ban -y
Configura, Abilita e Verifica fail2ban
Configura fail2ban
con i valori di default, in modo che non vengano modificati al prossimo aggiornamento del pacchetto.
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Abilita quindi fail2ban
e riavvia il servizio come segue:
$ sudo systemctl enable fail2ban.service $ sudo systemctl restart fail2ban.service
Verifica finale. Se tutto è andato come previsto, è ora il momento di dare un’occhiata allo stato di fail2ban, usando il comando fail2ban-client
come segue:
$ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
Come puoi vedere dal risultato del comando precedente, fail2ban
non ha ancora rilevato nulla. tuttavia nel tempo inizierai a vedere qualche indirizzo IP “bannato” dal demone di fail2ban
.
7. Per un server Linux sicuro, rimuovi i servizi inutilizzati
Durante l’installazione di alcune delle più note e blasonate distribuzioni GNU Linux, può accadere che vengano installati ed attivati nel sistema alcuni servizi e demoni che espongono i propri servizi nella rete.
Molti dei servizi attivi nel sistema sono proprio quelli che ti servono (come ad esempio apache, mysql, ecc.) per erogare i servizi di cui hai bisogno, oppure costituiscono un valido supporto per l’amministrazione del sistema stesso (come ad esempio il servizio ssh
).
Tuttavia, all’interno del sistema possono essere presenti alcuni i servizi non necessari; che potrebbero esporre il sistema a qualche rischio inutile. Questi servizi infatti aprono porte TCP o UDP che possono inutilmente (in quanto non necessari) esporre il sistema ad attacchi o tentativi di accesso fraudolento indesiderati.
Riconoscere ed eliminare i servizi inutili aiuta a mantenere il tuo server Linux sicuro e mitigare alcuni dei cyber attacchi più pericolosi.
Puoi esplorare tutti i servizi di rete attualmente attivi e che espongono il sistema nella rete con il comando ss
, di cui ti riporto un esempio qui di seguito:
$ sudo ss -atpu
Il comando ss
produrrà un output simile a quello riportato qui sotto, il quale è ovviamente solo un esempio generico preso da uno dei sistemi di laboratorio per lo scopo di questa guida. L’output prodotto dal tuo sistema potrebbe essere sostanzialmente diverso da questo; ciò in virtù del fatto che i servizi attivi sono diversi da sistema a sistema e dipendono da un’infinità di fattori diversi.
$ sudo ss -atup Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=692,fd=3)) tcp LISTEN 0 100 0.0.0.0:1883 0.0.0.0:* users:(("mosquitto",pid=650,fd=5)) tcp LISTEN 0 80 127.0.0.1:mysql 0.0.0.0:* users:(("mysqld",pid=751,fd=17)) tcp LISTEN 0 128 *:http *:* users:(("apache2",pid=849,fd=4)
Nell’output di esempio qui sopra noterai che nel sistema sono attivi i servizi ssh
, apache2
, mysql
e mosquitto.
Mentre i primi 3 servizi (ssh
, apache2
, mysql
) sono proprio i servizi che mi servono, il servizio mosquitto
è ciò che rimane di un test fatto qualche tempo fa ed ora non più utile. Questo demone, va ricordato, è in ascolto sulla porta TCP/1883 quindi espone il sistema ad inutili rischi di attacco su questa porta aperta.
Considerato che non devo fare più test con il servizio mosquitto
e per lo scopo di questo post , in questo caso specifico spegnerò il sistema e rimuoverò il pacchetto, in modo che non sia più presente nel sistema. Ma questo è solo un caso specifico.
Prima di tutto, spegni e disabilita il servizio del pacchetto che non si serve con il solito comando systemctl stop <nome_servizio>
:
$ sudo systemctl stop mosquitto.service $ sudo systemctl disable mosquitto.service
Infine, se non ti servirà nel prossimo futuro, procedi con la rimozione del pacchetto, come segue:
Con Ubuntu e Debian
$ sudo apt purge <nome_pacchetto>
Con Fedora, CentOS, o RHEL
$ sudo yum remove <nome_pacchetto>
Esegui nuovamente il comando ss -atup
per verificare che il il servizio non sia più in presente, prima di procedere oltre..
Concludendo
Tutti i Sysadmin vorrebbero avere un server Linux sicuro ed inattaccabile in modo da poter stare tranquilli da attacchi esterni fraudolenti.
Se è vero però che la sicurezza al 100% non esiste, è anche vero che ogni amministratore di sistema dovrebbe fare del suo meglio per avvicinarsi il più possibile alla massima sicurezza ragionevolmente possibile per i server dei quali è responsabile.
In questo post abbiamo visto come si può raggiungere un buon livello di sicurezza in pochi semplici passaggi, in poco tempo, con poco sforzo e senza troppi mal di testa.
È tuttavia ovvio che ciò che abbiamo mostrato più sopra è solo una piccola parte della sicurezza che si deve sempre applicare ad un server GNU Linux.
Moltissimi altri criteri di sicurezza dovrebbero essere applicati, ma ciò dipende strettamente dall’utilizzo specifico del server, delle applicazioni che vi sono installate e dai servizi che il server è chiamato ad erogare al mondo esterno.
Disclaimer
Questa pagina potrebbe contenere link di affiliazione. Gli acquisti o gli ordini che effettuerai tramite tali link possono generare commissioni che ci aiutano a sostenere questo sito web.