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. :-D

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

Linkovi

 
pf_paket_filter_pravila_na_pc-bsd_sistemu.txt · Last modified: 2007/12/20 19:29 by soxxx
 
Recent changes RSS feed Creative Commons License Valid XHTML 1.0 Valid CSS Driven by DokuWiki