28/04/2009

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 script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script 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.

 

19:57 Scritto da: nazarenolatella in Sicurezza | Link permanente | Commenti (12) | Segnala | OKNOtizie |  Facebook

11/04/2009

Flashing Fonera

Salve. Dopo vari tentativi e seguendo diverse guide reperite su internet (oltre all'aiuto di f0ll3) sono riuscito finalmente a flashare la mia Fonera (potete acquistarla on line collegandovi al sito http://www.fon.com/it/), installandoci DD-WRT e trasformandola in un router wireless a tutti gli effetti. La procedura è molto semplice, basta operare come segue:
1) E' necessario scaricare la giusta release del firmware DD-WRT dal sito ufficiale (è gratuito). Quella da me utilizzata è v24 RC6.2, poichè supporta anche funzionalità di repeater. Il link è il seguente: http://www.dd-wrt.com/dd-wrtv2/downloads/obsolete/release candidates/DD-WRT v24 RC6.2/Atheros WiSoc/Fonera;
2) Una volta terminato il download dei file vmlinuz.bin e root.fs, bisogna rinominarli rispettivamente in vmlinuz.lzma e root.bin;
3) Fatto ciò si può scaricare il seguente programmino: ap51-flash-fonera-gui-1.0-38.exe reperibile a questo indirizzo: http://download.berlin.freifunk.net/fonera/. Affinchè tale applicativo funzioni corettamente occorre installare winpcap (lo trovate su http://www.mirrorservice.org/sites/ftp.wiretapped.net/pub...);
Ora abbiamo tutti gli strumenti necessari per fare in modo che il flashing vada a buon fine. Avviamo dunque ap51-flash-fonera-gui-1.0-38.exe e mettiamo una spunta su "Use External File" nella sezione Rootfs e Kernel selezionando rispettivamente i file root.bin e vmlinuz.lzma. Inseriamo anche un check su "Create NVRAM Partition (for DD-WRT)" e nella sezione "Interface" selezioniamo la nostra scheda di rete (Ethernet).
d5753b227322d01ab45acc3086bab96a.jpg
Colleghiamo la nostra Fonera al pc tramite cavo UTP (il classico cavo in dotazione) senza attaccarla però all'alimentazione. Clickiamo sul pulsante "Go!" del programmino e dopo circa 5-6 "No packet" possiamo inserire il cavetto di alimentazione ed accendere dunque la nostra Fonera. Dopo qualche secondo sarà lo stesso programmino ad individuare l'indirizzo IP del dispositivo in questione ed inizierà quindi la procedura di flashing vera e propria. Tale operazione potrebbe richiedere diverso tempo (circa 20 minuti), ergo è di vitale importanza NON CHIUDERE IL PROGRAMMINO STESSO poichè, a procedura completata, si chiuderà da solo.
Bene, finalmente sulla nostra Fonera è in esecuzione DD-WRT anzichè il firmware originale. Non ci resta che configurarla opportunamente per poter sfruttare al meglio tutte le sue potenzialità.
Colleghiamoci all'indirizzo 192.168.1.1 tramite browser. In tal modo potremo accedere all'interfaccia di configurazione e sotto la sezione "Setup", accessibile inserendo i dati di login "root" come userid ed "admin" come password, sarà possibile settare alcuni parametri importati quali indirizzo IP del dispositivo, Gateway, DNS locale ed abilitare o disabilitare il server DHCP.
La guida termina qui. Tempo permettendo pubblicherò un howto su come impostare la nostra fonera in modo che funzioni da repeater. A presto :)

19:36 Scritto da: nazarenolatella in Networking | Link permanente | Commenti (0) | Segnala | OKNOtizie |  Facebook