User Tools

Site Tools


pffff....bezbednost_na_bsd_nacin

MALO BEZBEDNOSTI NIJE NA ODMET , ZAR NE? A MALO VIŠE BEZBEDNOSTI ? U PROŠLOM BROJU GNUZILLE SMO POKUŠALI DA BEZ UPOTREBE ZAŠTITNOG ZIDA NAPRAVIMO BSD TVRĐAVU . KOLIKO SMO U TOME USPELI SVAKO OD VAS JE MOGAO DA PROBA . SADA ĆEMO SE POSVETITI OBEZBEĐIVANJU NAŠEG DRAGOG SISTEMA ZAŠTITOM KAKVA DOLIKUJE JEDNOM BSD- U.

FreeBSD na kome ćemo sve ovo raditi ima tri koncepta pravljenja zaštitnog zida. OpenBSD Packet Filter(PF), IPFILTER i IPFW. Redosled koji sam izneo nije slučajan. Svako ko se bavi bezbednošću će vam reći da primat u bezbednosti svakako drži OpenBSD. Baš zbog toga, a i zbog ličnih afiniteta ka PF-u, prvu priču o zaštiti sistema posvećujem baš zaštitnom sistemu OpenBSD-a.

Jedan sasvim poseban sistem zaštite

Počevši od jula 2003. PF se nalazi kao port u FreeBSD sistemu. Ipak, od FreeBSD 5.3 je on integrisan u sistem i ne instalira se kao paket. To je doprinelo opštoj bezbednosti sistema. Od verzije 5.4 FreeBSD ima ažuriran PF, da bi odgovarao novom OpenBSD-u 3.7. Dakle, više nema potrebe da koristimo paket koji se nalazi u security/pf. Sada imamo dve mogućnosti - prva je da upotrebimo modul i da PF uključimo tako što ćemo u /etc/rc.conf staviti pf_enable=“YES”. Naša druga mogućnost je da rekompajliramo kernel i dodamo:

device pf
device pflog
device pfsync

pflog(4) će učitati mrežni pseudoadapter koji će se baviti beleženjem saobraćaja koji reguliše PF, dok će pfsync(4) brinuti o promenama stanja PF-a. Vratimo se sada datoteci pf.conf u direktorijumu /etc. Tamo možemo dodati niz komandi koje će se izvršiti pri pokretanju sistema a koje nam mogu biti jako korisne. Da vidimo šta je sve tu zanimljivo:

pf_enable="YES"# pokreće PF (učitava modul)
pf_rules="/etc/pf.conf"# definiše pravila za PF
pf_flags=""# dodatne komande koje će se pokrenuti pri pokretanju PF-a
pflog_enable="YES"# pokreće pflogd(8)
pflog_logfile="/var/log/pflog"# gde će se upisivati podaci iz loga
pflog_flags=""# dodatni parametri za pflog

I sad imamo zaštitni sistem spreman za rad? Pa, ne baš. Podesili smo sve sem pravila za rad sistema. A bez toga nam naš dragi PF i nije od neke koristi. No, pre nego definišemo koja će pravila PF poštovati, pogledajmo koje su nam komande ponuđene:

# pfctl -f /etc/pf.conf

učitava datoteku sa pravilima, adresa je naravno relativna i zavisi od toga gde se nalazi vaša datoteka sa pravilima

# pfctl -nf /etc/pf.conf

raščlanjuje datoteku ali ne učitava pravila

# pfctl -Nf /etc/pf.conf

učitava samo NAT pravila iz datoteke

# pfctl -Rf /etc/pf.conf

učitava samo filter pravila iz datoteke

# pfctl -sn

prikazuje trenutna NAT pravila

# pfctl -sr

prikazuje trenutna filter pravila

# pfctl -ss

prikazuje trenutno stanje tabele

# pfctl -si

prikazuje statistike i brojače

# pfctl -sa

prikazuje SVE što može da prikaže

Zapali mi zid

Sada smo apsolutno svesni šta nam je na raspolaganju da bismo napravili dobro obezbeđen sistem. U ovom broju ćemo se zadržati na jednostavnijem obliku izrade pravila, jer nam je cilj da na lak način dođemo do dobre zaštite. PF nam za to nudi Liste i Makroe. Kada se bolje upoznate sa ove dve mogućnosti shvatićete zašto sam oduševljen PF-om.

Liste

Liste nam omogućavaju da jednim pravilom pokrijemo više različitih kriterijuma. Postavimo to ovako, želimo da se blokira dolazni saobraćaj za dva određena IP-a na port 80. Umesto da definišemo dva pravila upotrebićemo listu koju će pfctl tumačiti kao dva pravila. Naša će lista izgledati ovako:

block out on eth0 from { 192.168.0.1, 10.5.32.6 } to 80

a ne:

block out on eth0 from 192.168.0.1 to 80
block out on eth0 from 10.5.32.6 to 80

Makroi

Makroi se u ovom slučaju ne bave nelegalnim poslom, već nam pomažu da veoma lako napravimo pravila za naš PF. Šta zapravo rade makroi? Oni nam omogućavaju da sami definišemo promenljive za IP adrese, portove, interfejse i sl. Pogledajmo to slikovito. Neka se naša LAN kartica na sistemu zove eth0. Kada se formiraju pravila koja su kompleksna, može se desiti da nam datoteka bude teška za snalaženje. Kada bismo mogli da stvari u pravilim nazivamo kako mi želimo, to bi nam veoma olakšalo stvari, zar ne? Tu na scenu stupaju makroi. Oni će nam omogućiti da svoju eth0 karticu nazovemo drugačije. To ćemo definisati na sledeći način:

lan_kartica="eth0"

U pravilu koje ćemo definisati za eth0 sada koristimo lan_kartica ali sa jednim dodatkom, sve što definišemo sami pozivamo sa prefiksom $ - $lan_kartica. To bi praktično izgledalo ovako:

block in on $lan_kartica from any to any

Ovim ćemo blokirati sav dolazni saobraćaj na uređaju eth0. Svrha makroa ne leži samo u olakšavanju definisanja uređaja. Pretpostavimo da postoji određena grupa korisnika kojima želite da date pristup na vaš port 80 (web server). Ukoliko vaši prijatelji imaju statičke IP adrese problem ćemo rešiti ovako:

prijatelji = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"

i napraviti pravilo:

pass in on $lan_kartica from $prijatelji to 80

Sada će vaši prijatelji imati pristup vašem serveru.

I spy with my little eye

Kao što sam već napomenuo, jedan od modula koje učitavamo preko /etc/rc.conf je i pflog. Ako ste obratili pažnju na tekst, videli ste da se svi podaci iz PF-a upisuju u /var/log/pflog. No, ako otvorite datu datoteku ništa vam neće biti jasno. Razlog za to je jako jednostavan. PF svoje podatke upisuje u binarnom obliku. Da bismo čitali ono što sistem radi, moraćemo da upotrebimo alternativni metod. U zavisnosti od toga šta nas zanima koristićemo jednu od sledeće dve komande:

tcpdump -n -e -ttt -r /var/log/pflog

će nam prikazati podatke iz LOG datoteke. Ukoliko pak želimo da gledamo šta PF radi u realnom vremenu koristićemo

tcpdump -n -e -ttt -i pflog0

Kako je zapis u LOG datoteci u binarnom obliku na raspolaganju nam stoje sve opcije tcpdump komande. To nam omogućava prikazivanje podataka iz LOG-a po određenim kriterijumima. Recimo, možemo videti samo pakete koji odgovaraju portu 80 - tcpdump -n -e -ttt -r /var/log/pflog port 80. Kako je OpenBSD poznat po sjajnim stvarima i dodacima za standardne mogućnosti, to ni ovde nije zaboravljeno. Pored uobičajenih tcpdump komandi OpenBSD je implementirao i niz svojih:

# ip - adresa je iz porodice IPv4
# ip6 - adresa je iz porodice IPv6
# on int - paket je propušten kroz interfejs int.
# ifname int - isto što i za int.
# ruleset name - pravilo ili petlja sa kojom se paket poklapa
# rulenum num - pravilo filtera koje se poklapa sa paketom je rednog broja
# action act - preduzete mere - block ili pass
# reason res - razlog zbog kojeg je preduzeta mera. Mogućnosti su match, bad-offset, fragment,

short, normalize, memory, badtimestamp,congestion, ip-option, proto-cksum, state-mismatch, state- insert, state-limit, src-limit i synproxy.

# inbound - paket je dolazni
# outbound - paket je odlazni

Ovde ćemo napraviti pauzu. Preostaje nam malo komplikovanija priča o tabelama, ali ćemo nju ostaviti za kasnije i sada vam dati malo vremena da se poigrate svojim PF-om.

~ Marko Milenović

pffff....bezbednost_na_bsd_nacin.txt · Last modified: 2017/04/28 10:25 (external edit)