Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Prevenire attacchi di forza bruta con BlockHosts su Debian Etch

In questo articolo vi mostrerò come installare e configurare BlockHosts su un sistema Debian Etch. BlockHosts è uno strumento di Python che osserva i tentativi di accesso a vari servizi, ad esempio SSH, FTP, ecc., e se ne trova di tentativi di login nuovamente dallo stesso indirizzo IP o host, si ferma ulteriore login tentativi da tale indirizzo IP/host. Per impostazione predefinita, BlockHosts supporta servizi che utilizzano TCP_WRAPPERS, come ad esempio SSH, cioè i servizi, che utilizzano /etc/hosts.allow o/etc/hosts.deny, ma può anche bloccare altri servizi utilizzando iproute o iptables.

Questo documento viene fornito senza garanzia di alcun tipo! Io non rilasciano alcuna garanzia che questo funziona per voi!

 

1 Nota preliminare

Ho testato BlockHosts su un sistema Debian Etch.

Vi mostrerò come utilizzarlo con un servizio che utilizza /etc/hosts.allow o /etc/hosts.deny (sshd) e con un servizio che non utilizza TCP_WRAPPERS, ad es. ProFTPd pacchetto Debian. Servizi che non utilizzano /etc/hosts.allow o/etc/hosts.deny possono essere bloccati da iproute o iptables.

Presumo che OpenSSH e ProFTPd sono sia correttamente installato e funzionante sul vostro sistema.

 

2 l’installazione BlockHosts

Come BlockHosts è scritto in Python, ora dobbiamo installare Python:

apt-get install python

In seguito, scaricare e installare BlockHosts come questo:

CD/tmp
wget http://www.aczoom.com/tools/blockhosts/BlockHosts-2.0.5.tar.gz
tar xvfz BlockHosts-2.0.5.tar.gz
CD BlockHosts-2.0.5

python setup.py install --force

Ora dobbiamo modificare /etc/blockhosts.cfgModificarlo come segue:

vi /etc/blockhosts.cfg
[...]
HOSTS_BLOCKFILE = "/etc/hosts.allow"
[...]
HOST_BLOCKLINE = ["ALL: ", " : deny"]
[...]
LOGFILES = [ "/var/log/auth.log", "/var/log/proftpd/proftpd.log", ]
[...]
COUNT_THRESHOLD = 3
[...]
AGE_THRESHOLD = 12
[...]
MAIL = True
[...]
NOTIFY_ADDRESS = 'root@localhost.localdomain'
[...]
SMTP_SERVER = "localhost"
SENDER_ADDRESS = 'BlockHosts <blockhosts-do-not-reply@localhost.localdomain>'
[...]
IPBLOCK = "iptables"
[...]

In HOSTS_BLOCKFILE noi possiamo specificare /etc/hosts.allow o /etc/hosts.denyNon importa che uno si sceglie. Sto usando /etc/hosts.allow qui. Nella linea LOGFILES specifichiamo i file di registro che BlockHosts dovrebbe guardare. OpenSSH è registrazione tentativi di login a /var/log/auth.log, ProFTPd per /var/log/proftpd/proftpd.logCOUNT_THRESHOLDspecifica il numero di tentativi di login dallo stesso host dopo che BlockHosts dovrebbe bloccare tale host. AGE_THRESHOLD è il numero di ore dopo il quale host bloccato ottenere sbloccato. IPBLOCK specifica se si desidera bloccare ospita con iptables o iproute oltre ad aggiungere questi host /etc/hosts.allow (o /etc/hosts.deny).

Quindi dobbiamo modificare /etc/hosts.allowEseguire prima il backup il vostro attuale /etc/hosts.allow:

cp /etc/hosts.allow /etc/hosts.allow_orig

Quindi svuotare /etc/hosts.allow e mettere qualcosa di simile in esso:

cat/dev/null > /etc/hosts.allow
vi /etc/hosts.allow

#
# hosts.allow    This file describes the names of the hosts which are
#        allowed to use the local INET services, as decided
#        by the '/usr/sbin/tcpd' server.
#
# ----
# see "man 5 hosts_access" for details of the format of IP addresses,
#services, allow/deny options. Also see "man hosts_options"
#
# permanent whitelist addresses - this should always be allowed access

ALL: 127.0.0.1 : allow
# ALL: 192.168.0. : allow

# permanent blacklist addresses - this should always be denied access
# ALL: 10. : deny
# ----------------------------------------
# next section is the blockhosts section - it will add/delete entries in
# between the two marker lines (#---- BlockHosts Additions)

#---- BlockHosts Additions
#---- BlockHosts Additions

# ----------------------------------------
# finally, the command to execute the blockhosts script, based on
# connection to particular service or services:

sshd: ALL: spawn /usr/bin/blockhosts.py --verbose --mail --iptables \
     --echo "%c-%s" --check-ip "%h" >> /var/log/blockhosts.log 2>&1 & \
: allow

#---
# add --iproute to enable null-routing, or add --iptables to enable packet
# filtering, which blocks all network communication from blocked hosts
#---
# remove   >> /var/log/blockhosts.log 2>&1     if no logging to blockhosts.log
# is needed - without this, it will still log to syslog (minimally)
#sshd: ALL: spawn /usr/bin/blockhosts.py --verbose --echo "%c-%s" & : allow
#---
# above commands will use default config file - /etc/blockhosts.cfg, edit
# it as needed to specify local configuration options

# See "man hosts.allow" for info on %c and %s identifiers

# for non-verbose, with identification, to syslog only (/var/log/messages),
# triggered on any service (using ALL as first word):
#ALL: ALL: spawn /usr/bin/blockhosts.py --echo "%c-%s" & : allow
#----
# To test hosts.allow, and to find out exact names of SSH/FTP services,
# add this line to the beginning of hosts.allow, use ssh/ftp to connect
# to your server, and then look at the log (/var/log/messages or
# blockhosts.log) to see the name of the invoked service.
# IMPORTANT: after your test is done, remove this line from hosts.allow!
# Otherwise everyone will always have access.
#ALL : ALL: spawn (/usr/bin/blockhosts.py --verbose --echo "%c-%s" >> /var/log/blockhosts.log 2>&1 )& : allow

# -------------------------------------------------------------------------

Nella prima sezione Metti gli host che si desidera alla whitelist (ad esempio 127.0.0.1). Se si desidera whitelist la subnet intera192.168.0 , decommentare quella riga.

Poi dobbiamo aggiungere questi marcatori – BlockHosts aggiungerà host bloccati tra loro:

#—Aggiunte di BlockHosts 
#—Aggiunte di BlockHosts

La parte più importante è questo:

sshd: tutti: spawn /usr/bin/blockhosts.py – verbose – posta – iptables \
-echo “%c-%s”–controllo-ip “%h” >> /var/log/blockhosts.log 2 > & 1 & \
: consentire

Ora ogni volta che qualcuno tenta di fare il login usando SSH, /usr/bin/blockhosts.py è iniziato, controlla i file di registro che abbiamo specificato in /etc/blockhosts.cfge blocca tutti gli host con più di COUNT_THRESHOLD venuto a mancare tentativi di accesso da aggiungendoli a /etc/hosts.allow e utilizzando iptables (che sarà totalmente bloccare questi host di accedere al sistema). Tutte le azioni verranno registrate a /var/log/blockhosts.log.

Ora abbiamo bisogno di inizializzare BlockHosts. In primo luogo, lo facciamo con il -funzionamento a secco opzione per vedere se ci sono errori:

blockhosts.py --dry-run --verbose

L’output potrebbe assomigliare a questo:

Server2: / var/log # blockhosts.py – funzionamento a secco– verbose
blockhosts 2.0.5 iniziato: 2007-09-05 16:31:10 CEST
… caricare blockfile: /etc/hosts.allow
… trovato entrambi gli indicatori, conteggio degli eserciti guardandi: 0
Nessun logoffsets trovato, leggerà dall’inizio nel file di log: /var/log/auth.log
… caricamento di file di log, offset: /var/log/auth.log 0
Nessun logoffsets trovato, leggerà dall’inizio nel file di registro: /var/log/proftpd/proftpd.log
… caricamento di file di log, offset: /var/log/proftpd/proftpd.log 0
… ignorerà tutte le voci di host precedenti 2007-09-05 04:31:10 CEST
… aggiornamenti: conta: ospita al blocco: 0; padroni di casa guardandi: 0
#—Aggiunte di BlockHosts
#bh: logfile: /var/log/auth.log
#bh: offset: 2643
#bh: prima linea: Jun 28 20:35:51 server2 login [2087]: (pam_unix) sessione aperta dell’utente root (uid = 0)

#bh: file di registro: /var/log/proftpd/proftpd.log
#bh: offset: 1308
#bh: prima linea: set 05 16:04:34 Server2 proftpd [2355] Server2: errore impostazione IPV6_V6ONLY: protocollo non disponibile

#---- BlockHosts Additions

# —————————————-
n # infine, il comando per eseguire lo script blockhosts, basato su
# connessione particolare servizio o servizi:

sshd, proftpd, vsftpd: tutti: spawn /usr/bin/blockhosts.py – verbose – posta \
-echo “%c-%s”–controllo-ip “%h” >> /var/log/blockhosts.log 2 > & 1 & \
: consentire

#—
# aggiungere – iproute per abilitare il routing null oppure – iptables per attivare pacchetti
# filtro, che blocca tutte le comunicazioni di rete da host bloccati
#—
# Rimuovi >> /var/log/blockhosts.log 2 > & 1 se nessuna registrazione a blockhosts.log
# è necessario – senza questo, ancora verrà registrato al syslog (come minimo)
#sshd: tutti: spawn /usr/bin/blockhosts.py – verbose – echo “%c-%s” &: consentire
#—
# sopra i comandi utilizzerà la configurazione di default file – /etc/blockhosts.cfg, modifica
# come necessario per specificare le opzioni di configurazione locale

# See "man hosts.allow" for info on %c and %s identifiers

# per non dettagliata, con identificazione, syslog solo (/ var/log/messages),
# attivato su qualsiasi servizio (utilizzando tutto come prima parola):
#ALL: Tutti: spawn /usr/bin/blockhosts.py – eco “%c-%s” &: consentire
#—-
N # di testare hosts. allow e per scoprire i nomi esatti dei servizi SSH/FTP,
# aggiungere questa riga all’inizio di hosts. allow, uso ssh/ftp per connettersi
# per il server e poi guardare il log (/ var/log/messages o
n # blockhosts.log) per vedere il nome del servizio richiamato.
# IMPORTANTE: dopo il test è fatto, rimuovere questa riga da hosts!
# Altrimenti tutti avranno sempre accesso.
#ALL: Tutti: spawn (/usr/bin/blockhosts.py – verbose – echo “%c-%s” >> /var/log/blockhosts.log 2 > & 1) &: consentire

# ————————————————————————-
I comandi (provvisorio) di eseguire per blocco di ip null-itinerario:
… nessuna e-mail per inviare.
Server2: / var/log #

Sembra ok (a parte l’errore di IPv6 che è possibile ignorare), così possiamo eseguirlo senza la -funzionamento a seccoopzione:

blockhosts.py --verbose

Questo dovrebbe apparire come questo:

Server2: / var/log # blockhosts.py – verbose
blockhosts 2.0.5 started: 2007-09-05 16:33:24 CEST
… caricare blockfile: /etc/hosts.allow
… trovato entrambi gli indicatori, conteggio degli eserciti guardandi: 0
… loading log file, offset: /var/log/auth.log 2643
… caricamento di file di log, offset: /var/log/proftpd/proftpd.log 1308
… ignorerà tutte le voci di host precedenti 2007-09-05 04:33:24 CEST
… aggiornamenti: conta: ospita al blocco: 0; padroni di casa guardandi: 0
… creato catena definita dall’utente blockhosts
… creazione di salto da INPUT a catena blockhosts
… nessuna e-mail per inviare.
Server2: / var/log #

BlockHosts è ora pronto per controllare accessi SSH non riusciti, ma non per accessi non riusciti ProFTPd perché ProFTPd di Debian non controlla /etc/hosts.allow e /etc/hosts.deny, il che significa che BlockHosts non è richiamato quando qualcuno tenta di accedere a ProFTPd (naturalmente, se qualcuno ha COUNT_THRESHOLD o registro più fallito nei tentativi su ProFTPD e quindi si tenta di accedere a OpenSSH, egli verrà bloccato, perché OpenSSH utilizza /etc/hosts.allow che richiama quindi BlockHosts che trova il fallito tentativi di login per ProFTPd; ma se qualcuno tenta di accedere a ProFTPd solo, non c’è alcun modo per catturarlo con la configurazione attuale). Per bloccare i servizi non-TCP_WRAPPERS, creeremo un job di cron che inizia BlockHosts ogni cinque minuti (ad esempio).

3 creare un Job di Cron BlockHosts per i servizi Non-TCP_WRAPPERS

Per bloccare ospita servizi non-TCP_WRAPPERS quali ProFTPd di Debian, è possibile eseguire

blockhosts.py --iptables --verbose

nella riga di comando. Naturalmente, non volete fare questo ogni pochi minuti, quindi creiamo un job di cron per questo.

Prima di tutto creiamo un piccolo script wrapper per /usr/bin/blockhosts.py:

vi /usr/local/sbin/blockhosts
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

/usr/bin/blockhosts.py --iptables --verbose >> /var/log/blockhosts.log 2>&1

Lo scopo di questo script wrapper consiste nel passare il corretto percorso allo script /usr/bin/blockhosts.py ; Se usiamo /usr/bin/blockhosts.py direttamente nel processo di cron, avremo errori dicendo che iptables non è stato trovato.

Naturalmente, dobbiamo fare /usr/local/sbin/blockhosts eseguibile:

chmod 700 /usr/local/sbin/blockhosts   

Quindi, creiamo un cron job come questo:

crontab -e
*/5 * * * *  /usr/local/sbin/blockhosts &> /dev/null

 

4 test

Ora si può provare a fare il login sul server tramite SSH e FTP con nomi utente/password errata. Dopo qualche tempo, dovrebbe essere in grado di connettersi al server a tutti che significa che ha bloccato. Cambiare indirizzo IP del vostro client e accedere alla shell del server nuovamente.

Correre

iptables -L

Si può vedere nell’output quali IP indirizzi ha bloccati:

Server2: ~ # iptables -L
Catena INPUT (policy ACCEPT)
target prot opt sorgente destinazione
blockhosts 0– ovunque ovunque

Catena in avanti (policy ACCEPT)
target prot opt sorgente destinazione

Catena OUTPUT (policy ACCEPT)
target prot opt sorgente destinazione

Blockhosts catena (1 riferimenti)
target prot opt sorgente destinazione
DROP 0– 192.168.0.93 ovunque
DROP 0– 192.168.0.92 ovunque
DROP 0– 192.168.0.91 ovunque
DROP 0– 192.168.0.94 ovunque
Server2: ~ #

Date un’occhiata alle /etc/hosts.allowGli stessi indirizzi IP dovrebbero essere elencati nella sezione #—BlockHosts aggiunte :

vi /etc/hosts.allow
[...]
#---- BlockHosts Additions
ALL: 192.168.0.94 : deny
ALL: 192.168.0.91 : deny
ALL: 192.168.0.92 : deny
ALL: 192.168.0.93 : deny

#bh: ip:    192.168.0.94 :   4 : 2007-09-05 16:59:47 CEST
#bh: ip:    192.168.0.91 :   4 : 2007-09-05 16:49:50 CEST
#bh: ip:    192.168.0.92 :   8 : 2007-09-05 16:40:23 CEST
#bh: ip:    192.168.0.93 :   4 : 2007-09-05 16:35:48 CEST

#bh: logfile: /var/log/auth.log
#bh: offset: 4563
#bh: first line:Jun 28 20:35:51 server2 login[2087]: (pam_unix) session opened for user root by (uid=0)

#bh: logfile: /var/log/proftpd/proftpd.log
#bh: offset: 15020
#bh: first line:Sep 05 16:04:34 server2.example.com proftpd[2355] server2.example.com: error setting IPV6_V6ONLY: Protocol not available

#---- BlockHosts Additions
[...]

Infine, si può anche dare un’occhiata a /var/log/blockhosts.log:

tail /var/log/blockhosts.log

[…]
blockhosts 2.0.5 iniziato: 2007-09-05 16:52:25 CEST
… echo tag::: ffff:192.168.0.94-sshd@::ffff:192.168.0.101
… caricare blockfile: /etc/hosts.allow
… trovato entrambi gli indicatori, conteggio degli eserciti guardandi: 3
… caricamento di file di log, offset: /var/log/auth.log 4018
… caricamento di file di log, offset: /var/log/proftpd/proftpd.log 12305
… ignorerà tutte le voci di host precedenti 2007-09-05 04:52:25 CEST
… aggiornamenti: conta: ospita al blocco: 3; padroni di casa guardandi: 3
… nessuna e-mail per inviare.

Piaciuto l'articolo? Condividilo sui social!

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp