Primo: i programmi di "sicurezza" devono necessariamente essere eseguiti con privilegi superiori a quelli di un utente normale. Questo comporta che, in caso di exploit di uno di questi componenti un attaccante (uomo, virus, trojan...) può prendere completamente il controllo del sistema e, come potete facilmente intuire, mettere a repentaglio la sicurezza dell'intera LAN. Il secondo punto rilevante è costituito dal fatto che questi prodotti, per garantire il massimo livello di protezione, spesso sono a pagamento.
Infine c'è la questione relativa a come windows gestisce i processi. Una delle tecniche più diffuse (e per questo meno funzionali oggi) per introdurre un malaware in un pc windows è quello di far eseguire il processo maligno nello spazio di memoria di un processo "benigno". Questo comporta che un antivirus non riconoscerà questo programma come virus con tutto quello che ne consegue.
Linux, invece, si comporta diversamente. In particolare le tecniche di iniezione di codice non funzionano, inoltre le possibilità di attacco risultano minori e più facilmente controllabili.
L'idea, quindi, è di realizzare una macchina virtuale che gira sulla mia macchina windows. Bisogna configurare la rete in modo che sia l'interfaccia virtuale a ricevere ed inviare, mentre l'interfaccia fisica (quella sulla macchina windows) sarà connessa solo all'interfaccia virtuale. Spero sia chiaro :). Il disegno seguente dovrebbe chiarire un po' la cosa:

Io per la virtualizzazione uso, di solito, Virtualbox. Creiamo una macchina virtuale, con circa 500 MB di ram ed un paio di GB di disco. Assegnamo una interfaccia di rete, in modalità bridge e una in modalità host only.

Normalmente il flusso di informazioni passerebbe attraverso la scheda di rete If 1 e poi verrebbe processato dal sistema. Utilizzando la soluzione fw interno, invece, il flusso è quello indicato in rosso. La scheda di rete If 1 viene bypassata e i dati passano attraverso la If 3. Le informazioni vengono processate dal firewall, escono dall'If 4 e rientrano nel sistema host attraverso la If 2. La scheda If 1 non può venire disabilitata, altrimenti non funzionerà neanche la If 3 che è in bridge sulla 1. Per "disattivare" la scheda è possibile impostare un ip fuori lan, in modo che non sia utilizzabili in ingresso e in uscita.
Installiamo una Debian minimale (consiglio di partire con una netinstall), selezionando quando necessario l'installazione minima.
Una volta installato il sistema dobbiamo prima di tutto rimuovere tutto ciò che può costituire un rischio di sicurezza. Installiamo openssh che non viene installato nella configurazione minima:
fwproxy:~# apt-get install openssh-server
Chiudiamo tutti i servizi non necessari che debian avvia di default:
fwproxy:~# netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:50478 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 10.41.113.24:22 10.41.113.23:4217 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:32777 0.0.0.0:*
udp 0 0 0.0.0.0:782 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 3963 /var/run/acpid.socket
unix 5 [ ] DGRAM 3946 /dev/log
unix 2 [ ] DGRAM 1926 @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 5711
unix 2 [ ] DGRAM 4342
unix 2 [ ] DGRAM 3965
fwproxy:~# lsof -i:50478
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
rpc.statd 1454 statd 8u IPv4 3587 TCP *:50478 (LISTEN)
fwproxy:~# lsof -i:111
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
portmap 1443 daemon 4u IPv4 3529 UDP *:sunrpc
portmap 1443 daemon 5u IPv4 3530 TCP *:sunrpc (LISTEN)
fwproxy:~# lsof -i:25
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
exim4 1933 Debian-exim 3u IPv4 4160 TCP localhost:smtp (LISTEN)
fwproxy:~# /etc/init.d/exim4 stop
Stopping MTA: exim4_listener.
fwproxy:~# apt-get purge exim4*
...
fwproxy:~# /etc/init.d/portmap stop
fwproxy:/etc# update-rc.d -f portmap remove
Removing any system startup links for /etc/init.d/portmap ...
/etc/rc0.d/S32portmap
/etc/rc1.d/K81portmap
/etc/rc6.d/S32portmap
/etc/rcS.d/S43portmap
fwproxy:/etc/init.d# ./nfs-common stop
Stopping NFS common utilities: statd.
fwproxy:/etc/init.d# netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 152 10.41.113.254:22 10.41.113.23:1416 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 3936 /var/run/acpid.socket
unix 5 [ ] DGRAM 3919 /dev/log
unix 2 [ ] DGRAM 1926 @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 5040
unix 2 [ ] DGRAM 4351
unix 2 [ ] DGRAM 3938
Non mi serviva exim (MTA, mail transport agent) ne nessun altro sistema di ricezione/recapito mail. Mediante apt-get purge ho rimosso anche i file di configurazione. Il servizio offerto da portmap è utile praticamente solo se si vuole utilizzare nfs. Siccome ci sono un sacco di buchi di sicurezza è buona norma disabilitarlo (a meno che non serva). Analogo discorso per nfs-common. Se dovete usare nfs è necessario che entrambi i servizi siano attivi.
Come si può vedere dall'output del comando netstat -na non ci sono più (a parte il demone ssh ed una connesisone) servizi in ascolto.
Chiusi i servizi passiamo all'hardening. Io utilizzo, di solito, bastille.
fwproxy:/etc/init.d# apt-get install bastille
Prima di utilizzare bastille bisogna fare un piccolo trucco. Anche se scaricato dai repository lenny la versione di bastille sembra non supportare debian 5. Per fare questo bisogna editare il file /etc/debian_version e sostituire il 5 con un 4.
Rapidamente i vari passaggi. Usando il comando bastille -c si lancia il programma con l'interfaccia curses.
La prima schermata è introduttiva. La seconda schermata richiede se si vuole restringere l'accesso a programmi amministrativi. Il default è no, però io direi di rispondere si. Non c'è motivo per il quale un utente normale dovrebbe poter usare programmi come ifconfig o fsck. La terza schermata spiega il contenuto della quarta. In sostanza, completando quanto fatto in precedenza, si chiede se si vuole disabilitare il setuid sui comandi mount/umount. Rispondendo yes si ha, come effetto, che solo root può montare fs, cdrom, floppy... cosa che sarebbe sempre da preferirsi. La stessa domanda (e risposta) vale per ping. Un utente normale non dovrebbe avere necessità di usare il ping. La domanda successiva è se si vuole o meno disabilitare i protocolli in chiaro. Yes, ovviamente :)
Proseguendo il programma ci chiede se vogliamo imporre la scadenza della password (dipende...in linea di massima si), se si vuole limitare a root l'uso di cron (si, assolutamente), se si vuole impostare una umask di default (si,077 come valore nella schermata successiva). Successivamente ci viene chiesto se disabilitare il login di root sui tty, cioè in pratica impedire che root si possa connettere direttamente. La mia politica è che root non deve potersi loggare mai direttamente, ma che si possa diventare root mediante switch user (su, sudo,...). Al passo successivo è possibile inserire una password su grub. Io lo sconsiglio. Ci sono poi una serie di altre pagine, potete scegliere valori diversi dal default ma io vi consiglierei di lasciare tutto così come è. Occhio a questa domanda "Would you like to run the packet filtering script?" qui dovete rispondere no (il fw lo mettiamo a parte, non usiamo il bastille firewall).
A questo punto, terminata l'applicazione di Bastille, abbiamo il sistema con l'interfaccia eth0 esposta verso la wan e l'interfaccia eth1 esposta solo verso il server da proteggere (la macchina host).
Installiamo il firewall, in debian il pacchetto si chiama arno-iptables-firewall, non ha una gui di installazione/configurazione, ma si configura con debconf.
Durante l'installazione il sistema ci chiede se vogliamo configurare il fw con debconf, rispondiamo si (altrimenti, per chi è meno pigro di me e vuole sperimentare la potenza di iptables, si possono inserire a mano le regole).
Primo passo: indicare l'interfaccia esterna. E' quella che si affaccia sulla rete non sicura, è l'interfaccia in bridge (eth0 nel mio caso)
Secondo passo: se la macchina (l'host windows) da proteggere esporta dei servizi TCP verso l'esterno (web server e quant'altro) allora quando richiesto vanno inserite le porte che devono essere raggiungibili dall'esterno. Nel mio caso lascio tutto in bianco dato che non devo esportare servizi.
Terzo passo: analogamente al secondo passo, ma per i servizi UDP
Quarto passo: definizione dell'interfaccia interna. E' l'interfaccia che sta sulla rete sicura, nel caso in esame è l'interfaccia host only, eth1.
Quinto passo: definizione della rete interna. Bisogna indicare quali sono le sottoreti sicure. Ad esempio 192.168.12.0/24. Questa è la lan che ho definito come sicura.
Fine, se premete "si" viene applicato subito il fw, altrimenti se volete rivedere la configurazione premete "no".
Una volta avviato il fw viene stampata la lista delle regole/opzioni. Nel mio caso:
Arno's Iptables Firewall Script v1.8.8o
-------------------------------------------------------------------------------
Sanity checks passed...OK
Stopping (user) plugins (if used)...
Checking/probing Iptables modules:
Module check done...
Configuring /proc/.... settings:
Enabling anti-spoof with rp_filter
Enabling SYN-flood protection via SYN-cookies
Disabling the logging of martians
Disabling the acception of ICMP-redirect messages
Setting the max. amount of simultaneous connections to 16384
Setting default conntrack timeouts
Enabling protection against source routed packets
Enabling reduction of the DoS'ing ability
Setting Default TTL=64
Disabling ECN (Explicit Congestion Notification)
Enabling support for dynamic IP's
Flushing route table
/proc/ setup done...
Setting up firewall chains
Setting default INPUT/FORWARD policy to DROP
Using loglevel "info" for syslogd
Setting up firewall rules:
-------------------------------------------------------------------------------
Accepting packets from the local loopback device
Enabling setting the maximum packet size via MSS
Enabling mangling TOS
Logging of stealth scans (nmap probes etc.) enabled
Logging of packets with bad TCP-flags enabled
Logging of INVALID TCP packets disabled
Logging of INVALID UDP packets disabled
Logging of INVALID ICMP packets disabled
Logging of fragmented packets enabled
Logging of access from reserved addresses enabled
Setting up (antispoof) INTERNAL net(s): 192.168.12.0/24
Reading custom rules from /etc/arno-iptables-firewall/custom-rules
Checking for (user) plugins in /usr/share/arno-iptables-firewall/plugins...
UPnP plugin v0.12
Loaded 1 plugin(s)...
Setting up INPUT policy for the external net (INET):
Enabling support for DHCP-assigned-IP (DHCP client)
Logging of explicitly blocked hosts enabled
Logging of denied local output connections enabled
Packets will NOT be checked for private source addresses
Denying the whole world to send ICMP-requests(ping)
Logging of dropped ICMP-request(ping) packets enabled
Logging of dropped other ICMP packets enabled
Logging of possible stealth scans enabled
Logging of (other) connection attempts to PRIVILEGED TCP ports enabled
Logging of (other) connection attempts to PRIVILEGED UDP ports enabled
Logging of (other) connection attempts to UNPRIVILEGED TCP ports enabled
Logging of (other) connection attempts to UNPRIVILEGED UDP ports enabled
Logging of other IP protocols (non TCP/UDP/ICMP) connection attempts enabled
Logging of ICMP flooding enabled
Setting up OUTPUT policy for the external net (INET):
Allowing all (other) ports/protocols
Applying INET policy to external interface: eth0 (without an external subnet specified)
Setting up INPUT policy for internal (LAN) interface(s): eth1
Allowing ICMP-requests(ping)
Allowing all (other) ports/protocols
Setting up FORWARD policy for internal (LAN) interface(s): eth1
Logging of denied LAN->INET FORWARD connections enabled
Setting up LAN->INET policy:
Allowing ICMP-requests(ping)
Allowing all (other) ports/protocols
Security is ENFORCED for external interface(s) in the FORWARD chain
Jun 12 18:21:35 All firewall rules applied.
********
ATTENZIONE
********
da qui in avanti potreste perdere la connettività internet fino a completamento dell'installazione/configurazione
Adesso che il fw è configurato dobbiamo far girare su eth1 (interfaccia interna) un server dhcp che dia l'ip alla macchina host.
fwproxy:~# apt-get install dhcp3-server
Il tentativo di avvio automatico a seguito dell'installazione ovviamente fallisce, in quanto bisogna prima configurare il servizio. Il mio primo semplicissimo file di configurazione del servizio dhcpd contiene :
fwproxy:~# vi /etc/dhcp3/dhcpd.conf
...
subnet 192.168.12.0 netmask 255.255.255.0 {
range 192.168.12.10 192.168.12.20;
option routers 192.168.12.1;
option domain-name-servers 192.168.12.1 ;
}
...
E' necessario che la scheda interna (quella che sta sulla reta 192.168.12) abbia ip statico (altrimenti non funziona il dhcpd...), pertanto ho editato il file /etc/network/interfaces nella sequente maniera. Si noti che il gateway della scheda interna corrisponde all'ip della scheda esterna. Questo garantisce il corretto flusso dei pacchetti:
#eth0 interfaccia esterna, verso la lan 10.41.113.*
allow-hotplug eth0
iface eth0 inet static
address 10.41.113.23
netmask 255.255.255.0
network 10.41.113.0
broadcast 10.41.113.255
gateway 10.41.113.3
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 10.41.35.54
#eth1 interfaccia interna verso la lan 192.168.12.*
auto eth1
iface eth1 inet static
address 192.168.12.1
netmask 255.255.255.0
network 192.168.12.0
broadcast 192.168.12.255
gateway 10.41.113.23
infine ho modificato il file di configurazione di default di dhcpd /etc/default/dhcp3-server:
INTERFACES="eth1"
indicando così che il server dhcpd deve girare solo sulla eth1.
A questo punto, dopo un reboot, dovrebbe funzionare tutto. Testiamo dal fw se è pingabile l'host protetto (la macchina windows) e se è raggiungibile la lan esterna (il gw 10.41.113.3):
C:\>ping 192.168.12.1
Pinging 192.168.12.1 with 32 bytes of data:
Reply from 192.168.12.1: bytes=32 time<1ms ttl="64" bytes="32" ttl="64" sent =" 2," received =" 2," lost =" 0" minimum =" 0ms," maximum =" 0ms," average =" 0ms">ping 10.41.113.3
Pinging 10.41.113.3 with 32 bytes of data:
Reply from 10.41.113.3: bytes=32 time=1ms TTL=254
Reply from 10.41.113.3: bytes=32 time=1ms TTL=254
Ping statistics for 10.41.113.3:
Packets: Sent = 2, Received = 2, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 1ms, Maximum = 1ms, Average = 1ms
Control-C
^C
C:\>
La configurazione delle schede di rete finale diventa, quindi:
Lato FW:
fwproxy:~# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:4b:97:f9
inet addr:10.41.113.23 Bcast:10.41.113.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe4b:97f9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:71391 errors:29 dropped:0 overruns:0 frame:0
TX packets:22338 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:38669375 (36.8 MiB) TX bytes:3468754 (3.3 MiB)
Interrupt:11 Base address:0xc020
eth1 Link encap:Ethernet HWaddr 08:00:27:cf:1f:0a
inet addr:192.168.12.1 Bcast:192.168.12.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fecf:1f0a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26474 errors:2 dropped:0 overruns:0 frame:0
TX packets:27757 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3536356 (3.3 MiB) TX bytes:31437076 (29.9 MiB)
Interrupt:10 Base address:0xc240
eth0 = If 3
eth1 = If 4
Lato HOST:
C:\>ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 10.10.10.23
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.10.10.3
Ethernet adapter Local Area Connection 3:
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 192.168.12.10
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.12.1
Ethernet adapter Local Area Connection = If 1
Ethernet adapter Local Area Connection 3 = If 2
A questo punto il firewall è correttamente configurato. Si tenga conto che con questa configurazione i servizi come messenger, skype... potrebbero non funzionare. Potrebbe essere necessario aprire delle porte sul fw. Per fare questo o si edita a mano il file delle regole oppure si usa il comando dpkg-reconfigure arno-iptables-firewall e, quando richiesto, si inseriscono le porte tcp/udp necessarie.
Nella prossima puntata aggiungeremo le funzioni di proxy.


0 commenti:
Posta un commento