Ubuntu bástyagép tűzfal (Fossa)

Innen: AdminWiki

A Hálózati házirend szerint valamennyi szervert bastion host-ként kell kialakítani, azaz saját (csomagszűrő) tűzfallal kell rendelkezzen. A gyakorlatban ez a Linux kernel netfilter (iptables) konfigurálását jelenti, amelyet ebben a leírásban az Ubuntu terjesztésben alapértelmezetten telepített UFW (Uncomplicated Firewall) parancssori frontend segítségével valósítunk meg.

  • Ez a leírás a majdani publikus eléréshez szükséges, alapvető csomagszűrést valósít meg, egy darab hálózati interface-szel rendelkező szervergépen.
  • Ez a leírás csak IPv4-re vonatkozik - IPv6 TODO!

A beállításokat rendszergazda konzolon (sudo -i) célszerű elvégezni.

Hálózati segédeszközök

Elsősorban az ifconfig használatához szokott rendszergazdáknak opcionálisan célszerű a net-tools csomag telepítése:

apt install net-tools

Az IPv6 tiltása

Tisztán IPv4 környezetben opcionálisan érdemes teljesen letiltani az IPv6 forgalmat. Ehhez adjunk hozzá egy kernel paramétert a grub-ban átadott boot paraméterekhez:

-rw-r--r-- root root /etc/default/grub

[...]
GRUB_CMDLINE_LINUX_DEFAULT="[...] ipv6.disable=1"
[...]

Érvényesítsük a beállításokat:

update-grub

majd indítsuk újra a gépet.

Ellenőrzés: újraindítás után az ifconfig vagy ip a parancsok kimenete már nem mutat IPv6 címeket.

UFW alapbeállítások

Amennyiben az IPv6-ot fentebb letiltottuk, ezt a beállítást vezessük át a /etc/default/ufw állományban is:

-rw-r--r-- /etc/default/ufw

[...]
# Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback
# accepted). You will need to 'disable' and then 'enable' the firewall for
# the changes to take affect.
IPV6=no
[...]

Ezután állítsunk be egy alap csomagszűrő szabálykészletet.

A bejövő forgalom engedélyezése

Alapértelmezésben az ufw inaktív, és az iptables nem tartalmaz szabályokat:

ufw status      # inactive
iptables -n -L  # mindhárom chain üres

Mivel a /etc/default/ufw állományban előírt ufw policy a bejövő forgalom tiltása, mielőtt aktiválnánk a csomagszűrést, mindenképpen engedélyezzük a kívülről csatlakozást legalább az OpenSSH szolgáltatáshoz:

ufw app info OpenSSH   # case-sensitive! - ellenőrizzük a portszámot
ufw allow OpenSSH      # állítsuk be a szabályt

A fenti parancsban az alkalmazással együtt települő alkalmazásleírásra (/etc/ufw/application.d alatti állomány) hivatkoztunk, így nem kellett közvetlenül portszámokat megadni. A létrehozott tűzfal szabályok megtekinthetőek a /etc/ufw/user.rules állományban.

Ezután bekapcsolhatjuk a csomagszűrést:

ufw enable
ufw status verbose  # Status: active
iptables -n -L      # A létrehozott iptables beállítások

A kimenő forgalom szigorítása

Alapértelmezetten a kimenő forgalomra az ACCEPT policy van beállítva, azaz a kimenő forgalmat nem szűrjük. Opcionálisan de javasoltan érdemes lehet kifelé csak a ping és traceroute, a DNS lekérés, a levélküldés SMTP-vel (+SMTPs, MSA), az időszinkron NTP protokollal, PGP kulcsszerverek elérése (HKP), a web és az FTP forgalmakat engedélyezni. Opcionálisan az SSH is engedélyezett lehet.

Az ICMP forgalom megtartására szúrjuk be az alábbi parancssort a /etc/ufw/before.rules állományba:

-rw-r----- root root /etc/ufw/before.rules

[...]
# ok all icmp for output
-A ufw-before-output -p icmp -j ACCEPT

# allow dhcp client to work
[...]

A többi korlátozást az alábbi parancsok egyszeri kiadásával írhatjuk elő:

ufw allow out domain
ufw allow out smtp
ufw allow out smtps
ufw allow out submission
ufw allow out ntp
ufw allow out hkp
ufw allow out http
ufw allow out https
ufw allow out ftp
ufw default reject outgoing  # Minden mást visszadobunk

Ellenőrzésképpen kérjünk egy státuszt:

ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] 53                         ALLOW OUT   Anywhere                   (out)
[ 3] 25/tcp                     ALLOW OUT   Anywhere                   (out)
[ 4] 465/tcp                    ALLOW OUT   Anywhere                   (out)
[ 5] 587/tcp                    ALLOW OUT   Anywhere                   (out)
[ 6] 123/udp                    ALLOW OUT   Anywhere                   (out)
[ 7] 11371/tcp                  ALLOW OUT   Anywhere                   (out)
[ 8] 80/tcp                     ALLOW OUT   Anywhere                   (out)
[ 9] 443/tcp                    ALLOW OUT   Anywhere                   (out)
[10] 21/tcp                     ALLOW OUT   Anywhere                   (out)

Tűzfalnapló átirányítása

Érdemes elkülöníteni a terjedelmes tűzfal naplót a kernel naplójától. Ehhez készítsünk egy overlay állományt a syslog-ng konfigurációjához:

-rw-r--r-- /etc/syslog-ng/conf.d/ufw.conf

# Separate UFW logging

destination d_ufw
    { file ("/var/log/ufw.log" owner(root) group(adm)); };

filter f_ufw
    { match ("[UFW " value ("MESSAGE")); };
                                        
log { source (s_src); filter (f_ufw); destination (d_ufw); flags(final); };

A beállítás érvényesítéséhet indítsuk újra a syslog-ng-t:

systemctl restart syslog-ng

Mivel a /etc/logrotate.d már tartalmazza a vonatkozó konfigurációs állományt, az új log rotálásáról külön gondoskodni nem kell.