Na PCBSD-u pf.conf fajl dolazi sa dosta primera pravila i podesavanja ali su sva stavljena pod komentar (znakom “#” ispred linije) i samim tim su neaktivna. Korisnik moze da ukloni komentar sa vec postojecih pravila, ako odgovaraju njegovim potrebama, ili moze da ubaci svoja.
Medjutim, PCBSD moze da koristi jos jedan nacin za upravljanje pf-om i njegovim pravilima – koristeci rc.d skriptu prilikom podizanja sistema koja dolazi sa sistemom i preuzeta je (i modifikovana) iz FreeSBIE sistema. Ovaj nacin je sada podrazumevano ujljucen na PC-BSD-u u /etc/rc.conf.
Prilikom startovanja sistema kernel startuje init(8), prvi proces na sistemu, koji onda pokrece /etc/rc koji zatim iscitava skripte pomocu rcorder(8) kako bi ih startovao odredjenim redom i resio zavisnosti medju njima. Onda /etc/rc pokrece skripte koristeci start argument. Na isti nacin /etc/rc.shutdown “gasi” sve programe koristeci stop argument i naravno u obrnutom redosledu (opet je tu zaduzen rcorder(8)). Pogledacemo i probati da objasnimo rc.d skriptu koja kreira pf pravila prilikom podizanja sistema. Na kraju se nalazi link do kompletne rc.d skripte kao i ostalih fajlova koje cemo pomenuti. Pa da krenemo, koriscenje alkoholnih pica je preporucljivo prilikom citanja.
1 #!/bin/sh 2 # Revision 0.14 Sat Nov 18 12:23:10 EET 2006 3 # 4 # Copyright (c) 2006 Dominique Goncalves 5 # Copyright (c) 2006 Andrei Kolu 6 # Modified 2006 Kris Moore (PC-BSD Software) 7 # 8 # See COPYING for licence terms. 9 # 10 # Create a basic pf.conf. 11 # Block everything by default, 12 # Allow everything on lo0, 13 # Do not create rules on some interface ie: plip0, 14 # Allow all tcp and udp connections to outside with keep state flags, 15 # Allow icmp on all interfaces. 16 #
Naravno skripta pocinje sa shebang linijom kojom odredjujemo koji ce interpreter da izvrsi skriptu, u ovom slucaju Bourne shell. Nakon toga sledi licenca i kratak opis sta skripta radi.
17 # PROVIDE: pf_rules 18 # REQUIRE: netif 19 # BEFORE: pf 20
Sledecih nekoliko linija koje lice na komentare i koje sh ignorise su u stvari parametri za rcorder(8) koje on cita pri podizanju sistema i odredjuje redosled pokretanja rc skripti. U prvoj liniji se navodi ime skripte ili conditions koje ona daje (PROVIDE), druge rc.d skripte mogu da koriste ova imena.
Druga linija zahteva (REQUIRE) da netif bude pokrenut pre izvrsenja skripte. Treca linija kaze da se skripta mora izvrsiti pre (BEFORE) nego sto se pf (paket filter) startuje.
21 . /etc/rc.subr 22
rc.subr(8) scripta predstavlja skup funkcija koje se stavljaju na raspolaganje shell skriptama i rc.d skriptama. Da bi fukncije koje rc.subr(8) poseduje bile dostupne interpreteru on mora da “source”-uje rc.subr(8).
23 name="pf_rules"
Odredjujemo ime skripte. Ova varijabla je obavezna i mora se zadati da bi se mogle pozivati funkcije iz rc.subr(8).
24 rcvar=`set_rcvar`
Varijabla rcvar odredjuje ime varijable u rc.conf za ukljucivanje/iskljucivanje skripte. Funkcija se poziva iz rc.subr(8) zato sto su operativni sistemi razvili soptstvene nacine za omogucavanje skripte. Npr NetBSD ce koristiti ${name} (tj. pf_rules=YES), dok ce FreeBSD/PCBSD koristiti ${name}_enable (tj. pf_rules_enable=YES) za kontrolisanje skripte u rc.conf. Na ovaj nacin rcvar varijabla ce sama “prilagoditi” odgovarajuci unos za rc.conf.
25 start_cmd="create_rules"
Skripta daje metode koje rc.subr(8) poziva. Metoda je u stvari varijabla koja se sastoji od argument_cmd varijable, gde argument (koji daje rc.subr(8)) moze da bude start, stop, restart i ostale komande koji se zadaju prilikom pozivanja skripte.
26 required_files="$pf_rules"
Pre startovanja skripte rc.subr(8) ce proveriti dali je $pf_rules fajl kreiran ili ne. Ako ne postoji skripta se nece izvrsiti. Postoje jos i required_dirs i required_vars za obavezne direktorijume i varijable. Ako se koristi forcestart za pozivanje skripte, rc.subr(8) nece vrsiti ove provere pre startovanja skripte.
Sledi fukncija koja predstavlja rc.d metodu.
27 create_rules ()
28 {
29 echo "Creating $pf_rules."
Otvaramo funkciju i ispisujemo tekst da kreiramo $pf_rules fajl.
30 echo "set skip on lo0" > $pf_rules
Ne filtriramo nista na lo0 interfejsu. Zbog mogucih komplikacija i nepredvidljivih posledica ovo je preporucljivo. Ovo ce i kreirati pf.conf fajl (“> $pf_rules”)
31 echo "set block-policy return" >> $pf_rules
Kao odgovor na block pravilo pf ce odgovoriti sa TCP RST za TCP i ICMP UNREACHABLE paketom za UDP protocol, sto znaci da ce korisnik dobiti obavestenje da je port blokiran. U slucaju da smo ovde stavili “drop” umesto “return” onda bi pf samo “silently” blokirao konekciju bez ikakvog obavestenja.
32 #echo "set loginterface rl0" >> $pf_rules
Odredjujemo mrezni interfejs na kojem ce se vrsiti logovanje i moci pregledati statistika koristeci pfctl komandu. Pravilo nije aktivno (taraba ispred).
33 echo "scrub in all" >> $pf_rules
Preporucena normalizacija paketa za dolazni saobracaj. scrub pomaze i kod odredjenih napada i koriscenje nelegalne kombinacije flag-ova (npr odredjena skeniranja nmap-om koriste kombinacije flagova).
34 echo "block in log" >> $pf_rules
“Default block policy”. Podrazumevano blokiramo i logujemo sve za dolazni saobracaj.
35 echo "antispoof quick for lo0 inet" >> $pf_rules
Antispoof pravila za lo0 interfejs. Da malo objasnimo ovo. Koriscenjem antispoof zastite gornje pravilo se prosiruje u dva dodatna:
1) block in on ! lo0 inet from 127.0.0.0/8 to any 2) block in inet from 127.0.0.1 to any
Sto bi znacilo:
1) Blokiraj sav dolazni saobracaj sa 127.0.0.0/8 mreze koji ne ulazi preko loopback interfejsa (''lo0'')
2) Blokiraj sav dolazni saobracaj koji dolazi sa 127.0.0.1 adrese (adresa ''loopback'' interfejsa). Saobracaj koji dolazi od spolja a ima izvornu adresu koja je vec dodeljena masini se smatra nepravilnim (kao da masina sama sebi salje pakete).
36 # block anything coming from source we have no back routes for 37 echo "block in from no-route to any" >> $pf_rules
Kao sto ime kaze, blokiramo sve pakete koji dolaze sa adresa koje ne postoje u ruting tabeli.
38 # Allow all outgoing traffic 39 echo "pass out keep state" >> $pf_rules
Dozvoljavamo sav izlazni saobracaj i cuvamo podatke o konekcijama (keep state) tako da ce povratni paketi sa tih konekcija moci da prodju bez prolaska kroz skup pravila (znacajno smanjuje vreme prosledjivanja paketa)
40 echo 'table <blacklist> persist file "/etc/blacklist"' >> $pf_rules
Kreiramo tabelu “blacklist” koja sadrzi listu adresa iz fajla “/etc/blacklist”.
41 echo "pass inet proto icmp from any to any" >> $pf_rules
Dozvoljavamo sav ICMP saobracaj (znaci ne samo ping).
42 #############################################################
43 # Ports from 49152 to 65535 is needed for SMB and other connectivity
44 echo "pass in proto {tcp,udp} from any to any port 49152:65535 keep state" >> $pf_rules
Dozvoljavamo dolazni saobracaj (i TCP i UDP protokol) za portove od 49152 do 65535 koji su neophodni za SMB konekcije (Samba).
45 for inf in `ifconfig -l` ; do 46 if `echo $inf | egrep -v 'lo|plip|gif|tun|pfsync' 1>/dev/null` ; then 47 # Check if we have a /etc/pf.inports file, and open those ports 48 if [ -e "/etc/pf.inports" ] 49 then 50 for PORT in `cat /etc/pf.inports | grep "^udp: " | cut -d " " -f 2` 51 do 52 echo "pass in quick on $inf proto udp from any to ($inf) port $PORT keep state" >> $pf_rules 53 done 54 fi
Ovde izlistavamo sve interfejse (ifconfig –l) i iskljucujemo odredjene interfejse iz daljeg rada (egrep -v 'lo|plip|gif|tun|pfsync), onda proveravamo dali postoji fajl /etc/pf.inports (koji sadrzi listu dolaznih portova) i ako postoji onda fajl pratrazujemo za UDP portove (grep “^udp: ” | cut -d ” ” -f 2) i kreiramo pravilo koje dozvoljava dolazni saobracaj na ostalim dostupnim interfejsima (sada $inf varijabla) za te portove ($PORT).
55 if [ -e "/etc/pf.inports" ] 56 then 57 for PORT in `cat /etc/pf.inports | grep "^tcp: " | cut -d " " -f 2` 58 do 59 echo "pass in quick on $inf proto tcp from any to ($inf) port $PORT keep state" >> $pf_rules 60 done 61 fi 62
Isto se ponavlja i za TCP portove.
63 # Deny all from our blacklist 64 echo "block on $inf from <blacklist> to any" >> $pf_rules 65 fi 66 done
Blokiramo sav sabracaj od adresa iz tabele blacklist (adrese se nalaze u fajlu /etc/blacklist).
67 # restart PF firewall 68 pfctl -f /etc/pf.conf 69 } 70 71
Ucitavamo pravila za pf paket filter. Komanda ima funkciju kao da ste restartovali pf. Ovime se fukncija i zavrsava.
72 load_rc_config $name
Ucitavamo konfiguracioni fajl za $name (pf_rules) i rc.conf varijable.
73 run_rc_command "$1"
Ovo je obicno zadnja komanda u rc skripti i ovim se pokrece skripta sa zadatim parametrom tzv. arguementom (rc.subr(8) izvrsava komandu nad skriptom koja je zadata u komandnoj liniji ($1) a moguci argumenti mogu biti start, stop, restart, rcvar, poll i status).
Nadam se da nisam bio preterano konfuzan kako znam da budem i da sam nekom makar malo pomogao da razume pf pravila i rc.d skripte.
Pozdrav