Kahe võrgukaardiga aadressteisendav tulemüür
Allikas: Kuutõrvaja
Sisukord
Eesmärk
Olgu eesmärgiks ühendada tulemüüri abil internetiga privaatseid aadresse kasutav serverite võrgusegment
internet | | em0, 172.16.1.24/24, 172.16.1.80/24 __|__ | | | | |_____| | | em1, 192.168.100.254/24 | | |_______ SERVERID - 192.168.100.0/24 _________
ning peavad olema täidetud sellised nõuded
- Sissepääs tulemüüri
- haldusligipääs ssh, 22/tcp
- Väljapääs tulemüürist
- kellaaeg ntp, 123/udp - nimeteenus, 53/udp,tcp - süsteemsed teated smtp, 25/tcp - tarkvara paigaldamine ftp serverist, 80/tcp
- Läbipääs avalikust võrgust SERVERID võrku
- eposti teenus smtp, 172.16.1.25:25/tcp -> 192.16.100.25:25/tcp - veebiteenus, http, 172.16.1.80:80,443/tcp -> 192.16.100.25:80,443/tcp - eposti ja veebiserveri pöördumised avalikku võrku paistavad samadel ip aadressidelt, mille kaudu nende poole pöördumine toimub
- Läbipaas SERVERID võrgust avalikku võrku
- kellaaeg ntp, 123/udp - nimeteenus, 53/udp,tcp - süsteemsed teated smtp, 25/tcp - ocsp, 80/tcp
Tulemüüri seadistamine
Esitatud ülesande täitmiseks peab tulemüüris
- seadistamine sobivalt võrguseadmed
- lülitama sisse ip pakettide ruutimise
- käivitama ssh serveri
- käivitama ntp serveri (mida kasutatakse lokaalselt)
Paketifiltri seadistamine
Esitatud ülesande täitmiseks sobib kasutada sellist paketifiltri seadistusfaili /etc/pf.conf
######### MACROS and LISTS ######### # if_ext = "em0" # 172.16.1.17 if_int = "em1" # 192.168.100.254 dns = "10.0.1.13" # dns server ntp = "10.0.1.14" # ntp server ftp = "10.0.1.15" # ftp server ocsp = "10.0.1.16" # ocsp server smtp = "10.0.1.17" # smtp server serv_real_SMTP = "192.168.100.25" # smtp server, teenus serv_reaL_HTTP = "192.168.100.80" # http server, teenus serv_teenus_SMTP = "172.16.1.25" # smtp server, teenus serv_teenus_HTTP = "172.16.1.80" # http server, teenus icmp_types = "echoreq" tcpopts = "flags S/SA modulate state" synopts = "flags S/SAFR synproxy state" udpopts = "keep state" ######### TABLES ########## # # 10.0.1.18 - loomaaia tulemüüri ühe halduri töökohaarvuti ip aadress # 10.50.1.19 - loomaaia tulemüüri teise halduri töökohaarvuti ip aadress table <kontor> const { 10.0.1.18, 10.50.1.19 } # Reserveeritud. http://www.iana.org/assignments/ipv4-address-space table <reserved> const file "/etc/pf.tbl/reserved" # Valetatud aadressid. table <spoofed> const { 10.0.0.0/8 169.254.0.0/16 172.16.0.0/12 \ 192.0.2.0/24 192.168.0.0/16 224.0.0.0/4 } # Blacklist table <blacklist> persist file "/etc/pf.tbl/blacklist" ######### OPTIONS ######### # set loginterface $if_ext set optimization aggressive set timeout tcp.established 300 set limit states 500000 set limit frags 100 set timeout tcp.first 15 set skip on lo # set skip on $if_int set timeout tcp.closed 50 ######### TRANSLATION ########## # # teisendus ligipääsuks postimasinasse rdr on $if_ext inet proto tcp to 172.16.1.25 port 25 tag TO_SMTP -> 192.168.100.25 # teisendus ligipääsuks veebiserverisse rdr on $if_ext inet proto tcp to 172.16.1.80 port { 80, 443 } tag TO_HTTPS -> 192.168.100.80 # teisendus postimasina väljapääsemiseks avalikku võrku nat pass on $if_ext tagged FROM_SMTP -> 172.16.1.25 nat pass on $if_ext tagged TO_NTP -> 172.16.1.25 nat pass on $if_ext tagged TO_DNS -> 172.16.1.25 # teisendus veebiserveri väljapääsemiskeks avalikku võrku nat pass on $if_ext tagged TO_OCSP -> 172.16.1.80 nat pass on $if_ext tagged TO_NTP -> 172.16.1.80 nat pass on $if_ext tagged TO_DNS -> 172.16.1.80 ######### FILTER ########## # # HALDUSLIGIPÄÄS AVALIKUST VÕRGUST TULEMÜÜRI # # ssh kaugligipaas haldusest pass in quick on $if_ext inet proto tcp from <kontor> to $if_ext port 22 $tcpopts (tcp.established 1064000) label "JSext_kontor" # # VAIKIMISI ON LIIKLUS KEELATUD # # Igasugune liiklus läbi tulemüüri võrguseadmete on vaikimisi keelatud # keelatud on sissepääs, väljapääs ja igas suunas läbipääs block in on $if_ext label "ESext_vaikimisi" block out log on $if_ext label "EVext_vaikimisi" block in log on $if_int label "ESint_vaikimisi" block out log on $if_int label "EVint_vaikimisi" # # BLACKLISTITUD, SPOOFITUD ja RESERVED LIIKLUSE KEELAMINE # # Avalikust võrgust tulemüüri taha läbivale liiklusele keelu block in quick on $if_ext from <blacklist> label "ESe_blacklist" block in quick on $if_ext from <spoofed> label "ESe_spoofed" block in quick on $if_ext from <reserved> label "ESe_reserved" # # NORMAALSE LIIKLUSE LÄBIPÄÄSU LUBAMINE AVALIKUST VÕRGUST TULEMÜÜRI TAHA # # Avalikust võrgust tulemüüri taha läbiv liikluse sisenemise lubamine pass in quick on $if_ext inet tagged TO_HTTP $synopts label "JSext_http" pass in quick on $if_ext inet tagged TO_SMTP $synopts label "JSext_smtp" # Läbipääseva TO_HTTP ja TO_SMTP liikluse väljumise lubamine pass out quick on $if_int tagged TO_HTTP label "JVint_http" pass out quick on $if_int tagged TO_SMTP label "JVint_smtp" # # LÄBIPÄÄSU LUBAMINE TULEMUURI TAGANT AVALIKKU VÕRKU # et teenusserverite kellaaeg oleks õige pass in quick on $if_int inet proto udp from { $serv_HTTP, $serv_SMTP } to $ntp port 123 tag TO_NTP $udpopts label "JSint_ntp" # et teenusserveid saaks nimesid lahendada pass in quick on $if_int inet proto { tcp, udp } from { $serv_HTTP, $serv_SMTP } to $dns port 53 tag TO_DNS $udpopts label "JSint_dns" # et veebiserver saaks kontrollida kliendisertifikaatide kehtivust pass in quick on $if_int inet proto tcp from $serv_HTTP to $ocsp port 80 tag TO_OCSP $tcpopts label "JSint_ocsp" # et veebiserver saaks saata süsteemseid teateid pass in quick on $if_int inet proto tcp from $serv_HTTP to $smtp port 25 tag FROM_SMTP $tcpopts label "JSint_smtp" # et postimasin saaks kirju valja saata pass in quick on $if_int inet proto tcp from $serv_SMTP to any port 25 tag FROM_SMTP $tcpopts label "JSint_smtp" # et tagitud liiklus saaks tulemüürist välja pass out quick on $if_ext tagged FROM_SMTP label "JVext_from_stmp" pass out quick on $if_ext tagged TO_OCSP label "JVext_ocsp" pass out quick on $if_ext tagged TO_NTP label "JVext_ntp" pass out quick on $if_ext tagged TO_DNS label "JVext_dns" # # TULEMÜÜRIST ENDAST VÄLJAPÄÄS # # et tulemüüri kellaaeg oleks õige pass out on $if_ext inet proto udp to $ntp port 123 label "JVext_ntp" # et tulemüüri sees nimelahendus töötaks pass out on $if_ext inet proto { tcp, udp } to $dns port 53 label "JVext_to_dns" # et haldusteated saaksid välja pass out on $if_ext inet proto tcp to $smtp port 25 $tcpopts label "JVext_to_smtp" # et tulemüüri saaks tarkvara lisada pass out on $if_ext inet proto tcp to $ftp port 80 $tcpopts label "JVext_to_ftp"
Kaalutlused reeglite kirjutamisel
Reeglite kirjutamisel sh järjestamisel on kasutatud selliseid kaalutlusi
- järjestada paketifiltri sisu sektsioonide kaupa ja kasutada kommentaare, et reeglid oleksid loetavamad
- kasutada muutujaid selleks, et kirjutatud reeglid oleksid üldisemad ja loetavamad
- on püütud esistada erinevaid liiklusi, tulemüüri endasse suunatud liikluse sissepääs, tulemüürist endast lähtuva liikluse väljapääs, tulemüürist läbipääs
- kõige algul kehtestada halduseks vajalik ligipääs, quick (kuigi tulemüüri reeglite töötamise mõttes vähendab see efektiivsust põhimõtteliselt)
- suhteliselt alul kehtestatakse vaikimisi nö poliitika - igasugune liiklus on keelatud, ilma quick'ita
- võimalikult algul blokeerida ilmselt sobimatud paketid, quick (valetatud, mitte kasutuses olevad ja blacklistis olevad aadressid); kuna paketifiltri reegleid kontrollitakse järjest, siis sobimatute pakettide osas tehakse nii otsus suhteliselt vara
- kasutatakse TAG'isid, et tulemüüri läbivat liiklust hõlpsamini ja paremini kontrollida ja et vastavaid reegleid oleks vähem
- pass ja block reeglite juures on reeglina kasutatud labeleid, et seadistusfaili loetavus oleks parem ning parem oleks orienteerud pfctl, systat ja pftop väljundis; label on sellise struktuuriga, nt
JSext_http - J (jah) S (sisse) ext (väline seade) http (liikluse iseloomustus)
- tulemüüri taga olevatele serveritele juurdepääsuks kasutataks synproxit
- välisseadmelt sisenevat blokeeritud liiklust ei logita tulemüüri töötamise efektiivsust silmas pidades
- logitakse väljuvat blokeeritud liiklust mõlemal seadmel ning serverite poolt sisenevat blokeeritud liiklust, et anomaaliaid avastada (nt serverist pöördub pahalane isanda poole vms)
- kasutatud tabelitele vastavaid faile hoitakse koos kataloogis /etc/pf.tbl, et /etc kataloogi mitte risustada ebastandardsete failidega
Siltide kasutamise selgitus
Siltide kasutamise abil saab väga efektiivselt kontrollida tulemüüri läbivat liiklust. Tulemüüri läbivale paketile rakendatakse erinevaid reegleid sellises järjekorras, vasakul on kirjas võimalik teisendus või pass reegel ning paremal kommentaar, mida reegli abil sooritada saab
liiklus | RDR | <---- dst teisendamisel lisatakse silt | nt 'rdr on $if_ext inet proto tcp to 172.16.1.25 port 25 tag TO_SMTP -> 192.168.100.25' | | PASS IN | ----> kasutatakse paketi sisselubamisel RDR-teisendusel omistatud silti | pf.conf: | nt 'pass in quick on $if_ext inet tagged TO_SMTP $synopts label "JSext_smtp"' | | <---- tulemüüri ilma RDR-teisenduseta pakettidele lisatakse silt | nt 'pass in quick on $if_int inet proto udp from { $serv_HTTP, $serv_SMTP } to $ntp port 123 \ | tag TO_NTP $udpopts label "JSint_ntp"' | | NAT | ----> silti kasutatakse tulemüürist väljuva paketi src teisendamiseks | | | PASS OUT | ----> TAGi kontrollides lubatakse pakett välja | pf.conf: | nt 'pass out quick on vorguseade tagged TO_vorgunimi' | nt 'pass out quick on seadmed tagged FROM_vorgunimi' v
Paketifiltri töö jälgimine
- Paketifiltri töö abstraktsel tasemel jälgimiseks sobib kasutada systat ning pftop programme, tähelepanu tuleks pöörata nt sellele kui palju pakette või baite liigub mingite reeglite (labelite) alusel tulemüürist läbi.
- Peale paketifiltri seadistuse kehtestamist on mõttekas jälgida mida paketifilter logib öeldes nt
# tcpdump -nei pflog0