5. modulis · 5.2
Ugunsmūris ar ufw un nftables
5. modulis: Tīkla aizsardzība · Lasīšanas laiks: 12 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet iestatīt ugunsmūri, kas atļauj tikai to, kas nepieciešams, gan IPv4, gan IPv6, neizslēdzot sevi no servera, un zināsiet, no kā ugunsmūris Jūsu serveri neaizsargā.
Pamatjēdzieni: pakešu filtrs, netfilter, nftables, iptables-nft, ufw, noklusējuma politika, allow, deny, reject, limit, IPv6 programmā ufw, pakalpojumu sniedzēja ugunsmūris, firewalld, Docker un ugunsmūris
Ko dara ugunsmūris
Ugunsmūris Jūsu serverī ir pakešu filtrs: katrai ienākošajai tīkla paketei tas pārbauda noteikumu sarakstu un izlemj, vai to drīkst laist cauri. Linux šis filtrs atrodas kodolā, un to sauc par netfilter. To iestata ar kādu no šīm programmām:
- nftables (komanda
nft) ir pašreizējais rīks. Debian to izmanto pēc noklusējuma kopš Debian 10. - iptables ir vecais rīks. Mūsdienu sistēmās
iptablesparasti ir tulkojums uz nftables (iptables-nft), lai vecās pamācības joprojām darbotos. - ufw (Uncomplicated Firewall) ir vienkāršs slānis virs tā, kas pēc noklusējuma ir pieejams Ubuntu un Debian sistēmā uzstādāms ar vienu komandu. Vienam serverim ufw ir vieglākā izvēle. Šajā nodarbībā izmantojam ufw un pēc tam parādām, kā tie paši noteikumi izskatās nftables.
Ugunsmūris ir Jūsu otrais aizsardzības slānis. Pirmais ir tas, ka pakalpojumi klausās tikai pareizajā adresē (nodarbība 5.1). Kopā tie nodrošina, ka kļūda vienā slānī uzreiz nekļūst par atvērtām durvīm.
Vispirms: kā atgriezties, ja kaut kas noiet greizi?
Klasiskā kļūda: Jūs ieslēdzat ugunsmūri, aizmirstat atļaut SSH, un savienojums pārtrūkst. Tad pa SSH Jūs serverim vairs nepiekļūstat. Pirms sākat:
- Noskaidrojiet, kā atvērt sava pakalpojumu sniedzēja konsoli (nodarbība 1.2). Tā darbojas ārpus tīkla, tātad arī tad, ja ugunsmūris visu aizver. Tur Jūs piesakāties un ierakstāt
ufw disable. - Ja šaubāties, izveidojiet momentuzņēmumu (snapshot).
- Paturiet atvērtu pašreizējo SSH sesiju un pārbaudiet ar otru sesiju.
ufw piecos soļos
1. solis: uzstādīšana un noklusējuma izvēle.
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'Noklusējuma politika attiecas uz visu, kam nav noteikuma. "Deny incoming" nozīmē: viss ienākošais ir aizliegts, izņemot to, ko Jūs pēc tam atļaujat. Tas ir vienīgais drošais pamats. Izejošo datplūsmu (serveris, kas lejupielādē atjauninājumus) Jūs atļaujat.
2. solis: atļaujiet SSH, pirms ieslēdzat ugunsmūri.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH ir lietotnes profils, ko ufw pazīst (tas apzīmē portu 22/tcp). Ja SSH darbojas citā portā, izmantojiet numuru: sudo ufw allow 2222/tcp. Pievērsiet uzmanību paziņojumam "Rules updated (v6)": ufw izveido noteikumu arī IPv6. Tas notiek tāpēc, ka failā /etc/default/ufw ir rindiņa IPV6=yes, kas ir noklusējums. Pārbaudiet to; ja tur ir no, Jūsu ugunsmūris darbojas tikai IPv4.
3. solis: viss pārējais, kas Jums nepieciešams.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # tikai tad, ja Jūs izmantojat HTTP/3Noteikumu var ierobežot ar vienu avota adresi, piemēram, pārvaldības portam, kam drīkst piekļūt tikai no Jūsu biroja:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcp4. solis: ieslēgšana.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup5. solis: pārbaude. Atveriet otru logu un piesakieties vēlreiz. Ja tas izdodas, SSH ir iestatīts pareizi. Pēc tam apskatiet noteikumus:
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)Noteikumu dzēš pēc numura: sudo ufw status numbered un pēc tam sudo ufw delete 3.
deny, reject un limit
- deny paketi klusi izmet: no ārpuses redzams "filtrēts" (nodarbība 5.1).
- reject nosūta atpakaļ atteikumu: no ārpuses redzams "slēgts". Tas ir pieklājīgāk pret Jūsu pašu pakalpojumiem, taču atklāj, ka tur ir serveris.
- limit savienojumu atļauj, bet bloķē adresi, kas 30 sekunžu laikā mēģina izveidot savienojumu sešas vai vairāk reizes. Noderīgi SSH:
sudo ufw limit OpenSSHnevisallow. Tas ir rupjš rīks (tas skaita savienojumus, nevis neveiksmīgas pieteikšanās); fail2ban (nodarbība 5.3) ir precīzāks.
Tie paši noteikumi nftables
ufw aizkulisēs raksta netfilter noteikumus. Ja vēlaties strādāt bez ufw, Jūs pats rakstāt nftables failu. Debian sistēmā tas atrodas /etc/nftables.conf, un to ielādē ar pakalpojumu 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;
}
}Lasiet to šādi. Tabulas nosaukums ir filter, un tā pieder saimei inet: viena tabula vienlaikus IPv4 un IPv6, lai Jūs nevarētu aizmirst IPv6. Ķēdē input politika ir drop. Tālāk: atbildes uz jau esošiem savienojumiem drīkst atgriezties (established,related), viss loopback saskarnē ir atļauts, ICMP ir atļauts (vajadzīgs cita starpā IPv6 un kļūdu paziņojumiem par paketes izmēru), un porti 22, 80 un 443 ir atļauti.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # pārbaudīt bez ielādes
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetIzmantojiet vai nu ufw, vai savu nftables failu, ne abus: tie raksta vienā un tajā pašā netfilter un var traucēt viens otra noteikumiem.
No kā ugunsmūris neaizsargā
- Pakalpojumi, kurus Jūs pats atļaujat. Ports 443 ir atvērts Jūsu vietnei, tātad ievainojamība Jūsu vietnē ir pilnīgi sasniedzama. Ugunsmūris aizsargā tikai slēgtos portus.
- Docker. Ja ar Docker publicējat portu (
-p 5432:5432), Docker iestata savus netfilter noteikumus, kas novirza datplūsmu, pirms sāk darboties ufw noteikumi. Docker dokumentācijā burtiski teikts, ka Docker un ufw kopā labi nesader. Tātad konteinera ports var būt atvērts no ārpuses, kaut ganufw statusto nerāda. Risinājumu (publicēšanu uz127.0.0.1) apgūsiet nodarbībā 9.3. - Izejošā datplūsma. Ar "allow outgoing" uzlauzta programma var sazināties ar jebkuru vietu. Lielākajai daļai mazu serveru tā ir pieņemama izvēle; stingrās vidēs ierobežo arī izejošo datplūsmu.
Pakalpojumu sniedzēja ugunsmūris
Daudziem pakalpojumu sniedzējiem ir arī ugunsmūris tīklā, pirms Jūsu servera, ko iestata klienta panelī (dažreiz to sauc par "cloud firewall" vai "security group"). Tas ir lielisks papildu slānis, un tas darbojas arī tad, ja pašā serverī esat kaut ko iestatījis nepareizi. Taču tas neaizstāj ugunsmūri serverī: ja pārvietojat serveri vai maināt pakalpojumu sniedzēju, tas nepārceļas līdzi, un ne katrs pakalpojumu sniedzējs to piedāvā. Tāpēc vienmēr uzturiet ugunsmūri arī pašā serverī.
AlmaLinux un Rocky Linux
Tur pēc noklusējuma ir ieslēgts firewalld ar zonām. Svarīgākās komandas:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadBez --permanent izmaiņas ir spēkā tikai līdz nākamajai restartēšanai; ar --permanent tās stājas spēkā tikai pēc --reload. Standarta zonā SSH jau ir atvērts.
Praksē
Ja tomēr esat sevi izslēdzis no VPS pie WebOké, VPS ekrānā atveriet konsoli, piesakieties un izslēdziet ugunsmūri (ufw disable) vai atsauciet pēdējo noteikumu. Pie citiem pakalpojumu sniedzējiem šo avārijas ieeju arī sauc par konsoli, VNC vai rescue. Noskaidrojiet, kur atrodas šī poga, pirms Jums tā ir vajadzīga.
Kopsavilkums
- Ugunsmūris ir Jūsu otrais slānis pēc principa "klausīties tikai tur, kur vajag"; nftables ir rīks kodolā, ufw ir vienkāršs slānis virs tā.
- Sāciet ar
default deny incoming, atļaujiet SSH pirmsufw enable, pārbaudiet ar otru sesiju un ziniet sava pakalpojumu sniedzēja konsoli. - Pārbaudiet, vai ufw aptver arī IPv6 (
IPV6=yes); nftables to uzreiz paveic saimeinet. denyno ārpuses rāda "filtrēts",rejectrāda "slēgts";limitbremzē atkārtotus savienojumus.- Docker porti apiet ufw (nodarbība 9.3); pakalpojumu sniedzēja ugunsmūris ir papildu slānis, nevis aizstājējs.
Tests (quiz)
Uzdevums
Uzdevums O5.2: Jūsu ugunsmūra iestatīšana. Ieslēdziet savā serverī ugunsmūri ar ufw (vai nftables, vai firewalld sistēmā AlmaLinux/Rocky): pēc noklusējuma viss ienākošais slēgts, SSH un tas, kas Jums vēl patiešām nepieciešams. Pārbaudiet ar otru sesiju, pārliecinieties, ka IPv6 ir aptverts, un no ārpuses ar nc pārbaudiet, vai neatļauts ports ir slēgts vai filtrēts. Aizpildiet kontrolsarakstu un ielīmējiet savu ufw status verbose (vai nft list ruleset); katram atvērtajam portam norādiet, kam tas paredzēts.
Uzdevums O5.2: Jūsu ugunsmūra iestatīšana
Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.
Tīmekļa serverim tikai 22 (vai Jūsu SSH ports), 80 un 443, gan IPv4, gan IPv6. Pārvaldības portus tikai no fiksētas adreses vai caur SSH tuneli. Caur konsoli: ufw disable (vai iztukšojiet nftables noteikumus).
Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.
Vairāk lasīt
- Jūsu VPS aizsardzība: pirmās piecas minūtes
- Vairs nav piekļuves Jūsu VPS: ko darīt tagad?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Ubuntu Server dokumentācija, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Docker dokumentācija, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
