Pereiti prie turinio

Slapukų nustatymai

Pasirinkite, kokių rūšių slapukus leidžiate. Pasirinkimą bet kada galite pakeisti per „Slapukų nustatymai“ kiekvieno puslapio apačioje. Privatumo pareiškimas

Būtinieji

Visada įjungti

Reikalingi prisijungti, išsaugoti krepšelį ir įsiminti Jūsų pasirinkimus. Jie visada įjungti.

Kokie slapukai?
  • weboke_sessie, weboke_klant, weboke_remember: Jūsų sesija ir prisijungimo išlaikymas
  • weboke_basket: Jūsų krepšelis
  • wkBtwIncl: kainų rodymas su PVM arba be PVM
  • wok_cookies: Jūsų slapukų pasirinkimas, 12 mėnesių

Matuoja, kuri reklama atveda prie apsilankymo ar užsakymo, kad nemokėtume už neveiksmingas reklamas.

Kokie slapukai?
  • Google Ads per Google Tag Manager (_gcl_au, _gcl_aw), iki 90 dienų
  • OpenAI Ads, reklamos ChatGPT
  • wok_aff: per kurį partnerį atėjote pas mus (partnerių programa), 60 dienų

4,6

Šalis ir kalba

Kiekviena šalis turi savo svetainę su tos šalies kainomis ir PVM.

Peržiūrėti

Prievadai ir klausančios paslaugos

5 modulis: Tinklo apsauga · Skaitymo laikas: 10 min.

Mokymosi tikslas: po šios pamokos galėsite matyti, kurios paslaugos klauso Jūsų serveryje ir kokiu adresu, paaiškinti skirtumą tarp 0.0.0.0 ir 127.0.0.1 bei iš išorės patikrinti, ką apie Jūsų serverį mato visi internete.

Pagrindinės sąvokos: prievadas, TCP ir UDP, klausymas, ss -tulpn, 0.0.0.0 ir [::], 127.0.0.1 ir [::1], bind-address, atviras, uždarytas ir filtruojamas, atakos paviršius, skeneriai

Vienas IP adresas su 65.535 durimis

Jūsų serveris turi IP adresą, pavyzdžiui, 192.0.2.10 ir 2001:db8::10. Tuo adresu vienu metu gali būti pasiekiamos kelios programos, kiekviena per savo prievadą (angl. port): skaičių nuo 1 iki 65.535. Programa, kuri priima ryšius, klauso prievade. Keli žinomi prievadai:

PrievadasProtokolasPaslauga
22TCPSSH
80TCPhttp (žiniatinklio serveris)
443TCP ir UDPhttps (UDP skirtas HTTP/3)
25TCPpaštas tarp pašto serverių (SMTP)
3306TCPMySQL ir MariaDB
5432TCPPostgreSQL
6379TCPRedis

TCP yra protokolas ryšiams, kurių duomenys turi patikimai pasiekti tikslą (žiniatinklis, SSH, duomenų bazės). UDP skirtas greitiems pavieniams paketams (DNS, VPN, pavyzdžiui, WireGuard, HTTP/3). Paslauga klauso per TCP, UDP arba abu.

Kiekvienas klausantis prievadas yra durys į Jūsų serverį. Už kiekvienų durų yra programinė įranga, kurioje gali būti klaidų. Visos iš išorės pasiekiamos durys kartu vadinamos Jūsų atakos paviršiumi. Kuo jis mažesnis, tuo geriau: serveriui su svetaine iš išorės reikia tik 22, 80 ir 443.

Ką klauso serveris: ss

Komanda ss (socket statistics) parodo, kas klauso Jūsų serveryje. Su parinktimis -t (TCP), -u (UDP), -l (tik klausantys), -p (kuri programa) ir -n (skaičiai, o ne pavadinimai):

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

Svarbiausias stulpelis yra Local Address: adresas, kuriuo programa klauso.

AdresasReikšmė
0.0.0.0Visi serverio IPv4 adresai, taigi ir viešasis: pasiekiama iš išorės (nebent užkarda tai sustabdo)
[::]Visi IPv6 adresai: tas pats, tik IPv6
127.0.0.1 arba [::1]Tik pats serveris (loopback): iš išorės niekada nepasiekiama
127.0.0.53, 127.0.0.54Taip pat loopback; čia klauso vietinis systemd-resolved DNS pagalbininkas
192.0.2.10Tik tas vienas adresas

Aukščiau pateiktame pavyzdyje MariaDB sukonfigūruota tinkamai: ji klauso 127.0.0.1, todėl prie jos gali prisijungti tik programos pačiame serveryje (Jūsų svetainė). Tačiau Redis klauso 0.0.0.0:6379. Jei užkarda nustatyta netinkamai, prie jos gali prisijungti visas internetas. Būtent apie tokią klaidą ir yra ši pamoka.

Klausymas tinkamu adresu

Duomenų bazė, podėlis ar valdymo skydelis beveik niekada neturėtų būti pasiekiami iš išorės. Pirmoji ir geriausia apsauga yra tai, kad paslauga klauso tik loopback. Užkarda (pamoka 5.2) yra antrasis sluoksnis; ji gali būti netyčia išjungta arba negalioti (pavyzdžiui, naudojant Docker, pamoka 9.3).

Kur tai nustatoma, priklauso nuo programos:

ProgramaNustatymasFailas (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 ir protected-mode yes/etc/redis/redis.conf

Debian ir Ubuntu paketai šias paslaugas pagal numatytuosius nustatymus jau nukreipia į localhost. Dažniausiai problemos kyla, kai kas nors vadovaujasi instrukcija, kurioje sakoma "nustatykite bind-address į 0.0.0.0, kad galėtumėte jungtis iš išorės". Jei patys norite pasiekti duomenų bazę iš savo nešiojamojo kompiuterio, naudokite SSH tunelį (pamoka 2.3): prievadas lieka uždarytas, o prisijungti gali tik tas, kas jungiasi per SSH.

Atlikę pakeitimą, paleiskite paslaugą iš naujo ir dar kartą patikrinkite su ss -tulpn.

Atviras, uždarytas ir filtruojamas

Žiūrint iš išorės, prievadas gali būti vienos iš trijų būsenų:

  • Atviras (open): kažkas klauso ir ryšys užmezgamas.
  • Uždarytas (closed): niekas neklauso arba užkarda aktyviai atmeta. Serveris iškart atsako "ne" (TCP atveju RST paketu). Ryšys iškart nepavyksta su pranešimu "Connection refused".
  • Filtruojamas (filtered): užkarda tyliai išmeta paketą. Ryšys kabo, kol baigiasi laukimo laikas (time-out).

Duomenų bazei tinka ir uždarytas, ir filtruojamas: niekas prie jos neprisijungia. Skirtumas parodo tik kodėl: filtruojamas beveik visada reiškia, kad ryšį sustabdo Jūsų užkarda.

Patikrinimas iš išorės

ss parodo, kas klauso serveryje, bet ne tai, kas pasiekiama iš išorės. Tarp jų dar yra užkarda, o pas paslaugų teikėją kartais ir tinklo užkarda. Todėl vienintelis tikras patikrinimas yra žiūrėti iš išorės, iš kito kompiuterio.

Iš savo kompiuterio (ne iš paties serverio, nes tada ryšys eina per loopback) vieną prievadą galite patikrinti su 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!

Windows sistemoje tą patį atlieka PowerShell su Test-NetConnection 192.0.2.10 -Port 6379. Prievadų skeneris, pavyzdžiui, nmap, gali patikrinti daugiau prievadų vienu metu; tokį skenerį naudokite tik savo serveriui.

Nepamirškite IPv6. Dažna klaida yra užkarda, turinti taisykles tik IPv4, nors paslauga klauso ir [::]. Todėl patikrinkite ir IPv6 adresą: nc -6 -vz -w 3 2001:db8::10 6379.

Kodėl tai taip svarbu

Jūsų serveris skenuojamas nuo pat pirmos minutės. Interneto įrenginių ir paslaugų paieškos sistemos bei nusikaltėlių robotai nuolat tikrina visus IPv4 adresus žinomuose prievaduose. Atvira Redis be slaptažodžio, Elasticsearch klasteris ar MongoDB be prieigos kontrolės randami labai greitai. Duomenų nutekėjimai dėl atvirų duomenų bazių ir atvirų paieškos klasterių reguliariai patenka į naujienas, ir beveik visada priežastis yra būtent ši klaida: vidiniam naudojimui skirta paslauga klausė visais adresais.

Į SSH prievadą taip pat beldžiamasi visą dieną. Tai įprasta ir su raktais (pamoka 2.2) bei fail2ban (pamoka 5.3) nėra problema.

Kurso patikrinimas

Šios pamokos užduotyje kurso programa iš išorės patikrina penkis nustatytus Jūsų serverio duomenų bazių prievadus: 3306 (MySQL/MariaDB), 5432 (PostgreSQL), 6379 (Redis), 9200 (Elasticsearch/OpenSearch) ir 27017 (MongoDB). Programa tik bando, ar užmezgamas ryšys, nesiunčia jokių duomenų ir niekur neprisijungia. Kitų prievadų ji neskenuoja. Patikrinimai atliekami iš užduotyje nurodyto IP adreso, todėl galėsite juos atpažinti savo žurnale. Vieną adresą galima patikrinti tik kelis kartus per valandą.

AlmaLinux ir Rocky Linux sistemose

ss veikia taip pat. Paslaugų failai yra kitose vietose (pavyzdžiui, /etc/my.cnf.d/ MariaDB, /var/lib/pgsql/data/postgresql.conf PostgreSQL). Be to, SELinux gali sustabdyti paslaugą, kuri nori klausyti neįprastame prievade; tai matysite journalctl (pamoka 6.2), o ne ss.

Santrauka

  • Kiekvienas klausantis prievadas yra durys; iš išorės palikite atvira tik tai, ko tikrai reikia (dažniausiai 22, 80 ir 443).
  • sudo ss -tulpn parodo, kuri programa kokiu adresu ir kuriame prievade klauso.
  • 0.0.0.0 ir [::] reiškia "visi adresai", 127.0.0.1 ir [::1] reiškia "tik pats serveris". Duomenų bazės, podėliai ir paieškos klasteriai turi klausyti loopback.
  • Duomenų bazei tinka ir uždarytas, ir filtruojamas; atviras yra klaida.
  • Visada tikrinkite iš išorės, ir IPv4, ir IPv6, nes ss nemato užkardos.

Testas (quiz)

1. ss -tulpn išvestyje prie mariadbd matote 127.0.0.1:3306. Ką tai reiškia?



2. Redis klauso 0.0.0.0:6379. Jūsų užkarda neleidžia 6379. Koks geriausias sprendimas?



3. Iš išorės tikrinate prievadą 5432, o ryšys 3 sekundes kabo ir tada nepavyksta. Kokia tikėtina būsena?



4. Kodėl atvirą prievadą reikia tikrinti iš išorės, o ne tik su ss serveryje?



5. Jūsų užkarda turi taisykles IPv4, bet serveris turi ir IPv6 adresą. Redis klauso [::]:6379. Kokia rizika?



Užduotis

Užduotis Z5.1: Duomenų bazių prievadai uždaryti iš išorės. Paleiskite sudo ss -tulpn savo serveryje ir išsiaiškinkite, kokiais adresais klauso Jūsų paslaugos. Tada leiskite kurso programai iš išorės patikrinti, kad Jūsų serverio prievadai 3306, 5432, 6379, 9200 ir 27017 nepasiekiami per IPv4 ir (jei Jūsų serveris turi AAAA įrašą) IPv6. Taip pat nurodykite, kurios Jūsų paslaugos klauso 0.0.0.0 arba [::]. Programa tik jungiasi prie tų penkių prievadų ir nieko nesiunčia.

Užduotis Z5.1: Duomenų bazių prievadai uždaryti iš išorės

Mes neprisijungiame ir nebandome jokio slaptažodžio ar rakto. Pirmiausia parodykite, kad serveris priklauso Jums: spustelėkite „Rodyti mano kodą“ ir įkelkite failą /.well-known/weboke-cursus-<code>.txt, kuriame yra tik tas kodas, į savo pagrindinio kompiuterio vardo (hostname) žiniatinklio serverį. Jį atsisiunčiame tiesiogiai iš kiekvieno tikrinamo IP adreso (IPv4 ir IPv6 atskirai); TXT įrašas čia netinka. Patikra vykdoma iš heavy.webawere.nl (185.158.167.16 ir 2a07:ae80:100:0:185:158:167:16), o ne iš mūsų žiniatinklio serverio. Tik prisijungusiems kursų dalyviams; vienam serveriui ne daugiau kaip 6 patikros per valandą. Tik užmezgame TCP ryšį su prievadais 3306, 5432, 6379, 9200, 27017 ir 2375 (IPv4 ir IPv6) ir nieko nesiunčiame.




Ko, ką įvedate ir ką randame, nesaugome. Jūsų naršyklė atsimena Jūsų atsakymus ir tai, ar užduotį atlikote. Jei esate prisijungę, skiltyje Mano kursai išsaugome tik tai, kad užduotis buvo atlikta (ar beveik atlikta); ten tai galite ir pašalinti.

Skaitykite daugiau

Akimirką…

Nustatykite domenus

Kiekvienam domenui nustatykite vardų serverius, susiejimą su talpinimu ir tai, kas taps valdytoju.

Įkeliami Jūsų domenai…