#------------------------------------------------------------------------------# Primo test di configurazione di firewall con PF e OpenBSD d0t 23 6 4 #------------------------------------------------------------------------------# Obiettivo: Configurare un firewall con OpenBSD e PF (PacketFilter) per un ambiente client Scenario: -Pc connesso alla rete con indirizzo 192.168.0.252 -Rete aziendale 192.168.0.0/24 -Router 192.168.0.51 -DNS 192.168.0.69 -DNS2 192.168.0.70 Firewall: Bloccare con un policy di default (drop) tutto il traffico Inserire regole antispoofing Normalizzare i pacchetti in entrata Utilizzare il QoS in modo che dia solamente 1% della banda disponibile ad ssh Permettere al client in 'uscita' tutto il traffico [TCP,UDP,ICMP] Limitare al client in 'entrata' solamente ssh [TCP port 22] dall'indirizzo 192.168.200.102 Rispondere ai pacchetti in drop con un TCP RST #------------------------------------------------------------------------------# NOTA: Il packet filter di OpenBSD, da documentazione, richiede un certo ordine di impostazione delle regole, tale ordine e': * Macros * Tables * Options * Scrub * Queueing * Translation * Filter Rules #------------------------------------------------------------------------------# Cominciamo di buona lena costruendo il nostro firewall e partiamo dal definire alcune Macro per il nostro firewall. Per semplicita' definiamo che il doppio asterisco indica un commento da inserire all'interno del file di configurazione di pf e cioe' /etc/pf.conf ##--------------------MACRO e TABLES ##---definisco le interfacce interessate int_if = "fxp0" ##---definisco i servizi in entrata come da specifica tcp_services = "22" icmp_types = "echoreq" ##---definiamo i trusted hosts trusted_hosts = "{ 192.168.0.102 }" ##--------------------OPZIONI ##--- definisco il comportamento standard della policy 'block' e 'log' set block-policy return set loginterface $int_if ##--------------------SCRUB ##-- definisco le policy di normalizzazione/assemblamento dei pacchetti scrub in all ##--------------------QUEUING ##-- come da policy abbiamo definito che il protocollo ssh deve avere ## solamente l'1% della banda disponibile, per fare questo bisogna ## definire dapprima una regola che attivi il gestore di QoS e che ## crei le regole principali. Pertanto di seguito definisco la coda ## di tipo "root", definendo anche il tipo di algoritmo di accodamento ## e il tipo di algoritmo per il congestion avoidance. ## Nella regola sottostante abbiamo definito i seguenti: ## -Il QoS deve effetuarsi sull'interfaccia "fxp0" ## -il tipo di schedulatore da utilizzare e' il "cbq" ## -la banda che lo schedulatore usa e' pari a 10Mbits ## -le code che gestira' lo schedulatore sono: std ssh ftp ## nessuno vieta che le code da gestire possano essere di piu' di ## quelle che teste sono state definite: altq on fxp0 cbq bandwidth 10Mb queue { std, ssh, ftp } ##-- una volta definita la regola principale di inizializzazione ## dobbiamo definire la regola per ssh. ## Nella regola seguente abbiamo definito il comportamento del nostro ## AlternateQueuing-ALTQ in relazione al protocollo TCP sulla porta ## 22: ## -La coda "ssh" comporta un uso massimo della banda totale definita ## nella regola root dell' 1% ## -la priorita' della coda ssh e' pari a 0 che vuol dire il minimo ## della priorita'. Nello schedulatore CBQ i valori vanno da 0-7 ## nello schedulatore PRIQ i valori sono da 0-15 ## -il numero massimo di pacchetti da contenere nella coda e' uguale ## a 3 (cfr. token bucket!!) ## -lo schedulatore cbq deve mantenere un comportamento di "default" ## cioe' che se i pacchetti non sono riconosciuti da un'altra regola ## sono accodati alla presente. queue ssh bandwidth 1% priority 0 qlimit 3 cbq(default) ##--------------------TRANSLATION/REDIRECT ## Nessuna configurazione ##--------------------FILTER RULES ##-- Definiamo da subito una regola di deny all, e blocchiamo tutto ## il traffico in ingresso; abbiamo definito nella zona delle opzioni ## che il 'drop' inviera' dei TCP reset block all ##-- facciamo in modo, se ad esempio abbiamo un server X di abilitare ## il transito dei pacchetti nel loopback: utilizziamo la parolina ## quick per terminare la lettura delle altre regole. pass quick on lo0 all ##-- configuriamo la regola antispoofing, che di default non permette ## l'entrata dei pacchetti da un indirizzo ip uguale all'host ma che ## proviene dall'esterno !! antispoof for fxp0 inet ##-- abilitiamo ssh proveniente dall'host trusted e configuriamo la ## regola per utilizzare l'accodamento con nome ssh: pass in on $int_if inet proto tcp from $trusted_hosts to $int_if port \ $tcp_services flags S/SA keep state queue ssh ##-- abilitamo il protocollo ICMP pass in inet proto icmp all icmp-type $icmp_types keep state ##-- abilitiamo in fine pass out on $int_if proto tcp all flags S/SA keep state pass out on $int_if proto { udp,icmp } all keep state Le regole del firewall sono state definite, quindi salviamo il file /etc/pf.conf e facciamo partire il firewall con il comando: # pfctl -e -f /etc/pf.conf #-------------------------------------------->TEST TIME !!! proviamo a fare una ricca scansione con il nostro Netscan preferito: nmap. quindi lanciamo il nostro primo scan con: # nmap -vv OpenBSD Starting nmap 3.48 ( http://www.insecure.org/nmap/ ) at 2004-06-23 15:08 CEST Host openbsd (192.168.200.252) appears to be up ... good. Initiating SYN Stealth Scan against openbsd (192.168.200.252) at 15:08 Adding open port 22/tcp The SYN Stealth Scan took 25 seconds to scan 1657 ports. Interesting ports on openbsd (192.168.200.252): (The 1656 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh nmap ha semplicemente rilevato che ssh e' attivo su questa macchina e cio' non dovrebbe darci preoccupazioni pesanti (il falso senso di sicurezza...) Proviamo a vedere cosa succede con un fingerprint: # nmap -vv -O OpenBSD Starting nmap 3.48 ( http://www.insecure.org/nmap/ ) at 2004-06-23 15:11 CEST Host openbsd (192.168.200.252) appears to be up ... good. Initiating SYN Stealth Scan against openbsd (192.168.200.252) at 15:11 Adding open port 22/tcp The SYN Stealth Scan took 25 seconds to scan 1657 ports. For OSScan assuming that port 22 is open and port 1 is closed and neither are firewalled For OSScan assuming that port 22 is open and port 1 is closed and neither are firewalled Insufficient responses for TCP sequencing (0), OS detection may be less accurate For OSScan assuming that port 22 is open and port 1 is closed and neither are firewalled Insufficient responses for TCP sequencing (0), OS detection may be less accurate Interesting ports on openbsd (192.168.200.252): (The 1656 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh No exact OS matches for host (If you know what OS is running on it) . TCP/IP fingerprint: SInfo(V=3.48%P=i686-pc-linux-gnu%D=6/23%Time=40D9819E%O=22%C=1) TSeq(Class=TR%IPID=RD%TS=2HZ) T1(Resp=N) T1(Resp=Y%DF=Y%W=4000%ACK=S++%Flags=AS%Ops=MNWNNT) T2(Resp=N) T2(Resp=N) T3(Resp=N) T3(Resp=N) T4(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=) T4(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=) T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=) T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=) T6(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=) T6(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=) T7(Resp=N) T7(Resp=N) PU(Resp=Y%DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) PU(Resp=Y%DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Muhhhhaaaaaa !!!! #------------------------------------------------------------------------------# Adesso verifichiamo il nostro QoS. Andiamo su di una macchina dalla quale possiamo fare traffico "ssh/scp" e creiamo un file di grandi dimensioni che utilizzeremo per verificare la quantitia' di banda utilizzata. Quindi: ##-------------------HOST1[Linux] # dd if=/dev/zero of=/tmp/file_test bs=8192 count=10240 ##-------------------HOST2[OpenBSD] Accertiamoci che il firewall sia attivo: # pfctl -e pf enabled Proviamo a copiare il file creato con il nostro QoS attivo: # cd /tmp # scp @Linux:/tmp/file_test . @Linux's password: file_test 1% 1000KB 224.8KB/s 06:00 ETA a quanto pare il nostro QoS funziona, infatti abbiamo definito una banda pari all'1% della rete e cioe' 100Kb, ma il risultato e' doppio poiche' il Token Bucket non sta gestendo ulteriori connessioni. Proviamo a vedere cosa succede se disabilitiamo il firewall: # pfctl -d pf disabled # scp @Linux:/tmp/file_test . @Linux's password: file_test 46% 37MB 7.1MB/s 00:06 ETA e the answer is: FUNZICA !!!!! Abbiamo in modo molto grossolano fatto funzioanre il QoS sul firewall OpenBSD !! CIAO