Quando abbiamo montato un server con Linux e vogliamo gestirlo da internet tramite il controllo remoto SSH, può capitare che iniziamo a ricevere attacchi con l'obiettivo di entrare nel sistema e poterlo controllare per i suoi scopi. Questi attacchi vengono solitamente eseguiti da programmi informatici (bot) che per lungo tempo tentano di accedere al sistema utilizzando la forza bruta.
Nei post precedenti ho parlato di come configurare il servizio SSH ma alcuni bot avanzati non entrano nel servizio ma possono killare il servizio SSH sul server disabilitando l'accesso remoto.
Manuale completo di SSH (Secure Shell)
Possiamo evitarlo usando il strumento fail2ban, è molto pratico e offre un grande margine di sicurezza. Per spiegare un po' come funziona. È in grado di creare iptables prima di qualsiasi tentativo di accesso fallito per più di 5 volte di seguito, rifiutando qualsiasi tipo di connessione una volta che è stata bandita.
Installa Fail2ban
L'installazione può essere eseguita direttamente da apt. Prima aggiorniamo il sistema e poi installiamo Fail2ban.
apt-get update && apt-get -y upgrade
apt-get install fail2banQuesto non solo installa il programma, ma lo lascia anche in esecuzione e si avvia con il sistema.
Configurazione di Fail2ban
Il servizio Fail2ban ha le sue impostazioni nella directory / etc / fail2ban. Hai alcune opzioni preconfigurate in jail.conf, la cosa migliore in questo caso è copiare il file e non apportare le modifiche direttamente in esso, durante l'aggiornamento di fail2ban questi file vengono sovrascritti e puoi perdere tutte le modifiche fatte in precedenza.
In questo caso copiamo il file e lo chiamiamo jail.local in modo che possa trovarlo.
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localUna volta copiato, possiamo aprirlo e vedere come funziona.
vim /etc/fail2ban/jail.localAll'interno del file, abbiamo diversi parametri che possiamo regolare. Qualsiasi parametro che si trova sotto il tag [DEFAULT] verrà applicato a tutti i servizi abilitati da Fail2ban come SSH, NGINX, APACHE, lo chiameremo globale, quindi avremo sezioni specifiche per ogni servizio.
Inizieremo aggiungendo parametri alla sezione globale.
ignoraip = 127.0.0.1Aggiungiamo il nostro localhost in questo modo ignorerà tutto il traffico locale, possiamo aggiungere ulteriori indirizzi separandoli con uno spazio.
tempo di ban = 600Il bantime è il periodo di tempo in cui il client verrà bannato dopo essere stato bloccato. L'unità è in secondi 600 secondi sarebbe 10 minuti è il valore predefinito.
tempo di ricerca = 600 maxretry = 3Quindi abbiamo findtime e maxretry. Sono responsabili di stabilire le condizioni affinché un client venga bannato per impostazione predefinita, si può leggere che qualsiasi utente con più di 3 tentativi falliti in meno di 10 minuti verrà bannato.
destemail = root @ localhost sendername = Fail2Ban mta = sendmailSe vogliamo creare avvisi per utenti bannati, questi 3 parametri sono necessari, definiremo la destinazione a cui inviare l'e-mail di avviso, chi si occuperà di inviarla e infine l'mta per definire quale servizio di posta elettronica utilizzeremo .
azione = $ (azione_) sQui definiremo quale azione intraprendere quando è richiesto un ban. Il valore action_ è l'azione predefinita basata sul rifiuto di qualsiasi traffico client fino alla scadenza del tempo di ban.
Se vogliamo inviare un alert via mail dobbiamo cambiare il valore in action_mw, ma se vogliamo che alleghi anche le righe del log nel corpo della mail useremo action_mwl. Dobbiamo essere sicuri che le impostazioni della posta siano corrette prima di modificare questo valore.
Impostazioni per servizio
Una volta completate le configurazioni globali, aggiungeremo i parametri che verranno applicati esclusivamente al
SSH, ci assicuriamo di aggiungere le opzioni sotto il tag [SSH].
abilitato = veroPer impostazione predefinita il servizio SSH è abilitato, ma possiamo modificarlo se necessario in questa opzione.
Tutta questa sezione potrebbe funzionare con i valori che descriverò in dettaglio più avanti ma puoi modificarla per adattarla alle tue esigenze o lasciarli tutti di default.
Un'altra delle configurazioni sono i filtri che indicano se il login era corretto o meno e possono essere aggiunti per altri servizi, ad esempio abbiamo un server con nginx e una parte della pagina è protetta da password, ma un client sta attaccando con forza bruta , possiamo fermarlo aggiungendo quanto segue sotto il tag [nginx-http-auth].
[nginx-http-auth] abilitato = true filter = nginx-http-auth port = http, https logpath = /var/log/nginx/error.logOra, se un utente ha più di 3 tentativi di accesso falliti, ciò si riflette nei registri e fail2ban agirà e bloccherà tutto il traffico utente.
Ambiente di test
Dopo aver compreso le basi, faremo un piccolo ambiente di test dove proteggeremo SSH e Nginx tramite Fail2ban creando una politica di ban che ci avviserà dell'IP che è stato bannato.
Installeremo prima Nginx se non è installato
apt-get install nginxinstalleremo un servizio di posta per le notifiche può essere sendmail
apt-get install sendmailinfine vogliamo che i nostri iptables siano persistenti dopo un avvio possiamo creare uno script rc.0 o installare il pacchetto iptables-persistent.
apt-get install iptables-persistentVerrà installato.
Stabilire il nostro firewall
Dopo aver installato quanto sopra, dobbiamo implementare un firewall in modo che possa bloccare il traffico. Creerò un firewall di base nei post successivi parlerò di più di iptables.
Consentiremo le connessioni stabilite, il traffico del server come gli aggiornamenti e il traffico destinato alle porte SSH e Nginx. Tutto il traffico rimanente verrà negato.
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -j DROPPossiamo vedere i cambiamenti con:
iptables -SDovrebbe dare un risultato simile.
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban -ssh -j RETURN
Regolazione delle impostazioni di Fail2ban
Ora dobbiamo configurare il file jail.local a nostro piacimento.
vi /etc/fail2ban/jail.localPossiamo prolungare il tempo di ban di un utente di almeno 30 minuti, ricordati di impostare il valore in secondi.
tempo di festa = 1800Dobbiamo configurare un'e-mail che riceva tutti gli avvisi di ban fail2ban, cerchiamo il valore dell'e-mail nel file e mettiamo l'e-mail.
destemail = [email protected]Possiamo cambiare il mittente che invierà l'avviso che di solito posto con il nome fail2ban in modo da poter filtrare meglio tra tutti i log.
Dopo che dobbiamo cambiare il valore dell'azione abbiamo 2 opzioni:
- action_mw: invia un alert con un report simile al comando whois del client bannato.
- action_mwl: inviare un avviso molto più dettagliato includendo un log nel corpo del messaggio.
In questo useremo la seconda opzione:
azione =% (action_mwl) sQuindi andremo alla sezione [SSH] e possiamo modificare il numero massimo di tentativi prima del ban, lo lasceremo a 5:
maxretry = 5Se abbiamo il servizio SSH su una porta diversa dalla 22, che è altamente raccomandata, dobbiamo menzionare la sua porta.
porta = 45024Quindi cercheremo il tag [nginx-http-auth], lo lasceremo così com'è.
[nginx-http-auth] abilitato = veroAbbiamo finito e possiamo salvare e chiudere il file.
Riavvio del servizio Fail2ban
Per tutte le modifiche da applicare consiglio di interrompere il servizio.
servizio fail2ban stopAllora possiamo ricominciare
servizio fail2ban startCi vorrà un po' di tempo, dopo circa 5 minuti potremo rivedere le nostre regole con
iptables -S
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp - -dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURNVediamo come fail2ban ha aggiunto nuove politiche, può variare a seconda della configurazione che hai definito in /etc/fail2ban/jail.local.
ConclusioniAbbiamo installato fail2ban e configurato per funzionare con SSH e NGINX in caso di APACHE dobbiamo cambiare le etichette e la directory dei log ma è molto simile a nginx. Abbiamo configurato solo le basi, si possono creare filtri e regole molto più avanzate, consiglio di leggere un po' la loro man page, i file di configurazione sono ben commentati, consiglio di andare piano piano a scoprirne tutte le funzioni.
Ti è piaciuto e hai aiutato questo Tutorial?Puoi premiare l'autore premendo questo pulsante per dargli un punto positivo