Proteggi un server OpenSSH Ubuntu dagli attacchi Brute force ma senza un firewall o una coppia di chiavi SSH?

Io uso Ubuntu 16.04 e cerco di rafforzare la mia autenticazione SSH in modo speciale.

La situazione attuale:

Ho una macchina con un server Ubuntu minimo che utilizzo principalmente per trasferire file tramite il suo server OpenSSH locale. Ora, non ho un firewall su quella macchina per diversi motivi e evito anche di usare una coppia di chiavi, quindi uso solo una password. Uno degli unici modi che ho lasciato per difendermi dagli attacchi di forza bruta, e quello che più desidero al momento, è l’utilizzo di un meccanismo che blocca un utente per X quantità di ore, dopo che la quantità Y di tentativi di connessione.

La situazione desiderata:

Vorrei avere un meccanismo autonomo (cioè non come parte di un firewall) che blocchi un utente per X quantità di ore, dopo che la quantità di connessione di Y tenta di difendersi dagli attacchi di forza bruta.

La mia domanda:

Conoscete un’utilità (e una configurazione specifica) che mi consentirà di raggiungere la situazione desiderata?

Puoi farlo con Fail2ban:

sudo apt-get install fail2ban 

Poi:

 sudo vim /etc/fail2ban/jail.conf 

modifica bantime per impostare il tempo di divieto desiderato

modifica maxretry per impostare i tentativi di massimo errore

come menzionato da altri commenti, fail2ban richiede iptables.


Opzione separata – bussola alla porta:

Ciò richiede solo iptables, praticamente 0 memoria e nasconderà in modo efficace il servizio dalle scansioni di porte

Non rispondere direttamente alla domanda, ma forse è ansible implementare il knockout della porta per hide la disponibilità del servizio anziché vietare tentativi ripetuti.

una rapida ricerca su google rivela questo: https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps

Tuttavia, si richiede iptables.

PS: So che la sicurezza attraverso l’oscurità non è affatto una sicurezza, ma insieme ad altre pratiche può aiutarti a renderti un objective più difficile.

Questa risposta intende fornire un modo per soddisfare la domanda principale: proteggere un server OpenSSH Ubuntu da attacchi Brute force ma senza un firewall o una coppia di chiavi SSH?

In realtà preferisco usare la coppia di chiavi Firewall e SSH e ho trovato che la risposta fornita da Doug Smythies è davvero utile.

Proteggi SSH con autenticazione a due fattori

L’autenticazione a due fattori (2FA) è un tipo di autenticazione a più fattori . In questo esempio 2FA conferma l’id quadro dichiarata di un utente utilizzando una combinazione di questi due diversi componenti:

  • Codice token a sei cifre basato sul tempo: codice di autenticazione. Per impostazione predefinita, questi token sono validi per 30 secondi più i 60 secondi aggiunti in aggiunta per compensare il ansible aumento di tempo.

  • La password dell’utente, che dovrebbe essere sufficientemente sicura .

In realtà, quando hai impostato PermitRootLogin no e i nomi utente sono stati scelti correttamente, per me questo metodo può essere chiamato 3FA.

Inoltre, se il computer in cui si effettua l’accesso non è temprato contro i tentativi di accesso a forza bruta, è ansible abilitare la limitazione della velocità per il modulo di autenticazione.

Cominciamo:

1. Installare le dipendenze

 sudo apt-get install libpam-google-authenticator 

2. Modifica i file di configurazione

  • Modifica /etc/pam.d/sshd e aggiungi questa direttiva:

     # Google Authenticator auth required pam_google_authenticator.so 

    Aggiungilo all’inizio del file. In questo modo il sistema chiederà il primo codice di autenticazione e solo allora chiederà la password. Aggiungilo alla fine del file: il sistema chiederà la prima password.

  • Modifica /etc/ssh/sshd_config e modifica o aggiungi queste direttive:

     ChallengeResponseAuthentication yes UsePAM yes PasswordAuthentication no # You can leave this 'yes' it doesn't matter. 

3. Attivare l’autenticazione a due fattori per un utente

Passa all’utente che dovrebbe utilizzare l’autenticazione a due fattori e digitare nel terminale:

 $ google-authenticator Invio

 Vuoi che i token di autenticazione siano basati sul tempo (y / n) y Invio
 https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/[email protected]%3Fsecret%3DE3CY3TNSNBXXXXXX


 La tua nuova chiave segreta è: E3CY3TNSNBXXXXXX
 Il tuo codice di verifica è 229999
 I tuoi codici di emergenza sono:
   19999711
   ...

 Vuoi che aggiorni il tuo file "/home/user/.google_authenticator" (s / n) e Invio

 Vuoi disabilitare più usi dello stesso token di autenticazione?  Ciò ti limita a un login circa ogni 30s, ma aumenta le tue possibilità di notare o persino prevenire attacchi man-in-the-middle 
 (y / n) y Invio

 Per impostazione predefinita, i token sono validi per 30 secondi e, per compensare eventuali oscillazioni di tempo tra il client e il server, consentiamo un token extra prima e dopo l'ora corrente.  Se si verificano problemi con una sincronizzazione scadente, è ansible aumentare la finestra dalla dimensione predefinita di 1: 30 minuti a circa 4 minuti.  Vuoi farlo 
 (y / n) y Invio

 Se il computer al quale si sta effettuando l'accesso non è temprato contro i tentativi di accesso a forza bruta, è ansible abilitare la limitazione della velocità per il modulo di autenticazione.  Per impostazione predefinita, ciò limita gli attaccanti a non più di 3 tentativi di accesso ogni 30 secondi.  Vuoi abilitare la limitazione della velocità 
 (y / n) y Invio

Questo dialogo genererà un file di autenticazione chiamato .google_authenticator inserito nella home directory dell’utente. Questo file può essere utilizzato anche per gli account di altri utenti se si desidera che tutti utilizzino gli stessi token. Inoltre, questo file può essere personalizzato e può anche essere utilizzato per 2FA in Apache2 , ma questa è un’altra storia.

4. Genera codici di autenticazione

La chiave segreta – E3CY3TNSNBXXXXXX – generata nel passaggio precedente viene utilizzata per generare codici di autenticazione all’interno di alcune applicazioni come:

  • Commandline Authenticator
  • Queste app desktop menzionate qui
  • Estensioni per i browser web qui descritti
  • Google Authenticator per Android
  • Google Authenticator per iPhone / iPad

5. Esempio di utilizzo

In questo esempio viene utilizzata l’estensione Authenticator per Chromium / Chrome:

inserisci la descrizione dell'immagine qui

6. Ulteriore lettura

  • La fonte principale di questa risposta: Come proteggere SSH con autenticazione a due fattori ;
  • Autenticazione a più fattori : come abilitare l’autenticazione SSH utilizzando un’app OATH-TOTP (il metodo descritto qui) oltre a una coppia di chiavi SSH .

MODIFICARE:

In alcuni casi potrebbe esserci una differenza tra l’orologio di Google e l’orologio del server. Ecco alcuni suggerimenti in base a questo problema:

  • Qual è il comando per aggiornare ora e data da internet

  • Data: imansible impostare la data: operazione non consentita

  • Linux: aggiungi x secondi alla data corrente

Sfortunatamente : se si tratta di un VPS, potresti non avere le autorizzazioni per farlo … Se stai usando un VPS, contatta il tuo provider per gestirlo per te.

Nel caso in cui il tuo provider non desideri rispondere ai tuoi requisiti, l’impostazione sopra funzionerà ma con il time-shift. Digita la date nella console del tuo server e misura questo time-shift. Quindi lavorate con questo cambio di orario tra il momento della generazione del codice di autenticazione e il momento del suo utilizzo.

Non è necessario installare nulla per tale protezione – Basta aggiungere le regole rilevanti nel sistema iptables .

1. Regola dei prerequisiti:

All’inizio del set di regole, consenti al traffico relativo di tornare sul server:

 sudo iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT 

2. Regole di rilevamento e blocco:

Imposta una lista di badguy dynamic. Rileva e DROP Bad IP che eseguono attacchi con password su SSH. Una volta inseriti nell’elenco BADGUY, il sistema elimina tutti i pacchetti:

 sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT 
  • Nel codice sopra, 90000 secondi (25 ore) è il tempo di blocco.

  • Qualsiasi tentativo da un indirizzo IP bloccato, anche non collegato a SSH (a seconda delle altre regole che potresti avere o meno e l’ordine), ripristina il timer a tempo di blocco.

3. Rilevazioni indurire:

Limitare il numero di password errate per connessione a 2. L’impostazione predefinita è 6.

Come sudo modifica /etc/ssh/sshd_config , e lì imposta:

  MaxAuthTries 2