Paleidus nc -uz prieš OpenVPN serverį, beveik nieko neišmatuojama, o OpenBSD vadovas tai sako savo įspėjimuose: UDP skenavimai tame režime praneša apie sėkmę, nesvarbu, ar kas nors klausosi. Išėjimo būsena atspindi vietinį siuntimą, o ne nuotolinę būseną, todėl ja pasitikintis prižiūrėtojas mirusį serverį laiko pažymėtą sveiku tol, kol procesų lentelė atrodo patikimai. Pakeitimas prasideda nusprendus, į kokį klausimą turi atsakyti patikra, nes procesas, klausytojas, autentifikavimas ir programos pasiekiamumas yra keturi skirtingi stebėjimai. Patikra, įvardijanti vieną iš jų, yra naudinga; patikra, suponuojanti visus keturis, yra našta.

Ką UDP patikra gali ir ko negali pastebėti

nc -uz išsiunčia datagramą ir baigia darbą, o grąžinama būsena aprašo vietinį siuntimą. Uždaras prievadas gali atsakyti ICMP port unreachable, bet dokumentuotas šio skenavimo režimo elgesys to nepaverčia klaida, o filtruojamas prievadas iš viso neatsako. Taigi tyla ir sėkmė kviečiančiajam reiškia tą patį.

Tai paverčia patikrą vietinio kamino, o ne serverio bandymu. Ji nenustato, kad priegloba pasiekiama, kad prievadas susietas, kad OpenVPN procesas veikia ar kad klientas galėtų autentifikuotis. TCP ryšio bandymas yra stipresnis, nes rankos paspaudimas duoda aiškų atsakymą, bet tik tada, kai diegimas iš tikrųjų klausosi TCP. Patikros perkėlimas į TCP tuo pačiu numeriu tikrina klausytoją, kurio gali nebūti, o prieš serverį, veikiantį tik su UDP, jis sužlugdys sveiką paslaugą.

Patikros priderinimas prie sukonfigūruoto transporto ateina prieš pasitikėjimą bet kuriuo iš dviejų rezultatų. UDP diegimui reikia kito signalo, o ne kito protokolo.

Trys kviečiantieji, trys skirtingi klausimai

Pasirengimas priklauso nuo to, kas klausia. Paslaugos tvarkyklė, kuri paleidžia iš naujo sudužusį procesą, turi žinoti, kad egzempliorius paleistas ir susiejo savo klausytoją. Apkrovos balansuotojas turi žinoti, kad dabar atvykstantis klientas būtų priimtas. Stebėjimo sistema turi žinoti, kad kelias iš tikro tinklo vis dar neša sesiją į leidžiamą išteklių.

Tai ne ta pati patikra, ir viena patikra negali sąžiningai aprėpti visų trijų. Pirmiausia pasirinkite kviečiantįjį, tada įrodymą.

Sukurkite patikrą iš dabartinio egzemplioriaus

OpenVPN įrašo paleidimo eilutę, kai egzempliorius baigia inicijavimą, ir ta eilutė yra naudingas įrodymas apie vietinį paleidimą. Skaitykite ją iš dabartinio paleidimo, o ne iš papildomo failo pabaigos, nes praėjusios savaitės sėkmė skaitoma lygiai taip pat, kaip prieš minutę buvusi sėkmė. Serveris taip pat gali baigti inicijavimą prieš tai, kai bet kuris klientas kada nors prisijungė, todėl eilutė nieko nesako apie autentifikavimą.

Paleidimo patikrai sujunkite proceso būseną su dabartiniu žurnalo įrodymu ir klausytoju, atitinkančiu sukonfigūruotą transportą. Patikra turi nepavykti, kai procesas veikia, bet nebaigė inicijavimo, o tai reiškia, kad žurnalo užklausa turi būti apribota šiuo paleidimu ir šiuo vienetu.

systemctl is-active openvpn@server
sudo journalctl -u openvpn@server -b --no-pager | grep "Initialization Sequence Completed"
ss -lunp | grep 1194

Trys išvestys, trys teiginiai: vienetas aktyvus, šis paleidimas sukūrė inicijavimo eilutę, ir kažkas laiko UDP prievadą. Nė vienas jų nesako, kad klientas gali prisijungti. Laikykite juos atskirai būsenos puslapyje, kad incidentas nesugriūtų į vieną žalią tašką.

Sulaužykite tai tyčia ir stebėkite patikrą

Patikra yra patikima tik tada, kai matėte ją nepavykstant. Sustabdykite serverį, paleiskite patikrą ir patvirtinkite laukiamą rezultatą. Tada paleiskite jį vėl ir patvirtinkite, kad patikra atsistato be jokių kitų pakeitimų.

sudo systemctl stop openvpn@server
nc -uz 203.0.113.10 1194; echo "exit=$?"
ss -lunp | grep 1194
sudo systemctl start openvpn@server
ss -lunp | grep 1194

Skaitykite bloką eilutė po eilutės. Netcat komanda spausdina exit=0 , nors niekas nėra susieta, ir tai yra visa problema vienoje eilutėje. Pirmoji ss nieko nespausdina, paleidimas iš naujo pavyksta, o antroji ss vėl parodo klausytoją. Jei jūsų patikra praeina prieš sustabdytą serverį, ji matuoja vietinį kaminą ir nieko daugiau.

Priešingas nepavykimas taip pat svarbus. Patikra, kuri nepavyksta prieš sveiką serverį, sukelia paleidimus iš naujo, kurių niekada nereikėjo, o paleidimo iš naujo ciklas yra pats savaime sutrikimas. Išbandykite abi kryptis prieš prijungdami patikrą prie ko nors, kas gali ja veikti.

Ką turėtų sakyti būsenos eilutė

Užrašykite, kokią ribą apima kiekviena patikra: procesas, klausytojas, autentifikavimas ar programa. Viena patikra retai apima daugiau nei vieną, o būsenos puslapis, kuris jas suspaudžia į “up”, paslepia skirtumą, kuris svarbus incidento metu. Tinklo keliui naudokite tikrą klientą su atskiru tapatumu, leiskite jam baigti rankos paspaudimą ir vieną nekenksmingą leidžiamą operaciją, tada atjunkite. Tai vienu žingsniu lavina valdymo kanalą, autentifikavimo politiką ir klausytoją.

Laikykite šį tapatumą atskirai nuo tikrų naudotojų ir suteikite jam minimalias teises, kurių reikia patikrai. Pasirengimo patikra su plačia prieiga yra naujas atakos paviršius, pridėtas dėl patogumo. Rotuokite jos kredencialus kaip bet kurią kitą paskyrą, nes patikra, kuri nustoja autentifikuotis, atrodo lygiai taip pat kaip serveris, kuris nustojo priimti klientus.

Įvardykite ribą įspėjimo tekste, kad pirmasis reaguojantysis žinotų, ar žiūrėti į vienetą, lizdą, sertifikatą ar maršrutą. Patikra, kuri negali pasakyti, ką įrodė, bus patikėta dėl neteisingos priežasties, ir būtent taip netcat patikra iš pradžių išliko.

Susiję straipsniai