I server VPS sono spesso presi di mira dagli intrusi. Un tipo comune di attacco viene visualizzato nei registri di sistema come centinaia di tentativi di accesso ssh non autorizzati. L'impostazione di un firewall è molto utile, ma di per sé potrebbe non controllare adeguatamente i tentativi di intrusione.
Questo tutorial mostra come costruire una barriera avanzata contro le intrusioni per FreeBSD usando due programmi, il ipfw
firewall e sshguard
. SSHGuard è un piccolo programma aggiuntivo che monitora i registri di sistema per voci "abusive". Quando i trasgressori tentano di accedere, sshguard
indica ipfw
di bloccare il traffico proveniente dall'indirizzo IP del trasgressore. L'autore del reato viene quindi effettivamente escluso.
Una volta capito come funzionano questi programmi, gestire la protezione del server è piuttosto semplice. Sebbene questa guida sia focalizzata sulla configurazione di FreeBSD, alcune parti si applicano ad altri sistemi operativi e software firewall.
Passaggio 1. Configurazione di IPFW
FreeBSD fornisce 3 firewall nella sua impostazione predefinita ( GENERIC
) del kernel, ipfw
, pf
, e ipfilter
. Ognuno ha vantaggi e fan, ma ipfw
è il software firewall nativo di FBSD ed è abbastanza semplice da usare per i nostri scopi. Vale la pena notare che ipfw
fa molte cose come mostra la sua pagina man, tuttavia funzionalità come NAT, traffic shaping, ecc., Non sono necessarie per la tipica situazione VPS. Fortunatamente, le funzionalità di base del firewall soddisfano facilmente i nostri requisiti.
Per avviare il firewall all'avvio, aggiungere quanto segue a /etc/rc.conf
:
firewall_enable="YES"
firewall_script="/usr/local/etc/IPFW.rules"
firewall_logging="YES"
Il service
comando è disponibile per avviare / arrestare manualmente il firewall:
[user@vultr ~]$ sudo service ipfw start
Naturalmente, ipfw
non farà nulla fino a quando non aggiunge regole, spesso da un file, in questo esempio che si trova in /usr/local/etc/IPFW.rules
. Il file delle regole potrebbe infatti trovarsi ovunque o avere un nome, purché corrisponda al parametro "firewall_script". Il file delle regole è descritto in dettaglio di seguito.
sshguard
è disponibile in diversi gusti per l'utilizzo con diversi firewall. Utilizzare l' pkg
utilità per recuperare e installare sshguard-ipfw
:
[user@vultr ~]$ sudo pkg install sshguard-ipfw
Nella maggior parte dei casi è tutto ciò che bisogna fare. La variabile appropriata viene automaticamente inserita in /etc/rc.conf
per l'avvio all'avvio:
sshguard_enable="YES"
Le impostazioni predefinite normalmente funzionano bene. Se sono necessari valori diversi, la sshguard
pagina man fornisce informazioni dettagliate sui parametri:
# sshguard--program defaults, so don't need to be in rc.conf unless assigning different value
# sshguard_pidfile="/var/run/sshguard.pid"
# sshguard_watch_logs="/var/log/auth.log:/var/log/mail"
# sshguard_blacklist="40:/var/db/sshguard/blacklist.db"
# sshguard_safety_thresh="40"
# sshguard_pardon_min_interval="420"
# sshguard_prescribe_interval="1200"
Puoi iniziare sshguard
con la solita service
invocazione:
[user@vultr ~]$ sudo service sshguard start
Passaggio 3. Creare uno script delle regole
La parte più difficile è la creazione del set di regole del firewall. ipfw
può utilizzare lo /etc/rc.firewall
script fornito , ma deve essere modificato per adattarsi a SSHGuard, nonché a diversi scenari operativi. Un certo numero di pagine Web e il Manuale di FreeBSD contengono informazioni utili su come farlo. Tuttavia, scrivere un file di regole non è così difficile, inoltre, un set di regole personalizzato può essere più facile da capire e modificare quando necessario.
Una caratteristica importante delle ipfw
regole è che la prima partita vince, il che significa che l'ordine delle regole è importante. In ipfw
, ogni regola è un comando e il file della regola è uno script shell eseguibile. Ciò consente di modificare il set di regole modificando le regole e quindi eseguendo il file delle regole come lo script della shell:
[user@vultr /usr/local/etc]$ sudo ./IPFW.rules
Generalmente, un file di regole definirà una variabile per il ipfw
comando, quindi cancella le regole correnti, emette regole generiche, quindi procede a impostare le regole "out", seguite dalle regole "in". La pagina di manuale di ipfw e altre risorse contengono una grande quantità di informazioni sulla struttura delle regole e le opzioni che sono numerose per non dire altro.
Da quando la versione di sshguard di FreeBSD è stata aggiornata alla versione 1.6.2, il metodo di inserimento delle regole di blocco per i trasgressori è cambiato. Ora gli indirizzi dei trasgressori sono conservati in una tabella ipfw (tabella 22 per essere specifici), anziché essere inseriti nelle regole sopra 55000 come prima.
Fortunatamente, è abbastanza semplice impostare il file delle regole per usare la tabella. È solo una questione di mettere la regola della tabella nel posto giusto e assicurarsi di usare la sintassi corretta quando si scrive la regola.
Quando sshguard
trova un colpevole, inserisce l'indirizzo del colpevole nella sua lista nera e inserisce anche l'indirizzo nella ipfw
tabella in modo da "innescare" la negazione dell'accesso. Questa regola raggiungerà questi scopi:
01000 deny ip from table\(22\) to any
In questo caso è ancora necessario mettere regole che consentano i servizi in entrata al di sopra di 01000. Ad esempio, supponiamo che l'indirizzo 10.20.30.40
sia un trasgressore nella tabella 22 e abbiamo questa regola ipfw:
56420 allow tcp from any to me dst-port 22 in via $vif
Poiché ipfw
incontra la regola 01000 prima della regola 56420 , 10.20.30.40
viene bloccata . Non sarà mai visto dalla regola "consentire 22 in". Se la regola di autorizzazione avesse un numero "normale" come 00420 , il traffico cattivo verrebbe lasciato entrare e non verrà mai bloccato (perché 00420 è inferiore a 01000 e "vince la prima partita").
Una bella caratteristica della versione aggiornata è che ora all'avvio di sshguard tutti gli indirizzi nella lista nera vengono aggiunti alla tabella e sono disponibili per bloccare senza indugio i trasgressori in arrivo. La lista nera è cumulativa e mantenuta tra le sessioni.
A questo punto è probabilmente sensato mostrare un ipfw
set di regole completo modificato per sshguard
. I commenti dovrebbero rendere abbastanza facile seguire la logica delle regole:
#!/bin/sh
# ipfw config/rules
# from FBSD Handbook, rc.firewall, et. al.
# Flush all rules before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add "
vif="vtnet0"
# allow all for localhost
$cmd 00010 allow ip from any to any via lo0
# checks stateful rules. If marked as "keep-state" the packet has
# already passed through filters and is "OK" without futher
# rule matching
$cmd 00101 check-state
# allow DNS out
$cmd 00110 allow tcp from me to any dst-port 53 out via $vif setup keep-state
$cmd 00111 allow udp from me to any dst-port 53 out via $vif keep-state
# allow dhclient connection out (port numbers are important)
$cmd 00120 allow udp from me 68 to any dst-port 67 out via $vif keep-state
# allow HTTP HTTPS replies
$cmd 00200 allow tcp from any to any dst-port 80 out via $vif setup keep-state
$cmd 00220 allow tcp from any to any dst-port 443 out via $vif setup keep-state
# allow outbound mail
$cmd 00230 allow tcp from any to any dst-port 25 out via $vif setup keep-state
$cmd 00231 allow tcp from any to any dst-port 465 out via $vif setup keep-state
$cmd 00232 allow tcp from any to any dst-port 587 out via $vif setup keep-state
# allow icmp re: ping, et. al.
# comment this out to disable ping, et.al.
$cmd 00250 allow icmp from any to any out via $vif keep-state
# alllow timeserver out
$cmd 00260 allow tcp from any to any dst-port 37 out via $vif setup keep-state
# allow ntp out
$cmd 00270 allow udp from any to any dst-port 123 out via $vif keep-state
# allow outbound SSH traffic
$cmd 00280 allow tcp from any to any dst-port 22 out via $vif setup keep-state
# otherwise deny outbound packets
# outbound catchall.
$cmd 00299 deny log ip from any to any out via $vif
# inbound rules
# deny inbound traffic to restricted addresses
$cmd 00300 deny ip from 192.168.0.0/16 to any in via $vif
$cmd 00301 deny ip from 172.16.0.0/12 to any in via $vif
$cmd 00302 deny ip from 10.0.0.0/8 to any in via $vif
$cmd 00303 deny ip from 127.0.0.0/8 to any in via $vif
$cmd 00304 deny ip from 0.0.0.0/8 to any in via $vif
$cmd 00305 deny ip from 169.254.0.0/16 to any in via $vif
$cmd 00306 deny ip from 192.0.2.0/24 to any in via $vif
$cmd 00307 deny ip from 204.152.64.0/23 to any in via $vif
$cmd 00308 deny ip from 224.0.0.0/3 to any in via $vif
# deny inbound packets on these ports
# auth 113, netbios (services) 137/138/139, hosts-nameserver 81
$cmd 00315 deny tcp from any to any dst-port 113 in via $vif
$cmd 00320 deny tcp from any to any dst-port 137 in via $vif
$cmd 00321 deny tcp from any to any dst-port 138 in via $vif
$cmd 00322 deny tcp from any to any dst-port 139 in via $vif
$cmd 00323 deny tcp from any to any dst-port 81 in via $vif
# deny partial packets
$cmd 00330 deny ip from any to any frag in via $vif
$cmd 00332 deny tcp from any to any established in via $vif
# allowing icmp re: ping, etc.
$cmd 00310 allow icmp from any to any in via $vif
# allowing inbound mail, dhcp, http, https
$cmd 00350 allow udp from any 53 to me in via $vif
$cmd 00360 allow tcp from any 53 to me in via $vif
$cmd 00370 allow udp from any 67 to me dst-port 68 in via $vif keep-state
$cmd 00400 allow tcp from any to me dst-port 80 in via $vif setup limit src-addr 2
$cmd 00410 allow tcp from any to me dst-port 443 in via $vif setup limit src-addr 2
# SSHguard puts offender addresses in table 22. Set up the table rule
# Please note the '\(22\)' syntax, necessary since it's run as shell command
$cmd 01000 deny ip from table\(22\) to any
# allow inbound ssh, mail. PROTECTED SERVICES: numbered ABOVE sshguard blacklist range
$cmd 56420 allow tcp from any to me dst-port 22 in via $vif setup limit src-addr 2
$cmd 56530 allow tcp from any to any dst-port 25 in via $vif setup keep-state
$cmd 56531 allow tcp from any to any dst-port 465 in via $vif setup keep-state
$cmd 56532 allow tcp from any to any dst-port 587 in via $vif setup keep-state
# deny everything else, and log it
# inbound catchall
$cmd 56599 deny log ip from any to any in via $vif
# ipfw built-in default, don't uncomment
# $cmd 65535 deny ip from any to any
Passaggio 4. Avvio e test
Le esigenze di sistema variano e le diverse scelte di porte da bloccare o sbloccare si riflettono nel set di regole. Una volta terminato /usr/local/etc/IPFW.rules
il set di regole, salvare il file in e avviare i servizi FBSD:
# service ipfw start
# service sshguard start
Il firewall aumentato ora dovrebbe essere in esecuzione! Controllare sshguard
:
[user@vultr ~]$ sudo pgrep -lfa ssh
Se sshguard
è in esecuzione, vengono visualizzati il pid e la riga di comando completa:
720 /usr/local/sbin/sshguard -b 40:/var/db/sshguard/blacklist.db -l /var/log/auth.log -l /var/log/maillog -a 40 -p 420 -s 1200 -w /usr/local/etc/sshguard.whitelist -i /var/run/sshguard.pid
Questo mostra il set di regole del firewall con le statistiche e l'ultima volta che un pacchetto ha rispettato la regola:
[user@vultr ~]$ sudo ipfw -cat list
Dopo ore o giorni, gli indirizzi degli autori di reato vengono aggiunti alla lista nera e anche alla tabella 22. Per visualizzare tutti gli indirizzi nella tabella, utilizzare questo comando:
ipfw table 22 list
Il risultato è stampato come:
10.10.10.118/32 0
10.10.10.72/32 0
...
Come descritto sopra, le connessioni da questi indirizzi non sono consentite. Certo, al primo avvio sshguard
non ci saranno indirizzi nell'elenco, ma col tempo può diventare piuttosto lungo. Un'opzione consiste nel creare regole di blocco separate per gli indirizzi con più voci nella tabella e quindi eliminarle dalla lista nera.
Passaggio 5. Mantenere vigile ...
È una buona idea controllare occasionalmente i registri per assicurarsi che le intrusioni siano controllate. In generale, /var/log/auth.log
e /var/log/security
sono informativi. È possibile che emergano lacune o errori nella copertura dei servizi di rete. La modifica del set di regole del firewall in base alle esigenze è una parte normale dell'amministrazione del server.
Nelle precedenti versioni di sshguard, quando il /var/db/sshguard/blacklist.db
file si era ingrandito, poteva impedire sshguard
l'avvio all'avvio del sistema. Rimozione o ridenominazione del file della lista nera consentita sshguard
per l'avvio. Questo problema sembra essere stato risolto nell'ultima versione di sshguard, quindi questa soluzione alternativa non è probabilmente più necessaria.
Assicurati di inserire nella whitelist l'indirizzo IP da cui sei connesso alla sessione SSH. Se ti blocchi accidentalmente, puoi sempre connetterti alla console noVNC in https://my.vultr.com e inserire nella lista bianca il tuo IP.
Riassumendo, usando la combinazione di ipfw
e sshguard
aiuta a mantenere sicuro il tuo sistema FreeBSD e fare il suo lavoro. Ridurre al minimo l'attività intrusiva della rete ha un ulteriore vantaggio: meno "rumore" semplifica il monitoraggio e l'ottimizzazione del funzionamento del sistema, contribuendo a un server più sicuro e con un funzionamento migliore.
La protezione efficace di un sistema / server FreeBSD non è particolarmente complicata. Mentre è necessario uno sforzo modesto per metterlo in funzione, paga in VPS e sicurezza del progetto sostanzialmente maggiori.