Tutorial > Aumentare la sicurezza del servizio SSH con Ubuntu 18.04

Aumentare la sicurezza del servizio SSH con Ubuntu 18.04

Pubblicato il: 27 ottobre 2019

Security SSH Ubuntu

Il servizio SSH rappresenta il punto di accesso principale al tuo Cloud Server e allo stesso tempo uno dei servizi che può trovarsi maggiormente sotto attacco rispetto ad altri. Questa guida ti aiuterà a migliorare la sicurezza del servizio attraverso l’utilizzo di diverse tecniche e accorgimenti.

Cambiare porta di ascolto

La porta di default per l’ascolto della connessione SSH è la 22: cambiare questa impostazione ti permetterà di offuscare il servizio e rendere la connessione più sicura.

Per evitare di entrare in conflitto con altri servizi esistenti sulla macchina, è buona norma verificare quali porte sono attualmente in uso, utilizzando il comando netstat:

$ netstat -n -l
    
Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address State
tcp        0 0 127.0.0.1:3306          0.0.0.0:* LISTEN
tcp        0 0 127.0.0.53:53           0.0.0.0:* LISTEN
tcp        0 0 0.0.0.0:22              0.0.0.0:* LISTEN
tcp6       0 0 :::80                   :::* LISTEN
tcp6       0 0 :::22                   :::* LISTEN
udp        0 0 127.0.0.53:53           0.0.0.0:*

Attraverso il parametro -l passato a netstat, lo forziamo a stampare tutte le connessioni che si trovano in stato di ASCOLTO (LISTEN). In questo esempio possiamo notare le seguenti porte utilizzate:

  • 3306 Servizio MySQL

  • 22 SSH

  • 80 Apache2 / HTTP

  • 53 DNS

Per cambiare porta, ti basta modificare il file di configurazione presente in /etc/ssh/sshd_config, decommentando la direttiva Port:

#Port 22

Quindi impostando un nuovo valore, possibilmente alto, per evitare che venga intercettata dai software di scansionamento automatico delle porte (ad esempio 2200, 5574, 1022): 

Port 5574

Per applicare la modifica ricarica il servizio tramite:

$ sudo service sshd reload

Utilizzando reload, mantieni la connessione attiva, in modo da poter correggere eventuali errori e controllare il nuovo accesso con un altro client SSH.

Una volta applicata la modifica potrai collegarti al tuo server specificando la nuova porta. Ad esempio, se stai utilizzando il client SSH da riga di comando:

$ ssh root@<IP.DEL.SERVER> -p 5574

Utilizzo di chiavi per l’autenticazione

Una tipologia di accesso molto utilizzato per la sua sicurezza, quale alternativa al login basato su password, è quello tramite utilizzo di chiavi RSA. In questo tipo di autenticazione il client genera una chiave privata e la relativa chiave pubblica, che viene installata sulla macchina server, in modo da autenticare il client in maniera univoca.

Per installare la chiave pubblica, il client deve prima generare la coppia di chiavi utilizzando il comando ssh-keygen:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

Prima di procedere con la generazione, ssh-keygen chiede una passphrase opzionale che può essere utilizzata per l’autenticazione. In questo esempio abbiamo lasciato il campo vuoto per facilitare l’accesso.

Una volta terminato, il software salverà due file nei percorsi indicati:

  • id_rsa: la chiave privata del client, da non condividere con nessuno.

  • id_rsa.pub: la chiave pubblica, distribuibile tranquillamente.

Per preparare l’ambiente server devi creare un file di nome authorized_keys nella cartella .ssh all’interno della cartella utente con cui effettuerai il login:

$ sudo mkdir ~/.ssh
$ sudo touch ~/.ssh/authorized_keys
$ sudo chmod 600 ~/.ssh/authorized_keys

Presta attenzione che il file abbia i permessi come indicato sopra.

Procedi quindi incollando la chiave pubblica preparata precedentemente dalla macchina client:

$ sudo nano ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoTzd9RnqT0yioQG1klsLEK/VG9myo7CQ47aRXu7hnPit6Lgw5kAjC7vzNWYLTy2oIlsrVI7R/tvWmVNISGkWDp9U3fONbSLp+vgBKDzRUVAIqP/AIJ2THanyZxj2b8XU/4s2uzGoTLSR3ViX0JU6zTc+IkaBp1o3W3OolvO15E10/VYJCKN3TkxPsSSGE3QReXnCcnIZYAnrPf9f1DPP1Lo+VUCIzZ7IzcZajAWQ53hC71mTYNHkUgIlWxpRyEhnsRfmqEfUSFbTwpNEarv7vGlK686C4xVxlVfKbqlNa3/g2Vrae4ArVBM958JPZ6aa+7KDZfH5TDgPPtlFCIGkd root@testclient

Salva il file e ricarica il servizio SSH:

$ sudo service sshd reload

A questo punto dovresti riuscire ad accedere al server senza che venga richiesta nessuna password tramite:

$ ssh root@<IP.SERVER>

Se tutto funziona correttamente, puoi procedere a disabilitare l’accesso tramite password dalla macchina server, modificando il file /etc/ssh/sshd_config, con i seguenti parametri:

ChallengeResponseAuthentication no
    PasswordAuthentication no

Ricorda che puoi aggiungere altre chiavi pubbliche semplicemente salvandole in coda al file ~/.ssh/authorized_keys nella macchina server.

Limitare orari di disponibilità del servizio

Una strategia per ridurre accessi indesiderati e attacchi brute-force, è quella di ridurre gli orari di disponibilità del servizio SSH. Se hai la certezza di non aver bisogno di collegarti al server in determinati orari (ad esempio dalle 23:00 alle 08:00 del giorno dopo) puoi impostare una schedulazione automatica di blocco della porta di connessione.

Per effettuare questa operazione puoi utilizzare il firewall presente di default chiamato iptables, ma, prima di procedere con le operazioni di configurazione devi considerare che iptables, di sua natura, non salva la configurazione inserita.

Per gestire più velocemente il salvataggio e caricamento della configurazione, è possibile utilizzare il pacchetto iptables-persistent, che si occupa di ricaricare la configurazione salvata all’avvio del sistema.

Prosegui quindi installando il pacchetto:

$ sudo apt-get install iptables-persistent

Installazione pacchetto iptables-persistent

Dopo aver completato la sua installazione, puoi procedere ad inserire una “chain” dedicata al blocco del servizio SSH:

$ sudo iptables -N chain-ssh
$ sudo iptables -A INPUT -p tcp --dport 22 -j chain-ssh

In questa maniera, tutte le connessioni destinate alla porta 22 (se il tuo servizio SSH utilizza un’altra porta, cambia questo valore), passeranno dalla catena appena creata “chain-ssh”.

Salva l’attuale configurazione (che verrà caricata da iptables-persistent) attraverso il comando:

$ sudo iptables-save > /etc/iptables/rules.v4

Puoi quindi procedere a creare una schedulazione temporale di inserimento ed eliminazione di regola sulla chain modificando il crontab come segue:

$ sudo crontab -e
    
# m h  dom mon dow   command
0 23   * * *   iptables -A chain-ssh -j DROP
0 8    * * *   iptables -F chain-ssh

Come puoi notare la prima operazione inserisce una regola di DROP delle connessioni alle 23:00, mentre la seconda operazione svuota la chain alle 08:00 per riabilitare il servizio.

Salva il file per applicare le modifiche.