Debian bástyagép tűzfal (Jessie)
Valamennyi szervert bastion host-ként kell kialakítani, azaz saját (csomagszűrő) tűzfallal kell rendelkezzen. A gyakorlatban ez az iptables (netfilter) konfigurálását jelenti. A követelményeket lásd itt: Hálózati házirend.
Figyelem: ez a leírás csak IPv4-re vonatkozik - IPv6 TODO!
Tartalomjegyzék
Kernelbe fordítandó dolgok
Lásd a Shorewall dokumentációjában. A gyári Debian Jessie kernel ezeket alapértelmezésben tartalmazza.
Konfigurálás a Shorewall csomaggal
A Shorewall egy egyszerű(?) iptables konfiguráló eszköz, bővebben itt lehet olvasni róla. Szerencsére van belőle Debian csomag is:
apt-get install shorewall shorewall-doc # függőségek: bc, shorewall-core
Telepítés után a konfigurálatlan Shorewall nem indul el. Beállításához a /usr/share/shorewall/configfiles tartalmát másoljuk be a /etc/shorewall könyvtárba, egyben szigorítsuk meg a jogosultságokat:
cp /usr/share/shorewall/configfiles/* /etc/shorewall/ rm /etc/shorewall/*.annotated # a dokumentációra itt nem lesz szükség chmod 640 /etc/shorewall/*
Ezután szerkesszük meg a következő állományokat:
shorewall.conf
A jelen leírásban nem foglalkozunk az IPv6 beállításával, hanem ezt a forgalmat egyszerűen letiltjuk (TODO!):
-rw-r----- root root /etc/shorewall/shorewall.conf [...] DISABLE_IPV6=Yes [...]
vardir
A Shorewall 4.x indításakor összeállít egy .start scriptet, amelyet szeretne a /var/lib/shorewall könyvtárban lefuttatni. Ez a biztonsági beállításainkkal ütközik, ezért kénytelenségből ezt a könyvtárat átmozgatjuk az írható és futtatható partíción lévő /etc/shorewall könyvtárba:
mv /var/lib/shorewall /etc/shorewall/tmp chmod 700 /etc/shorewall/tmp # Szigorú hozzáférés
A Shorewall számára egy (a maintainer által nem biztosított, létrehozandó) konfigurációs állományban meg kell adni e könyvtár helyét:
touch /etc/shorewall/vardir chmod 640 /etc/shorewall/vardir mcedit /etc/shorewall/vardir
-rw-r----- root root /etc/shorewall/vardir # Fixup to avoid creating .start script on a non-executable partition VARDIR=/etc/shorewall/tmp
start
Az alábbi beállítás megakadályozza, hogy a Shorewall üzenetek elárasszák a root konzolt:
-rw-r----- root root /etc/shorewall/start [...] dmesg -n5 [...]
zones
Deklaráljuk a net zónát és a megbízható(bbnak tekintett) trs zónát (pl. biztonsági mentések fogadása számára):
-rw-r----- root root /etc/shorewall/zones #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall trs ipv4 net ipv4
Megjegyzendő, hogy ezek csak deklarációk, itt még semmilyen jogosultságot nem rendeltünk ezekhez a zónákhoz.
Egy interface (hálókártya) esetén
Ez a szakasz használandó, ha csak egy Ethernet interface van a gépben (pl. csak nyilvános szolgáltatást nyújtó vagy csak belhálózati szervert telepítünk - általában ez a helyzet).
interfaces
-rw-r----- root root /etc/shorewall/interfaces ?FORMAT 2 ############################################################################### #ZONE INTERFACE OPTIONS # net eth0 arp_filter,blacklist,dhcp,logmartians,nosmurfs,routefilter,tcpflags #,norfc1918
- az arp_filter biztosítja, hogy több interface-szel rendelkező gép esetén minden interface csak a saját IP-jére vonatkozó who-has kérésére válaszoljon (Linux alapértelmezés szerint a gép bármelyik IP-jére vonatkozó who-has kérésre bármelyik interface válaszol, nemcsak az, amelyikre az adott IP be van állítva). Egy interface esetén nem muszáj beállítani, de bajt nem okoz.
- amíg a telepítés alatti gép a belhálón van és DHCP-t használ, kell a dhcp direktíva is, de statikus IP esetén vegyük ki.
- a norfc1918 blokkolja a nem route-olható címekről érkező forgalmat, ezt akkor érdemes aktiválni, ha a szerver előtt már nincs címfordítás (csak a publikus szervereken, de NAT-olt DMZ-ben nyilván nem).
hosts
Egy Ethernet interface esetén ezen belül kell a zónákhoz IP tartományokat rendelni - itt definiáljuk a trusted (trs) zónát. A hozzárendelés felülről lefelé értékelődik ki, vagyis átfedés esetén a sorrend fontos! Az ezen tartományokkal le nem fedett hálózat az interfaces állományban megadott zónát (net) alkotja. Ha újabb zónára lenne szükség, azt itt kell felvenni; kerülendő az IP-k bedrótozása a szabályokba!
-rw-r----- root root /etc/shorewall/hosts #ZONE HOST(S) OPTIONS trs eth0:IP.IP.IP.IP/MASK,IP.IP.IP.IP/MASK
Két (vagy több) interface (hálókártya) esetén
Ez a szakasz használandó, ha a telepítés alatt álló szerver egyszerre két (vagy több) hálózatnak is tagja, de ezek között nem teremt kapcsolatot (nem router) - tipikusan az egyik lábon pl. belhálózati fájlkiszolgálás, a másik lábon pl. nyilvános web- vagy email kiszolgálás történik.
Megjegyzés: ilyenkor a szerver mintegy áthidalja a belhálózatot védő tűzfalat; klasszikus szemléletben ez súlyos biztonsági rés lenne, de a jelenlegi felfogásunk szerint egyfelől a belhálózati lét önmagában nem jelent védelmet csak hozzáférés-korlátozást, másfelől egy szigorúan telepített (Debian) szervernek meg kell védenie magát és tudnia kell blokkolni az átmenetet.
interfaces
Feltételezve, hogy az eth0 a belhálózati és az eth1 a külső interface, és utóbbinak statikus IP címe van:
-rw-r----- root root /etc/shorewall/interfaces ?FORMAT 2 ############################################################################### #ZONE INTERFACE OPTIONS # net eth0 arp_filter,dhcp,logmartians,nosmurfs,routefilter,tcpflags #,blacklist,norfc1918 net eth1 arp_filter,blacklist,logmartians,norfc1918,nosmurfs,routefilter,tcpflags #,dhcp
- az arp_filter biztosítja, hogy több interface-szel rendelkező gép esetén minden interface csak a saját IP-jére vonatkozó who-has kérésére válaszoljon (Linux alapértelmezés szerint a gép bármelyik IP-jére vonatkozó who-has kérésre bármelyik interface válaszol, nemcsak az, amelyikre az adott IP be van állítva).
- ha a gép a belhálózaton DHCP-t használ, kell a dhcp direktíva; statikus IP esetén vegyük ki.
- a norfc1918 blokkolja a nem route-olható címekről érkező forgalmat; ezt a külső interface-en érdemes aktiválni, ha a szerver külső lába előtt már nincs címfordítás (NAT-olt DMZ-ben nyilván nem).
hosts
Itt definiáljuk a trusted (trs) zónát (az IP tartomány megadása egy fokkal szigorúbb, mintha magát az interface-t tekintenénk megbízhatónak; shared network esetén (amikor egy fizikai belhálózaton több logikai hálózat osztozik) mindenképpen itt kell definiálni a trs-t. A hozzárendelés felülről lefelé értékelődik ki, vagyis átfedés esetén a sorrend fontos! Az ezen tartományokkal le nem fedett hálózat az interfaces állományban megadott zónát (net) alkotja. Ha újabb zónára lenne szükség, azt itt kell felvenni; kerülendő az IP-k bedrótozása a szabályokba!
-rw-r----- root root /etc/shorewall/hosts #ZONE HOST(S) OPTIONS trs eth0:IP.IP.IP.IP/MASK
providers
Az alábbi két beállítás (providers, rtrules) csak akkor használandó, ha mindkét interface-en keresztül keresztül ki kell látni az Internetre (azaz /etc/network/interfaces állományban mindkét hálózaton van definiálva gateway)! Ha csak egy gateway van, ezt a részt nem kell/szabad beállítani! Bővebben ld.: Shorewall Multi-ISP dokumentáció.
Itt definiáljuk a két hálózati uplinket és előírjuk, hogy az adott interface-en érkező csomagra ugyanazon az interface-en kell válaszolni (track):
-rw-r----- root root /etc/shorewall/providers #NAME NUMBER MARK DUPLICATE INTERFACE GATEWAY OPTIONS COPY Outland 1 1 - eth1 detect track Inland 2 2 - eth0 detect track
rtrules
Itt előírjuk, hogy a szerverről kezdeményezett kapcsolatoknál alapértelmezésben az Outland providert kell használni (kivétel, ha a cél a belhálózatban van):
-rw-r----- root root /etc/shorewall/rtrules #SOURCE DEST PROVIDER PRIORITY - IP.IP.IP.IP/MASK Inland 1000 lo - Inland 1001 #lo - Outland 1001
ahol IP.IP.IP.IP/MASK általában a trs zóna (osztott belhálózat esetén a belső Ethernet interface /etc/network/interfaces-beli) meghatározásával megegyezik.
Amíg a szerver telepítés alatt áll és nincs aktív publikus lába, az Outland sort a fentiek szerint kommentezzük ki (különben csak a belhálózatot látnánk, minden más forgalom az inaktív publikus lábon próbálna kimenni); később, a biztonsági megerősítés és a publikus láb aktiválása után a komment áthelyezésével (és természetesen a Shorewall újraindításával) állítsuk be a végleges útvonalakat.
policy
Itt kell megadni az alapértelmezett viselkedést másutt nem kezelt csomagok esetére (eldobás és naplózás).
Megjegyzés: az ilyen esetre vonatkozó "igazi" iptables policy-k nem lényegesek, mert a Shorewall minden eredeti láncot logdrop-pal zár le.
-rw-r----- root root /etc/shorewall/policy #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST fw all REJECT warn net fw DROP info trs fw REJECT warn # The FOLLOWING POLICY MUST BE LAST all all DROP info
rules
A tűzfalszabályokban befelé csak a ping, az SSH, SMTP, web (mindenhonnan) és az Amanda (csak a belhálózatról) engedélyezett. Kifelé engedélyezett a ping, a DNS lekérés és a traceroute, a levélküldés SMTP-vel, az időszinkron NTP protokollal, PGP kulcsszerverek elérése, a web és az FTP. Opcionálisan az SSH is engedélyezett lehet.
Megjegyzés: biztonságosabbnak tűnik az SSH-t kifelé tiltani, és az SCP-t mindig az adminisztrátor által használt, távoli gépről indítani - ez alól csak a szolgáltatások átköltöztetése idejére, tetemes adatforgalom esetén lenne érdemes kivételt tenni. A vonatkozó action-ök ezért kommentezve vannak.
-rw-r----- root root /etc/shorewall/rules [...] ?SECTION NEW # RULES HANDLING INCOMING CONNECTIONS # Accept ping from anywhere Ping/ACCEPT all fw # Accept ping from trs; silently drop from any other source #Ping/ACCEPT trs fw #Ping/DROP all fw # Public services SSH/ACCEPT all fw SMTP/ACCEPT all fw Web/ACCEPT all fw # Accept Amanda connections from trs Amanda/ACCEPT trs fw ACCEPT trs fw udp 1:65535 amanda ACCEPT trs fw tcp amandaidx ACCEPT trs fw tcp amidxtape # From net incoming auth request silently dropped (stealth); # from trs rejected by default DROP net fw tcp 113 # Any other trials logdropped by default # (broadcasts, invalids, not-syns, SMB, SMTP, UPn silently) # RULES HANDLING OUTBOUND CONNECTIONS Ping/ACCEPT fw all Amanda/ACCEPT fw all Auth/ACCEPT fw all DNS/ACCEPT fw all FTP/ACCEPT fw all NTP/ACCEPT fw all SMTP/ACCEPT fw all #SSH/ACCEPT fw all Trcrt/ACCEPT fw all Web/ACCEPT fw all #PGPKeys/ACCEPT ACCEPT fw all tcp 11371 ACCEPT fw all udp 11371 # # Any other trials logdropped by default #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
loglimit
A logfile-ok elárasztását megakadályozandó, vegyük fel a Shorewall konfigurációjába az alábbi előírást:
-rw-r----- root root /etc/shorewall/shorewall.conf [...] LOGLIMIT="1/sec:60" [...]
amely hosszú távon másodpercenként legfeljebb egy bejegyzést engedélyez (részletesen ld. itt).
Használatba vétel
Ehhez a /etc/default/shorewall állományban a startup értékét 1-re kell állítani:
-rw-r--r-- root root /etc/default/shorewall [...] startup=1
majd a tűzfal elindítható:
systemctl start shorewall
Bug: nehézség esetén ld. ezt a hibabejelentést - remélem, a kiadásig a hibát ki fogják javítani.
A generált iptables szabályok megtekinthetőek az alábbi paranccsal:
iptables -n -L | less
Tűzfal log átirányítása
Érdemes elkülöníteni a terjedelmes tűzfal logokat a többitől. Az alanti megoldás a Gentoo Security listáról való, és feltételezi, hogy a Shorewall csak warn és info szintű syslog bejegyzéseket készít. Az elkülönítéshez készítsünk egy log könyvtárat a Shorewall számára:
mkdir -m 750 /var/log/shorewall
Ezután szerkesszük meg a /etc/syslog-ng/syslog-ng.conf file-t, és szúrjuk be a Destinations section végére:
-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf [...] # Shorewall separate logging # originally: http://marc.theaimsgroup.com/?l=gentoo-security&m=106040714910563&w=2 destination d_shorewall_warn { file ("/var/log/shorewall/warn.log" owner(root) group(adm)); }; destination d_shorewall_info { file ("/var/log/shorewall/info.log" owner(root) group(adm)); };
Ugyanitt a Filters section végére:
-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf [...] # Shorewall separate logging # originally: http://marc.theaimsgroup.com/?l=gentoo-security&m=106040714910563&w=2 filter f_shorewall_warn { level (warn) and match ("Shorewall" value ("MESSAGE")); }; filter f_shorewall_info { level (info) and match ("Shorewall" value ("MESSAGE")); };
Végül a Log paths section elejére (így a flags(final); direktíva miatt csak ezekbe a logokba kerül a kimenet):
-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf [...] # Shorewall separate logging # originally: http://marc.theaimsgroup.com/?l=gentoo-security&m=106040714910563&w=2 log { source (s_src); filter (f_shorewall_warn); destination (d_shorewall_warn); flags(final); }; log { source (s_src); filter (f_shorewall_info); destination (d_shorewall_info); flags(final); };
Az új logok rotálásához egészítsük ki a /etc/logrotate.d/shorewall állományt az alábbiakkal:
-rw-r--r-- root root /etc/logrotate.d/shorewall [...] /var/log/shorewall/*.log { daily rotate 7 compress missingok create 0640 root adm }
A változtatások érvényesítésére indítsuk újra a syslog-ng-t:
systemctl restart syslog-ng
Gyorsteszt
Próbáljunk ki egy tiltott kapcsolódást és ellenőrizzük, hogy az sikertelen, valamint hogy a megfelelő Shorewall logban létrejön a bejegyzés:
telnet 1.2.3.4 111; sleep 1; tail -f /var/log/shorewall/warn.log
Tűzfal kinyitása
Ha átmenetileg(!) ki kell kapcsolni a csomagszűrést, ez pl. a következő paranccsal tehető meg:
systemctl stop shorewall
Irodalom
- Shorewall 4.x dokumentáció (angol)