Přejít na obsah

Nastavení cookies

Zvolte, které druhy cookies povolíte. Svou volbu můžete kdykoli změnit přes Nastavení cookies v dolní části každé stránky. Prohlášení o ochraně osobních údajů

Nezbytné

Vždy zapnuté

Potřebné pro přihlášení, uchování košíku a zapamatování vašich voleb. Jsou vždy zapnuté.

Které cookies?
  • weboke_sessie, weboke_klant, weboke_remember: vaše relace a trvalé přihlášení
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazení cen s DPH nebo bez DPH
  • wok_cookies: vaše volba cookies, 12 měsíců

Měří, která reklama vede k návštěvě nebo objednávce, abychom neplatili za reklamy, které nic nepřinášejí.

Které cookies?
  • Google Ads přes Google Tag Manager (_gcl_au, _gcl_aw), až 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: partner, který vás k nám doporučil (partnerský program), 60 dní

4,6

Země a jazyk

Každá země má vlastní web s cenami a DPH dané země.

Zobrazit

Porty a naslouchající služby

Modul 5: Zabezpečení sítě · Doba čtení: 10 min.

Cíl lekce: Po této lekci dokážete zjistit, které služby na Vašem serveru naslouchají a na jaké adrese, vysvětlit rozdíl mezi 0.0.0.0 a 127.0.0.1 a zvenčí ověřit, co z Vašeho serveru vidí kdokoli na internetu.

Klíčové pojmy: port, TCP a UDP, naslouchání, ss -tulpn, 0.0.0.0 a [::], 127.0.0.1 a [::1], bind-address, otevřený, zavřený a filtrovaný, útočná plocha, skenery

Jedna IP adresa s 65 535 dveřmi

Váš server má IP adresu, například 192.0.2.10 a 2001:db8::10. Na této adrese může být současně dostupných více programů, každý na vlastním portu: čísle od 1 do 65 535. Program, který přijímá spojení, na portu naslouchá. Několik známých portů:

PortProtokolSlužba
22TCPSSH
80TCPhttp (webový server)
443TCP a UDPhttps (UDP pro HTTP/3)
25TCPpošta mezi poštovními servery (SMTP)
3306TCPMySQL a MariaDB
5432TCPPostgreSQL
6379TCPRedis

TCP je protokol pro spojení, u kterých musí data spolehlivě dorazit (web, SSH, databáze). UDP slouží pro rychlé samostatné pakety (DNS, VPN jako WireGuard, HTTP/3). Služba naslouchá na TCP, na UDP nebo na obou.

Každý naslouchající port jsou dveře do Vašeho serveru. Za každými dveřmi je software, který může obsahovat chyby. Souhrn všech dveří dostupných zvenčí se nazývá Vaše útočná plocha. Čím menší, tím lépe: server s webem potřebuje zvenčí jen porty 22, 80 a 443.

Co naslouchá: ss

Příkaz ss (socket statistics) ukazuje, co na Vašem serveru naslouchá. S volbami -t (TCP), -u (UDP), -l (jen naslouchající), -p (který program) a -n (čísla, ne názvy):

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))

Nejdůležitější je sloupec Local Address: adresa, na které program naslouchá.

AdresaVýznam
0.0.0.0Všechny IPv4 adresy serveru, tedy i veřejná adresa: dostupné zvenčí (pokud to nezastaví firewall)
[::]Všechny IPv6 adresy: totéž pro IPv6
127.0.0.1 nebo [::1]Pouze samotný server (loopback): zvenčí nikdy nedostupné
127.0.0.53, 127.0.0.54Také loopback; zde naslouchá lokální pomocník DNS ze systemd-resolved
192.0.2.10Pouze tato jedna adresa

V příkladu výše je MariaDB v pořádku: naslouchá na 127.0.0.1, takže se k ní dostanou jen programy na samotném serveru (Váš web). Redis však naslouchá na 0.0.0.0:6379. Pokud firewall není správně nastavený, dostane se k němu celý internet. Přesně o tomto druhu chyby je tato lekce.

Naslouchání na správné adrese

Databáze, cache nebo administrační panel by téměř nikdy neměly být dostupné zvenčí. První a nejlepší obranou je, že služba naslouchá pouze na loopbacku. Firewall (lekce 5.2) je druhá vrstva; ten může být omylem vypnutý nebo se nemusí uplatnit (například u Dockeru, lekce 9.3).

Kde se to nastavuje, se liší podle programu:

ProgramNastaveníSoubor (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 a protected-mode yes/etc/redis/redis.conf

Balíčky Debianu a Ubuntu tyto služby ve výchozím stavu nastavují na localhost. Chyba většinou vznikne, když někdo postupuje podle návodu, který říká "nastavte bind-address na 0.0.0.0, abyste se mohli připojit zvenčí". Pokud se chcete k databázi připojit sami ze svého notebooku, použijte SSH tunel (lekce 2.3): port zůstane zavřený a dostane se k němu jen ten, kdo přijde přes SSH.

Po změně službu restartujte a znovu se podívejte pomocí ss -tulpn.

Otevřený, zavřený a filtrovaný

Při pohledu zvenčí může být port ve třech stavech:

  • Otevřený (open): něco naslouchá a spojení se podaří.
  • Zavřený (closed): nic nenaslouchá, nebo firewall aktivně odmítá. Server okamžitě pošle zpět "ne" (u TCP paket RST). Spojení hned selže s hlášením "Connection refused" (spojení odmítnuto).
  • Filtrovaný (filtered): firewall paket potichu zahodí. Spojení visí až do vypršení časového limitu (time-out).

Pro Vaši databázi jsou zavřený i filtrovaný stav v pořádku: nikdo se k ní nedostane. Rozdíl Vám říká jen proč: filtrovaný téměř vždy znamená, že to zastavuje Váš firewall.

Pohled zvenčí

ss ukazuje, co na serveru naslouchá, ale ne to, co je dostupné zvenčí. Mezi tím je ještě firewall a u Vašeho poskytovatele někdy i síťový firewall. Jedinou skutečnou kontrolou je proto: podívejte se zvenčí, z jiného počítače.

Z vlastního počítače (ne ze samotného serveru, protože tam byste šli přes loopback) to pro jeden port zvládnete pomocí nc (netcat):

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!

Ve Windows totéž udělá PowerShell pomocí Test-NetConnection 192.0.2.10 -Port 6379. Skener portů jako nmap dokáže prověřit více portů najednou; takový skener používejte pouze na vlastním serveru.

Nezapomeňte na IPv6. Častou chybou je firewall, který má pravidla jen pro IPv4, zatímco služba naslouchá i na [::]. Otestujte proto i IPv6 adresu: nc -6 -vz -w 3 2001:db8::10 6379.

Proč je to tak důležité

Váš server je skenován od první minuty. Vyhledávače zařízení a služeb na internetu i boti zločinců neustále zkoušejí všechny IPv4 adresy na známých portech. Otevřený Redis bez hesla, cluster Elasticsearch nebo MongoDB bez řízení přístupu se najde během krátké doby. Úniky dat kvůli otevřeným databázím a otevřeným vyhledávacím clusterům se pravidelně objevují ve zprávách a téměř vždy jde přesně o tuto chybu: služba určená pro interní použití naslouchala na všech adresách.

Také na port SSH někdo klepe celý den. To je normální a se SSH klíči (lekce 2.2) a fail2ban (lekce 5.3) to není problém.

Kontrola v kurzu

V úkolu k této lekci kurzovní program zvenčí zkontroluje pět pevně daných databázových portů Vašeho serveru: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) a 27017 (MongoDB). Program pouze zkouší, zda se naváže spojení, neposílá žádná data a nikam se nepřihlašuje. Jiné porty neskenuje. Kontroly přicházejí z IP adresy uvedené v úkolu, takže je můžete rozpoznat ve vlastním logu. Jednu adresu lze kontrolovat jen několikrát za hodinu.

Na AlmaLinux a Rocky Linux

ss funguje stejně. Soubory služeb jsou na jiných místech (například /etc/my.cnf.d/ pro MariaDB, /var/lib/pgsql/data/postgresql.conf pro PostgreSQL). Kromě toho může SELinux zablokovat službu, která chce naslouchat na neobvyklém portu; to pak uvidíte v journalctl (lekce 6.2), nikoli v ss.

Shrnutí

  • Každý naslouchající port jsou dveře; zvenčí nechte otevřené jen to, co je opravdu potřeba (většinou 22, 80 a 443).
  • sudo ss -tulpn ukazuje, který program naslouchá na jaké adrese a jakém portu.
  • 0.0.0.0 a [::] znamenají "všechny adresy", 127.0.0.1 a [::1] znamenají "pouze samotný server". Databáze, cache a vyhledávací clustery patří na loopback.
  • Zavřený i filtrovaný stav jsou pro databázi v pořádku; otevřený je chyba.
  • Vždy kontrolujte zvenčí, pro IPv4 i IPv6, protože ss firewall nevidí.

Kvíz

1. Ve výstupu ss -tulpn je u mariadbd uvedeno 127.0.0.1:3306. Co to znamená?



2. Redis naslouchá na 0.0.0.0:6379. Váš firewall port 6379 nepropouští. Jaký je nejlepší postup?



3. Zvenčí testujete port 5432 a spojení 3 sekundy visí a pak selže. Jaký je pravděpodobný stav?



4. Proč byste měli otevřený port kontrolovat zvenčí, a ne jen pomocí ss na serveru?



5. Váš firewall má pravidla pro IPv4, ale server má i IPv6 adresu. Redis naslouchá na [::]:6379. Jaké je riziko?



Úkol

Úkol Z5.1: Databázové porty uzavřené zvenčí. Spusťte na serveru sudo ss -tulpn a zjistěte, na jakých adresách Vaše služby naslouchají. Potom nechte kurzovní program zvenčí ověřit, že porty 3306, 5432, 6379, 9200 a 27017 Vašeho serveru nejsou dostupné, pro IPv4 a (pokud má Váš server záznam AAAA) pro IPv6. Vyplňte také, které služby u Vás naslouchají na 0.0.0.0 nebo [::]. Program se pouze připojí k těmto pěti portům a nic neposílá.

Úkol Z5.1: Databázové porty uzavřené zvenčí

Nepřihlašujeme se a nezkoušíme žádné heslo ani klíč. Nejprve prokážete, že server patří Vám: klikněte na "Zobrazit můj kód" a umístěte na webový server Vašeho názvu hostitele soubor /.well-known/weboke-cursus-<code>.txt, který obsahuje pouze tento kód. Stahujeme ho přímo z každé IP adresy, kterou kontrolujeme (IPv4 a IPv6 zvlášť); záznam TXT se zde nepočítá. Kontrola probíhá ze serveru heavy.webawere.nl (185.158.167.16 a 2a07:ae80:100:0:185:158:167:16), nikoli z našeho webového serveru. Pouze pro přihlášené účastníky kurzu; nejvýše 6 kontrol za hodinu na jeden server. Pouze navazujeme TCP spojení na porty 3306, 5432, 6379, 9200, 27017 a 2375 (IPv4 a IPv6) a nic neodesíláme.




Co vyplníte a co zjistíme, neukládáme. Váš prohlížeč si pamatuje Vaše odpovědi a to, zda jste úkol splnili. Pokud jste přihlášeni, ukládáme v sekci Moje kurzy pouze to, že jste úkol měli (téměř) správně; i to tam můžete odstranit.

Doporučujeme k přečtení

Chvíli strpení…

Nastavení vašich domén

U každé domény nastavte jmenné servery, propojení s hostingem a to, kdo bude držitelem.

Načítání vašich domén…