Debian bástyagép tűzfal (Jessie)

A AdminWiki wikiből

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