Il blog sull'informatica

Linux: creare una rete Bastion Host con DMZ

Dopo aver parlato di alcune tra le possibili topologie di una rete facente uso dei cosiddetti Bastion Host, vediamo come configurare una DMZ posta dietro uno screened router e collegata all’altra estremità con un dual homed firewall, il quale svolge anche operazioni di routing e di port forwarding.

In particolare, ecco come si sviluppa la nostra piccola rete:

Screened router -> DMZ -> Bastion Host -> LAN

dove alla DMZ non andremo a collegare nessun host che deve fornire servizi (HTTP, FTP ecc.) contattabili dal network esterno (Internet), ma serve solo come link point-to-point tra lo screened router ed il Bastion Host.

Passiamo ora alla configurazione vera e propria del Bastion Host (basato su Debian). Come già detto in precedenza, esso è un dual-homed firewall, cioè è dotato di due schede di rete: eth0, alla quale è connessa la nostra LAN ed eth1, alla quale è collegata la DMZ.

Poichè trattasi di un collegamento point-to-point, può essere utilizzata la seguente subnet mask: 255.255.255.252, che in termini di CIDR viene rappresentata come una /30 (4 indirizzi in tutto di cui solo 2 utilizzabili). Assegniamo quindi all’interfaccia eth1 l’indirizzo IP 192.168.1.2, come subnet quella sopra citata e come gateway l’indirizzo del router, cioè 192.168.1.1. Possiamo eseguire tale operazione mediante il comando ifconfig oppure modificando il file /etc/network/interfaces:

root@nightbox:~$ nano /etc/network/interfaces

ed inseriamo le seguenti stringhe:

#Interfaccia esterna

auto eth1

iface auto inet static

address 192.168.1.2

netmask 255.255.255.252

network 192.168.1.0

broadcast 192.168.1.3

gateway 192.168.1.1

Andiamo ad impostare i DNS per la risoluzione dei nomi (altrimenti non potremmo navigare):

root@nightbox:~$ nano /etc/resolv.conf

ed inseriamo i seguenti parametri:

nameserver 151.99.125.2

nameserver 151.99.125.3

oppure i DNS forniti dal vostro ISP (potete utilizzare anche OpenDNS).

Proviamo adesso a pingare prima il router e successivamente google. Se ai ping seguono delle reply (in gergo “pong”), vuol dire che la configurazione è corretta.

Passiamo adesso alla scheda collegata alla LAN, cioè eth0. Associamola all’indirizzo 10.0.0.1 con subnet 255.255.255.0 (/24) e non definiamo alcun gateway.

root@nightbox:~$ nano /etc/network/interfaces

#Interfaccia Interna

auto eth0

iface auto inet static

address 10.0.0.1

netmask 255.255.255.0

network 10.0.0.0

broadcast 10.0.0.255

Proviamo a pingare un qualsiasi host della LAN e se risponde vuol dire che anche tale configurazione risulta valida.

Bene, ora è necessario abilitare la comunicazione tra la scheda interna e quella esterna (disabilitata di default per motivi di sicurezza). Per fare ciò basta modificare il contenuto del file /proc/sysnet/ipv4/ip_forward inserendo al suo interno il valore 1 anzichè 0.

Poichè tale operazione deve essere eseguita in automatico ad ogni avvio del sistema, possiamo posizionare la seguente stringa all’interno del file /etc/rc.local e, per la precisione, tra i commenti ed exit 0.

#!/bin/sh -e
#
# rc.local
#
# This scrip is executed at the end of each multiuser runlevel.
# Make sure that the scrip will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this scrip just change the execution
# bits.
#
# By default this scrip does nothing.

#Attivo la comunicazione tra le due NIC

echo 1 > /proc/sys/net/ipv4/ip_forward

exit 0

Affinchè però un qualsiasi host della nostra LAN possa “uscire” su internet (cioè venga messa in sharing la connessione) è necessario attivare il  masquerading, conosciuto anche come NAT (Network Address Translation). Possiamo farè ciò servendoci di iptables, cioè l’interfaccia testuale di NetFilter, il firewall installato di default in quasi tutte le distribuzioni linux:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

In questo modo, gli indirizzi della nostra LAN verranno tradotti in indirizzi della DMZ e successivamente in indirizzo IP pubblico grazie allo screened router.

Definiamo adesso le policy di default per il nostro firewall:

 iptables -P INPUT DROP
 iptables -P OUTPUT ACCEPT
 iptables -P FORWARD DROP

Queste policy fanno in modo che qualunque pacchetto ricevuto in ingresso dal firewall venga scartato. Stesso discorso vale per un qualunque pacchetto che transita da una scheda di rete all’altra (forward).

Fatto ciò occorre che il firewall accetti in ingresso i pacchetti provenienti dalla nostra LAN, ovvero dall’interfaccia eth0:

iptables -P INPUT -i eth0 -j ACCEPT

Devono essere accettati in ingresso anche i pacchetti relativi ad una connessione già aperta, ad esempio una navigazione mediante browser:

iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

Adesso settiamo le regole per lo scambio di pacchetti tra le due schede di rete. In particolare, possono transitare dalla scheda di rete esterna (eth1) alla scheda di rete interna (eth0) soltanto i pacchetti associati ad una qualsiasi connessione proveniente dalla nostra LAN:

iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Infine, permettiamo il transito di tutti i pacchetti provenienti dalla scheda interna verso quella esterna:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

Ora non ci resta che settare il port forwarding per eventuali applicativi p2p:

iptables -t nat -A PREROUTING -p tcp --dport 4711 -i eth1 -j DNAT --to 10.0.0.3
iptables -t nat -A PREROUTING -p tcp --dport 4652 -i eth1 -j DNAT --to 10.0.0.4
iptables -t nat -A PREROUTING -p udp --dport 5889 -i eth1 -j DNAT --to 10.0.0.4
iptables -t nat -A PREROUTING -p tcp --dport 4662 -i eth1 -j DNAT --to 10.0.0.2
iptables -t nat -A PREROUTING -p udp --dport 4672 -i eth1 -j DNAT --to 10.0.0.2

Altre rules che potremo definire sono quelle contro l’IP Spoofing, il DoS ed eventuali trojan:

#IP Spoofing

iptables -A INPUT -s 10.0.0.0/8 -i eth1 -j DROP
iptables -A FORWARD -s 10.0.0.0/8 -i eth1 -j DROP

iptables -A INPUT -s 172.16.0.0/12 -i eth1 -j DROP
iptables -A FORWARD -s 172.16.0.0/12 -i eth1 -j DROP

iptables -A INPUT -s 192.168.1.1 -i eth1 -j ACCEPT
iptables -A FORWARD -s 192.168.1.1 -i eth1 -j ACCEPT

iptables -A INPUT -s 192.168.0.0/16 -i eth1 -j DROP
iptables -A FORWARD -s 192.168.0.0/16 -i eth1 -j DROP

iptables -A INPUT -s 224.0.0.0/3 -j DROP
iptables -A FORWARD -s 224.0.0.0/3 -j DROP

iptables -A INPUT -s 127.0.0.1 -i eth1 -j DROP
iptables -A FORWARD -s 127.0.0.1 -i eth1 -j DROP

# Trojan (elite ports)

iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
iptables -A OUTPUT -o eth0 -p tcp --dport 31338 --sport 31338 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31338 --sport 31338 -j DROP
iptables -A OUTPUT  -o eth0 -p tcp --dport 31339 --sport 31339 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31339 --sport 31339 -j DROP
iptables -A OUTPUT -o eth0 -p tcp --dport 31340 --sport 31340 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31340 --sport 31340 -j DROP

#DoS

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Possiamo anche definire qualche regola per il controllo delle sessioni (Stateful Inspection):

#Stateful Inspection

iptables -A INPUT -m state --state INVALID -j DROP

NB: le regole vengono applicate in ordine sequenziale, ovvero seguendo l’ordine di inserimento. Nel caso in cui un dato pacchetto non rispetti nessuna delle regole precedentemente definite verranno applicate le policy di default.

Per evitare che questi comandi vengano inseriti manualmente dopo ogni riavvio del sistema, possiamo tranquillamente posizionarli all’interno del file rc.local, sempre prima della chiamata exit 0.

Abbiamo quasi completato la configurazione del nostro Bastion Host. Non ci resta che installare un IDS (Intrusion Detection System).

Quello che consiglio (perchè molto semplice ed affidabile) è snort (IDS net-based). Installiamolo sulla nostra macchina e successivamente configuriamolo tramite debconf (la rete interna deve essere identificata dagli indirizzi 10.0.0.0 e 192.168.1.0 mentre quella esterna con ANY):

root@nightbox:~$ apt-get install snort

visualizziamo il file di configurazione per vedere se è tutto a norma:

root@nightbox:~$nano /etc/snort/snort.conf

l’output dovrà essere il seguente (per le sezioni che abbiamo precedentemente configurato):

var HOME_NET [10.0.0.0/24,192.168.1.0/29]

var EXTERNAL_NET any

possiamo anche scegliere il grado di accuratezza del file di log impostandolo da 0 (molto basso – minor spreco di risorse) a  1, 2 ecc..

Vediamo adesso se dopo l’installazione snort è attivo. Per fare ciò digitiamo:

root@nightbox:~$ ps aux | grep snort

nel caso in cui non risulti avviato, facciamolo noi tramite il comando:

root@nightbox:~$ /etc/init.d/snort start

Infine, per visualizzare gli alert basta leggere il file /var/log/snort/alert

root@nightbox:~$ cat /var/log/snort/alert

Ora la nostra LAN può ritenersi “sicura”. A presto.

 

Linux: creare una rete Bastion Host con DMZultima modifica: 2009-04-28T19:57:00+02:00da
Reposta per primo quest’articolo