Moodul 5 · 5.2
Tulemüür ufw ja nftablesiga
Moodul 5: Võrgu kaitsmine · Lugemisaeg: 12 minutit
Õpieesmärk: Pärast seda õppetundi oskad seadistada tulemüüri, mis lubab ainult vajalikku, nii IPv4 kui ka IPv6 jaoks, ilma ennast välja lukustamata. Samuti tead, mille eest tulemüür sinu serveris ei kaitse.
Põhimõisted: paketifilter, netfilter, nftables, iptables-nft, ufw, vaikepoliitika, allow, deny, reject, limit, IPv6 ufw-s, teenusepakkuja tulemüür, firewalld, Docker ja tulemüür
Mida tulemüür teeb
Serveri tulemüür on paketifilter: iga sissetuleva võrgupaketi puhul vaatab see reeglite nimekirja ja otsustab, kas pakett pääseb läbi. Linuxis asub see filter kernelis ja selle nimi on netfilter. Seadistad seda mõne programmiga:
- nftables (käsk
nft) on praegune tööriist. Debian kasutab seda vaikimisi alates Debian 10-st. - iptables on vana tööriist. Tänapäevastes süsteemides on
iptablesenamasti tõlge nftablesi peale (iptables-nft), et vanad juhendid töötaksid edasi. - ufw (Uncomplicated Firewall) on lihtne kiht selle peal. Ubuntus on see vaikimisi olemas ja Debianisse saad selle paigaldada ühe käsuga. Ühe serveri jaoks on ufw kõige lihtsam valik. See õppetund kasutab ufw-d ja näitab seejärel, kuidas samad reeglid nftablesis välja näevad.
Tulemüür on sinu teine kaitsekiht. Esimene on see, et teenused kuulavad ainult õigel aadressil (õppetund 5.1). Koos tagavad need, et viga ühes kihis ei tähenda kohe avatud ust.
Kõigepealt: kuidas pääsed tagasi, kui midagi läheb valesti?
Klassikaline viga: lülitad tulemüüri sisse, unustad SSH lubada ja ühendus katkeb. SSH kaudu sa enam serverisse ei pääse. Enne alustamist:
- Tea, kuidas avada oma teenusepakkuja konsooli (õppetund 1.2). See töötab võrgust sõltumatult, seega ka siis, kui tulemüür kõik kinni paneb. Logi seal sisse ja sisesta
ufw disable. - Tee kahtluse korral hetktõmmis (snapshot).
- Hoia praegune SSH-seanss lahti ja testi teise seansiga.
ufw viie sammuga
Samm 1: paigalda ja vali vaikeseaded.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'Vaikepoliitika kehtib kõigele, mille kohta reeglit pole. "Deny incoming" tähendab: kõik sissetulev on keelatud, välja arvatud see, mida järgmisena lubad. See on ainus turvaline alus. Väljaminevat liiklust (näiteks kui server laadib uuendusi) lubad.
Samm 2: luba SSH enne, kui tulemüüri sisse lülitad.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH on rakenduseprofiil, mida ufw tunneb (see tähendab porti 22/tcp). Kui SSH töötab muul pordil, kasuta numbrit: sudo ufw allow 2222/tcp. Pane tähele rida "Rules updated (v6)": ufw loob reegli ka IPv6 jaoks. Ta teeb seda, sest failis /etc/default/ufw on rida IPV6=yes, mis on vaikeseade. Kontrolli seda igaks juhuks; kui seal on no, kehtib tulemüür ainult IPv4 jaoks.
Samm 3: mida sul veel vaja on.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # ainult siis, kui kasutad HTTP/3Reegli saad piirata ühe lähteaadressiga, näiteks halduspordi puhul, mis peab olema avatud ainult sinu kontorist:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpSamm 4: lülita sisse.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupSamm 5: kontrolli. Ava teine aken ja logi uuesti sisse. Kui see õnnestub, on SSH korras. Seejärel vaata reegleid:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)Reegli eemaldamiseks kasuta numbreid: sudo ufw status numbered ja seejärel sudo ufw delete 3.
deny, reject ja limit
- deny laseb paketil vaikselt kaduda: väljastpoolt paistab port "filtreeritud" (õppetund 5.1).
- reject saadab tagasi keeldumise: väljastpoolt paistab port "suletud". Sinu enda teenuste puhul viisakam, kuid see reedab, et seal on server.
- limit lubab ühenduse, aga blokeerib aadressi, mis proovib 30 sekundi jooksul kuus või enam korda ühendust luua. Kasulik SSH jaoks:
sudo ufw limit OpenSSHasemelallow. See on jäme meetod (loeb ühendusi, mitte ebaõnnestunud sisselogimisi); fail2ban (õppetund 5.3) on täpsem.
Samad reeglid nftablesis
ufw kirjutab kapoti all netfilteri reegleid. Kui tahad töötada ilma ufw-ta, kirjutad ise nftablesi faili. Debianis asub see failis /etc/nftables.conf ja laed selle teenusega nftables:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}Loe seda nii. Tabeli nimi on filter ja see kuulub perekonda inet: üks tabel korraga nii IPv4 kui ka IPv6 jaoks, nii et IPv6 ei saa ununeda. Ahelas input on poliitika drop. Edasi: vastused juba olemasolevatele ühendustele tohivad tagasi tulla (established,related), kõik loopbackil on lubatud, ICMP on lubatud (vajalik muu hulgas IPv6 ja paketisuuruse veateadete jaoks) ning pordid 22, 80 ja 443 on lubatud.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # kontrollib ilma laadimata
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetKasuta kas ufw-d või oma nftablesi faili, mitte mõlemat: need kirjutavad samasse netfilterisse ja võivad teineteise reeglitega vastuollu minna.
Mille eest tulemüür ei kaitse
- Teenused, mida ise lubad. Port 443 on sinu veebisaidi jaoks avatud; seega on ka veebisaidi turvaauk lihtsalt kättesaadav. Tulemüür kaitseb ainult suletud porte.
- Docker. Kui avaldad Dockeriga pordi (
-p 5432:5432), lisab Docker oma netfilteri reeglid, mis suunavad liikluse ümber enne, kui ufw reeglid rakenduvad. Dockeri dokumentatsioon ütleb sõna-sõnalt, et Docker ja ufw ei sobi hästi kokku. Konteineri port võib seega olla väljast avatud, kuigiufw statusseda ei näita. Lahenduse (avaldamine aadressil127.0.0.1) õpid õppetunnis 9.3. - Väljaminev liiklus. "Allow outgoing" puhul võib häkitud programm ühenduda kuhu iganes. Enamiku väikeste serverite jaoks on see vastuvõetav valik; ranges keskkonnas piiratakse ka väljaminevat liiklust.
Sinu teenusepakkuja tulemüür
Paljudel teenusepakkujatel on ka võrgus, sinu serveri ees, tulemüür, mida seadistad kliendipaneelis (mõnikord nimega "cloud firewall" või "security group"). See on suurepärane lisakiht ja töötab ka siis, kui serveris endas midagi valesti seadistad. Kuid see ei asenda serveri tulemüüri: kui kolid serveri või vahetad teenusepakkujat, ei tule see kaasa, ja mitte iga teenusepakkuja seda ei paku. Seepärast hoia alati tulemüür ka serveris endas.
AlmaLinuxis ja Rocky Linuxis
Seal on vaikimisi sees firewalld, mis kasutab tsoone. Olulisemad käsud:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadIlma --permanent-ta kehtib muudatus ainult järgmise taaskäivituseni; --permanent-ga alles pärast käsku --reload. Vaiketsoonis on SSH juba avatud.
Praktikas
Kui lukustad end WebOké VPS-ist siiski välja, ava VPS-i vaates konsool, logi sisse ja lülita tulemüür välja (ufw disable) või võta viimane reegel tagasi. Teistel teenusepakkujatel kannab see hädasissepääs samuti nime konsool, VNC või rescue. Tea, kus see nupp asub, enne kui seda vajad.
Kokkuvõte
- Tulemüür on sinu teine kiht pärast põhimõtet "kuula ainult seal, kus vaja"; nftables on kerneli tööriist, ufw lihtne kiht selle peal.
- Alusta käsuga
default deny incoming, luba SSH enne käskuufw enable, testi teise seansiga ja tunne oma teenusepakkuja konsooli. - Kontrolli, et ufw kataks ka IPv6 (
IPV6=yes); nftablesis teeb perekondinetseda korraga. denyannab väljastpoolt tulemuse "filtreeritud",rejecttulemuse "suletud";limitpidurdab korduvaid ühendusi.- Dockeri pordid lähevad ufw-st mööda (õppetund 9.3); teenusepakkuja tulemüür on lisakiht, mitte asendus.
Test (quiz)
Ülesanne
Ülesanne O5.2: Seadista oma tulemüür. Lülita oma serveris sisse tulemüür ufw-ga (või nftablesiga, või AlmaLinuxis/Rockys firewalld-ga): vaikimisi kõik sissetulev kinni, SSH lubatud ja lisaks see, mida sul tõesti vaja on. Testi teise seansiga, kontrolli, kas IPv6 on kaetud, ja vaata väljastpoolt käsuga nc, kas mõni lubamata port on suletud või filtreeritud. Täida kontrollnimekiri ja kleebi oma ufw status verbose (või nft list ruleset); märgi iga avatud pordi juurde, milleks see on.
Ülesanne O5.2: Seadista oma tulemüür
Selle ülesande teed ise, keegi ei kontrolli seda. Märgi ära, mida tegid, ja märgi ülesanne tehtuks.
Veebiserveril ainult 22 (või sinu SSH-port), 80 ja 443, nii IPv4 kui ka IPv6 jaoks. Halduspordid ainult kindlalt aadressilt või SSH-tunneli kaudu. Konsooli kaudu: ufw disable (või tühjenda nftablesi reeglid).
Su linnukesed ja märkmed jäävad ainult sellesse brauserisse, me ei saada neid kuhugi. Kui oled sisse loginud, salvestame Minu kursustes ainult info, et tegid ülesande ära.
Loe edasi
- Oma VPS-i turvamine: esimesed viis minutit
- Pole enam ligipääsu oma VPS-ile: mis nüüd?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Ubuntu Serveri dokumentatsioon, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Dockeri dokumentatsioon, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
