Be aware of pinciaoche™
Friday, December 1st, 2006
Continuano le difficoltà nasali, visto che mi sono preso un raffreddore coi fiocchi (nel naso), di quelli che non ti lasciano respirare insomma. E questo mi dispiace visto che volevo fare una capatina da HM. Di studiare in queste condizioni ovviamente non se ne parla, perciò penso che passerò la giornata davanti a Warcraft 3. Nei momenti liberi terminerà di traslocare.
Eh si, perché ho cambiato stanza. Adesso occupo una stanza molto più grande, anche se non ho veramente nulla da ridire nei confronti della vecchia stanza, che, come recita questo post è in grado di accogliere in maniera più che confortevole ben quattro persone.
Oltre a questo ieri io e il mio socio brail (ma lui preferirebbe essere chiamato presidente, d’altro canto io preferirei chiamarlo pinciaoche, mangiamerda, gettafumo, tegolaro) abbiamo consegnato il progetto di Sicurezza nei sistemi di calcolo: un firewall con iptables.
Figurone, valutato come più che ottimo e con tanto di domanda
Ma voi questo lo fate per lavoro?
Insomma siamo stati dei fighi, perciò niente di nuovo.
Ovviamente abbiamo dovuto studiare, e un ringraziamento particolare e sentito va a Simone Piccardi autore di ottima documentazione riguardante l’argomento. Ho appena saputo che Simone ha apprezzato molto i nostri ringraziamenti
. Grazie ancora!
Segue la parte tecnica, insomma, il firewall, che magari potrà essere d’utilità per qualcuno. (Trenqui Lagranz, tanto chi ci viene qui?)
#!/bin/sh # # Progetto di Sicurezza nei sistemi di calcolo per l'anno 2006/2007 # # Luca Bagante 4XXXXX # Stefano Lampis 4XXXXX # # # Scenario # # Nel nostro scenario abbiamo 5 host appartenenti a 4 sottoreti di classe C. # 10.126.0.1 su tap0 : Computer in DMZ con in esecuzione i servizi www domain # smtp imap2 # 10.126.0.2 su tap0 : In realta` si tratta dello stesso host di sopra, con un # ulteriore indirizzo IP allo scopo di simulare un altro host # che faccia da mirror al web server dell'host precedente. # 10.126.1.1 su tap1 : Host nella rete degli uffici. # 10.126.2.1 su tap2 : Host nella rete degli uffici cui e` proibita la navigazione nel web. # 10.126.3.1 su tap3 : Computer adibito all'amministrazione, da qui l'amministratore puo` # collegarsi via SSH al firewall. # # NOTA # Al fine di abilitare il NAT abbiamo nascosto le sottoreti virtuali al # router centrale. Abbiamo cambiato gli indirizzi IP # da 10.26.Y.1 # a 10.126.Y.1 # # # Protezioni a livello kernel # # Queste protezioni possono (e molte lo sono) essere attivate via iptables # ma nel campo della sicurezza la ridondanza non fa mai male. # # Protezione per i pacchetti di tipo echo request diretti in broadcast echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Disabilita i pacchetti il cui instradamento è insito nel pacchetto stesso. echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route # Protezione da attacchi di tipo syn flood. # Potrebbe degradare le prestazioni, inoltre nel kernel è disabilitato di # default. #echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Disabilita i pacchetti ICMP di tipo redirect echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Disabilita l'invio dei pacchetti di sopra echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # Abilita la protezione antispoofing echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # Effettua il log dei pacchetti con indirizzi impossibili. echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # # Politiche # # Vogliamo che di default vengano scartati tutti i pacchetti. iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # Riportiamo tutto allo stato iniziale, azzerando catene, regole, contatori, # nel caso che lo script venga invocato direttamente piuttosto che da un altro # script sysVinit-like. iptables -F iptables -X iptables -Z iptables -t nat -F iptables -t mangle -F # # Catene definite dall'utente # # Per prima cosa stabiliamo una serie di regole relative ai pacchetti da # accettare in più circostanze e mettiamole in una nuova catena. # La ricezione di questi pacchetti è sempre sicura. iptables -N allowed # Questo va fatto per consentire i pacchetti appartenenti a connessioni # stabilite o correlate. iptables -A allowed -m state --state ESTABLISHED,RELATED -j ACCEPT # Consentiamo i pacchetti ICMP non pericolosi, o utili. iptables -A allowed -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A allowed -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A allowed -p icmp --icmp-type echo-request -j ACCEPT iptables -A allowed -p icmp --icmp-type fragmentation-needed -j ACCEPT # Creiamo una catena per i servizi raggiungibili dall'esterno. iptables -N services # Webserver e mirror. iptables -A services -d 10.126.0.1 -p tcp -m multiport \ --destination-ports 80,443 -j ACCEPT iptables -A services -d 10.126.0.2 -p tcp -m multiport \ --destination-ports 80,443 -j ACCEPT # Posta iptables -A services -d 10.126.0.1 -p tcp -m multiport --destination-ports \ 25,143 -j ACCEPT # Altro servizio iptables -A services -d 10.126.0.1 -p tcp --dport 8080 -j ACCEPT # DNS iptables -A services -d 10.126.0.1 -p udp --dport 53 -j ACCEPT # Raggruppa in maniera logica tutto il traffico tra le sottoreti e verso # Internet iptables -N forwarding # La DMZ esce via http e ftp solo per effettuare gli aggiornamenti da # security.debian.org che facciamo corrispondere a server.math.unipd.it # in mancanza di accessi verso Internet. iptables -A forwarding -m state --state NEW -p tcp -i tap0 -o eth0 \ -s 10.126.0.0/24 -d security.debian.org -m multiport --destination-ports \ 21,80 -j ACCEPT # La DMZ può contattare DNS server all'esterno. iptables -A forwarding -m state --state NEW -p udp -i tap0 -o eth0 \ -s 10.126.0.0/24 --dport 53 -j ACCEPT # La sottorete in tap1 può accedere ai seguenti servizi. iptables -A forwarding -m state --state NEW -p tcp -i tap1 -o eth0 \ -s 10.126.1.0/24 -m multiport --destination-ports 21,22,25,80,110,143,443 \ -j ACCEPT iptables -A forwarding -m state --state NEW -p tcp -i tap1 -o tun0 \ -s 10.126.1.0/24 --dport 80 -j ACCEPT # NASELLO # Meta` della sottorete non puo` uscire via SSH. # iptables -A forwarding -m state --state NEW -p tcp -i tap2 -o eth0 \ # -s 10.126.2.0/25 --dport 22 -j DROP # La sottorete in tap2 può accedere ai servizi di sopra tranne la navigazione # sul web. iptables -A forwarding -m state --state NEW -p tcp -i tap2 -o eth0 \ -s 10.126.2.0/24 -m multiport --destination-ports 21,22,25,110,143 -j ACCEPT # La sottorete in tap3 può accedere agli stessi servizi di quella in tap1. iptables -A forwarding -m state --state NEW -p tcp -i tap3 -o eth0 \ -s 10.126.3.0/24 -m multiport --destination-ports 21,22,25,80,110,143,443 \ -j ACCEPT # Tutte le sottoreti hanno accesso alla DMZ per cio` che riguarda i servizi elencati. iptables -A forwarding -m state --state NEW -p tcp -i tap+ -o tap0 \ -s 10.126.0.0/16 -d 10.126.0.0/24 -m multiport --destination-ports \ 22,25,80,143,443,8080 -j ACCEPT iptables -A forwarding -m state --state NEW -p udp -i tap+ -o tap0 \ -s 10.126.0.0/16 -d 10.126.0.0/24 --dport 53 -j ACCEPT iptables -A forwarding -m state --state NEW -p tcp -i tun0 -o tap0 \ -d 10.126.0.0/24 -m multiport --destination-ports \ 25,80,143,443,8080 -j ACCEPT # # Attuazione delle regole # # INPUT chain #iptables -A INPUT -j LOG --log-prefix "INPUT" # Il firewall accetta sempre connessioni generate localmente. iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # Protezione contro lo spoof degli indirizzi IP. iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s ! 192.168.84.0/24 -j DROP iptables -A INPUT -j allowed # OpenVPN # Inseriamo un controllo anche sul MAC address. Questo ovviamente e` possibile # solo nella nostra realta` dove i due estremi della VPN risiedono sullo # segmento di rete. iptables -A INPUT -m state --state NEW -p udp -s 192.168.84.27 \ -m mac --mac-source 00:12:3f:ab:01:e1 --dport 1194 -j ACCEPT # Consente a questo host che fa parte dell'amministrazione di connettersi # via SSH. iptables -A INPUT -m state --state NEW -p tcp -i tap3 -s 10.126.3.1 --dport 22 \ -j ACCEPT # Log di tutto il resto iptables -A INPUT -j LOG --log-prefix "INPUT DROP: " # OUTPUT chain # Le connessioni dirette a localhost sono sempre permesse. iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -j allowed iptables -A OUTPUT -p udp -d 192.168.84.27 --dport 1194 -j ACCEPT # Il firewall può collegarsi a Internet solo per effettuare gli aggiornamenti. iptables -A OUTPUT -m state --state NEW -p tcp -o eth0 -d security.debian.org \ -m multiport --ports 21,80 -j ACCEPT # Il firewall può interrogare server DNS esterni e quello in DMZ. iptables -A OUTPUT -m state --state NEW -p udp --dport 53 -o eth0 -j ACCEPT iptables -A OUTPUT -m state --state NEW -p udp --dport 53 -o tap0 -j ACCEPT # Log di tutto il resto iptables -A OUTPUT -j LOG --log-prefix "OUTPUT DROP: " # FORWARD chain iptables -A FORWARD -j allowed # Servizi raggiungibili dall'esterno iptables -A FORWARD -i eth0 -o tap0 -m state --state NEW -j services # Pacchetti che vengono instradati iptables -A FORWARD -i tap+ -j forwarding iptables -A FORWARD -i tun0 -j forwarding # Log di tutto il resto iptables -A FORWARD -j LOG --log-prefix "FORWARD DROP: " # # NAT # # Per prima cosa dobbiamo mascherare i pacchetti, poiché escono tutti # con lo stesso IP. iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.84.26 # Log di tutto il resto iptables -t nat -A POSTROUTING -o eth0 -j LOG --log-prefix "POSTROUTING DEBUG: " # Il webserver in DMZ è raggiungibile dall'esterno. # Vengono specificati due indirizzi IP perché nel nostro immaginario esistono # un web server e un suo mirror. # In questo modo si ottiene una forma semplificata di bilanciamento del carico. iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \ --to-destination 10.126.0.1-10.126.0.2 # Anche il server smtp e imap iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --destination-ports \ 25,143,8080 -j DNAT --to-destination 10.126.0.1 # Anche il server DNS. iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT \ --to-destination 10.126.0.1 # Log di tutto il resto iptables -t nat -A PREROUTING -i eth0 -j LOG --log-prefix "PREROUTING DEBUG: "
