Ugrás a tartalomhoz

Sütibeállítások

Típusonként válassza ki, mely sütiket engedélyezi. Választását bármikor módosíthatja a Sütibeállítások linken, amely minden oldal alján megtalálható. Adatvédelmi nyilatkozat

Szükséges

Mindig bekapcsolva

A bejelentkezéshez, a kosár megőrzéséhez és a választásai megjegyzéséhez szükségesek. Ezek mindig be vannak kapcsolva.

Milyen sütik?
  • weboke_sessie, weboke_klant, weboke_remember: a munkamenet és a bejelentkezve maradás
  • weboke_basket: a kosár
  • wkBtwIncl: az árak megjelenítése ÁFÁ-val vagy anélkül
  • wok_cookies: a sütiválasztás, 12 hónap

Méri, melyik hirdetés vezet látogatáshoz vagy rendeléshez, hogy ne fizessünk hatástalan hirdetésekért.

Milyen sütik?
  • Google Ads a Google Tag Manageren keresztül (_gcl_au, _gcl_aw), legfeljebb 90 napig
  • OpenAI Ads, hirdetések a ChatGPT-ben
  • wok_aff: melyik partnerünk ajánlására érkezett (partnerprogram), 60 nap

4,6

Ország és nyelv

Minden országnak saját oldala van, az adott ország áraival és ÁFA-jával.

Megtekintés

Portok és figyelő szolgáltatások

Modul 5: A hálózat védelme · Olvasási idő: 10 perc

Tanulási cél: A lecke után Ön látni fogja, mely szolgáltatások figyelnek a szerverén és milyen címen, el tudja magyarázni a különbséget a 0.0.0.0 és a 127.0.0.1 között, és kívülről ellenőrizni tudja, mit lát a szerveréből bárki az interneten.

Kulcsfogalmak: port, TCP és UDP, figyelés (listen), ss -tulpn, 0.0.0.0 és [::], 127.0.0.1 és [::1], bind-address, nyitott, zárt és szűrt, támadási felület, szkennerek

Egy IP-cím 65 535 ajtóval

A szerverének van egy IP-címe, például 192.0.2.10 és 2001:db8::10. Ezen a címen egyszerre több program is elérhető lehet, mindegyik a saját portján: ez egy 1 és 65 535 közötti szám. Az a program, amely kapcsolatokat fogad, egy porton figyel. Néhány ismert példa:

PortProtokollSzolgáltatás
22TCPSSH
80TCPhttp (webszerver)
443TCP és UDPhttps (UDP a HTTP/3-hoz)
25TCPlevelezés a levelezőszerverek között (SMTP)
3306TCPMySQL és MariaDB
5432TCPPostgreSQL
6379TCPRedis

A TCP azoknak a kapcsolatoknak a protokollja, amelyeknek megbízhatóan kell célba érniük (web, SSH, adatbázisok). Az UDP gyors, különálló csomagokra szolgál (DNS, VPN-ek, például a WireGuard, HTTP/3). Egy szolgáltatás figyelhet TCP-n, UDP-n vagy mindkettőn.

Minden figyelő port egy ajtó a szerverére. Minden ajtó mögött szoftver áll, amely hibákat tartalmazhat. A kívülről elérhető ajtók összességét nevezzük támadási felületnek. Minél kisebb, annál jobb: egy weboldalt kiszolgáló szervernek kívülről csak a 22-es, a 80-as és a 443-as portra van szüksége.

Mi figyel? Az ss parancs

A ss (socket statistics) parancs megmutatja, mi figyel a szerverén. A következő kapcsolókkal: -t (TCP), -u (UDP), -l (csak a figyelők), -p (melyik program) és -n (számok, nem nevek):

anna@web1:~$ sudo ss -tulpn
Netid State  Local Address:Port  Peer Address:Port Process
udp   UNCONN 127.0.0.54:53       0.0.0.0:*         users:(("systemd-resolve",pid=402,fd=16))
tcp   LISTEN 0.0.0.0:22          0.0.0.0:*         users:(("sshd",pid=611,fd=3))
tcp   LISTEN 0.0.0.0:80          0.0.0.0:*         users:(("nginx",pid=902,fd=6))
tcp   LISTEN 0.0.0.0:443         0.0.0.0:*         users:(("nginx",pid=902,fd=7))
tcp   LISTEN 127.0.0.1:3306      0.0.0.0:*         users:(("mariadbd",pid=755,fd=21))
tcp   LISTEN 0.0.0.0:6379        0.0.0.0:*         users:(("redis-server",pid=780,fd=6))
tcp   LISTEN [::]:22             [::]:*            users:(("sshd",pid=611,fd=4))
tcp   LISTEN [::]:80             [::]:*            users:(("nginx",pid=902,fd=8))
tcp   LISTEN [::]:443            [::]:*            users:(("nginx",pid=902,fd=9))

A legfontosabb oszlop a Local Address: ez az a cím, amelyen a program figyel.

CímJelentés
0.0.0.0A szerver összes IPv4-címe, tehát a nyilvános cím is: kívülről elérhető (hacsak egy tűzfal meg nem akadályozza)
[::]Az összes IPv6-cím: ugyanez IPv6-ra
127.0.0.1 vagy [::1]Csak maga a szerver (loopback): kívülről soha nem érhető el
127.0.0.53, 127.0.0.54Szintén loopback; itt a systemd-resolved helyi DNS-segédje figyel
192.0.2.10Csak ez az egy cím

A fenti példában a MariaDB rendben van: a 127.0.0.1 címen figyel, így csak a szerveren futó programok (például az Ön weboldala) érhetik el. A Redis viszont a 0.0.0.0:6379 címen figyel. Ha a tűzfal nincs jól beállítva, az egész internet hozzáférhet. Pontosan ilyen hibákról szól ez a lecke.

Figyelés a megfelelő címen

Egy adatbázisnak, gyorsítótárnak vagy kezelőfelületnek szinte soha nem szabad kívülről elérhetőnek lennie. Az első és legjobb védekezés az, hogy a szolgáltatás csak a loopback címen figyel. A tűzfal (5.2. lecke) a második réteg; az véletlenül ki lehet kapcsolva, vagy nem minden esetben érvényes (például Docker esetén, 9.3. lecke).

Hogy ezt hol állítja be, az programonként eltér:

ProgramBeállításFájl (Debian/Ubuntu)
MariaDB/MySQLbind-address = 127.0.0.1/etc/mysql/mariadb.conf.d/50-server.cnf
PostgreSQLlisten_addresses = 'localhost'/etc/postgresql/<versie>/main/postgresql.conf
Redisbind 127.0.0.1 -::1 és protected-mode yes/etc/redis/redis.conf

A Debian és az Ubuntu csomagjai ezeket a szolgáltatásokat alapértelmezetten már a localhostra állítják. A hiba általában akkor történik, amikor valaki egy olyan útmutatót követ, amely azt mondja: „állítsa a bind-address értékét 0.0.0.0 címre, hogy kívülről csatlakozhasson”. Ha Ön a saját laptopjáról szeretné elérni az adatbázist, használjon SSH-alagutat (2.3. lecke): a port zárva marad, és csak az fér hozzá, aki SSH-n keresztül jön be.

A módosítás után indítsa újra a szolgáltatást, és nézze meg újra a ss -tulpn paranccsal.

Nyitott, zárt és szűrt

Kívülről nézve egy port háromféle állapotban lehet:

  • Nyitott (open): valami figyel, és a kapcsolat létrejön.
  • Zárt (closed): semmi sem figyel, vagy egy tűzfal aktívan elutasítja a kapcsolatot. A szerver azonnal „nem” választ küld vissza (TCP esetén egy RST-csomagot). A kapcsolat azonnal meghiúsul a „Connection refused” üzenettel (a kapcsolatot elutasították).
  • Szűrt (filtered): egy tűzfal csendben eldobja a csomagot. A kapcsolat egy időtúllépésig (time-out) függőben marad.

Az adatbázis szempontjából a zárt és a szűrt állapot egyaránt jó: senki sem fér hozzá. A különbség csak azt mutatja meg, miért: a szűrt állapot szinte mindig azt jelenti, hogy a tűzfala tartja vissza a forgalmat.

Kívülről nézve

A ss megmutatja, mi figyel a szerveren, de azt nem, hogy mi érhető el kívülről. Közöttük ugyanis ott van még egy tűzfal, a szolgáltatónál esetenként egy hálózati tűzfal is. Az egyetlen valódi ellenőrzés ezért ez: nézze meg kívülről, egy másik számítógépről.

A saját számítógépéről (nem magáról a szerverről, mert akkor a loopbacken keresztül menne) ezt egy portra a nc (netcat) segítségével teheti meg:

anna@laptop:~$ nc -vz -w 3 192.0.2.10 6379
nc: connect to 192.0.2.10 port 6379 (tcp) failed: Connection refused
anna@laptop:~$ nc -vz -w 3 192.0.2.10 22
Connection to 192.0.2.10 22 port [tcp/ssh] succeeded!

Windows alatt a PowerShell ugyanezt a Test-NetConnection 192.0.2.10 -Port 6379 paranccsal végzi el. Egy portszkenner, például az nmap, egyszerre több portot is meg tud vizsgálni; ilyen szkennert csak a saját szerverén használjon.

Ne feledkezzen meg az IPv6-ról. Gyakori hiba, hogy a tűzfalban csak IPv4-szabályok vannak, miközben a szolgáltatás a [::] címen is figyel. Ezért az IPv6-címet is tesztelje: nc -6 -vz -w 3 2001:db8::10 6379.

Miért olyan fontos ez?

A szerverét az első perctől kezdve szkennelik. Az internetre kötött eszközöket és szolgáltatásokat kereső keresőmotorok, valamint a bűnözők botjai folyamatosan végigpróbálják az összes IPv4-címet az ismert portokon. Egy jelszó nélküli, nyitott Redis, egy Elasticsearch-fürt vagy egy hozzáférés-szabályozás nélküli MongoDB rövid időn belül megtalálható. A nyitott adatbázisok és nyitott keresőfürtök miatti adatvédelmi incidensek rendszeresen bekerülnek a hírekbe, és szinte mindig pontosan erről a hibáról van szó: egy belső használatra szánt szolgáltatás az összes címen figyelt.

Az SSH portján is egész nap kopogtatnak. Ez normális, és kulcsokkal (2.2. lecke) és a fail2ban segítségével (5.3. lecke) nem jelent problémát.

A tanfolyami ellenőrzés

Az ehhez a leckéhez tartozó feladatban a tanfolyami program kívülről öt rögzített adatbázisportot ellenőriz a szerverén: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) és 27017 (MongoDB). A program csak azt próbálja meg, hogy létrejön-e kapcsolat, nem küld adatot, és sehova nem jelentkezik be. Más portokat nem szkennel. Az ellenőrzések a feladatban megadott IP-címről érkeznek, így Ön felismerheti őket a saját naplójában. Egy címet óránként csak néhány alkalommal lehet ellenőrizni.

AlmaLinux és Rocky Linux alatt

A ss ugyanúgy működik. A szolgáltatások fájljai máshol találhatók (például /etc/my.cnf.d/ a MariaDB-hez, /var/lib/pgsql/data/postgresql.conf a PostgreSQL-hez). Emellett a SELinux megakadályozhatja, hogy egy szolgáltatás szokatlan porton figyeljen; ezt ilyenkor a journalctl kimenetében látja (6.2. lecke), és nem a ss kimenetében.

Összefoglalás

  • Minden figyelő port egy ajtó; kívülről csak azt hagyja nyitva, amire valóban szükség van (általában a 22-es, a 80-as és a 443-as portot).
  • A sudo ss -tulpn megmutatja, melyik program melyik címen és melyik porton figyel.
  • A 0.0.0.0 és a [::] jelentése „minden cím”, a 127.0.0.1 és a [::1] jelentése „csak maga a szerver”. Az adatbázisok, gyorsítótárak és keresőfürtök helye a loopback.
  • Egy adatbázisnál a zárt és a szűrt állapot egyaránt jó; a nyitott állapot hiba.
  • Mindig kívülről ellenőrizzen, IPv4-en és IPv6-on is, mert a ss nem látja a tűzfalat.

Kvíz

1. A ss -tulpn kimenetében a mariadbd mellett 127.0.0.1:3306 szerepel. Mit jelent ez?



2. A Redis a 0.0.0.0:6379 címen figyel. A tűzfala nem engedi át a 6379-es portot. Mi a legjobb megoldás?



3. Kívülről teszteli az 5432-es portot, és a kapcsolat 3 másodpercig függőben marad, majd meghiúsul. Mi a valószínű állapot?



4. Miért kell egy nyitott portot kívülről ellenőrizni, és nem csak a ss paranccsal a szerveren?



5. A tűzfalában vannak IPv4-szabályok, de a szerverének IPv6-címe is van. A Redis a [::]:6379 címen figyel. Mi a kockázat?



Feladat

Z5.1. feladat: Az adatbázisportok kívülről zárva. Futtassa a sudo ss -tulpn parancsot a szerverén, és derítse ki, milyen címeken figyelnek a szolgáltatásai. Ezután ellenőriztesse a tanfolyami programmal kívülről, hogy a szervere 3306-os, 5432-es, 6379-es, 9200-as és 27017-es portja nem érhető el, IPv4-en és (ha a szerverének van AAAA rekordja) IPv6-on is. Adja meg azt is, mely szolgáltatásai figyelnek a 0.0.0.0 vagy a [::] címen. A program csak kapcsolatot létesít erre az öt portra, és nem küld semmit.

Z5.1. feladat: Az adatbázisportok kívülről zárva

Nem jelentkezünk be, és nem próbálunk ki jelszót vagy kulcsot. Először igazolja, hogy a szerver az Öné: kattintson a "Kódom megjelenítése" gombra, és helyezzen el egy /.well-known/weboke-cursus-<code>.txt fájlt, amely csak ezt a kódot tartalmazza, a hosztneve webszerverén. A fájlt közvetlenül minden ellenőrzött IP-címről lekérjük (IPv4 és IPv6 külön); TXT-rekord itt nem számít. Az ellenőrzés a heavy.webawere.nl címről érkezik (185.158.167.16 és 2a07:ae80:100:0:185:158:167:16), nem a mi webszerverünkről. Csak bejelentkezett résztvevőknek; szerverenként óránként legfeljebb 6 ellenőrzés. Csak TCP-kapcsolatot létesítünk a 3306, 5432, 6379, 9200, 27017 és 2375 portokra (IPv4 és IPv6), és semmit sem küldünk.




Amit beír, és amit találunk, azt nem tároljuk. A böngészője megjegyzi a válaszait és azt, hogy teljesítette e a feladatot. Ha bejelentkezett, a Fiókomban csak azt tároljuk, hogy a feladat (majdnem) helyes volt; ott ezt is törölheti.

További olvasnivaló

Egy pillanat…

Domainek beállítása

Állítsa be domainenként a névszervereket, a tárhelyhez való kapcsolást és azt, hogy ki legyen a tulajdonos.

Domainek betöltése…