Ngjarjet e grepave të OpenVPN: pse emri dhe vulosja kohore nuk janë çelës
Një grep shkëputjeje raporton kohën e lidhjes, jo kohën e shkëputjes. Së bashku me emrin e përdoruesit mund të mbyllë sesionin e gabuar; zotëroni një identitet në vend të kësaj.
Një regjistrim shkëputjeje arrin pasi një lidhje e dytë me të njëjtin emër ka filluar tashmë, dhe një trajtues që përditëson rreshtin më të ri për atë përdorues mbyll sesionin e gabuar. Gabimi nuk është krahasimi i vulosjeve kohore. Është supozimi se një emër plus një sekondë e plotë identifikojnë një sesion. Ngjarjet e grepave përshkruajnë lidhje, dhe një lidhje ka nevojë për një çelës që i përket vetëm asaj.
Filloni me atë që nënkuptojnë vërtet variablat e shkëputjes. Vetëm atëherë zgjedhja e identifikuesit ka kuptim.
Çfarë mbart vërtet grepi i shkëputjes
Në Community OpenVPN 2.6, referenca e grepave time_unix e përcakton si momentin kur klienti u lidh; ai vendoset përpara se të ekzekutohet grepi i lidhjes dhe nuk ripërcaktohet kur grepi i shkëputjes aktivizohet më vonë. time_duration jep gjatësinë e atij sesioni në sekonda, kështu që fundi është përafërsisht koha e lidhjes plus kohëzgjatja. Të dyja janë sekonda të plota, dhe asnjëra nuk është momenti kur baza juaj e të dhënave e përpunoi ngjarjen. Pikërisht ndarja e këtyre tre kohërave bën që një korrelacion të qëndrojë, në vend që thjesht të duket i saktë gjatë testimit.
Kjo aritmetikë meriton të shkruhet, sepse është e vetmja kohë fundi që ofron vetë grepi. Vonesa e përpunimit dhe ndryshimet e orës midis hosteve mbeten ende jashtë saj.
Pse çifti i dukshëm nuk është unik
Çiftimi i emrit me kohën e lidhjes e ngushton kërkimin dhe ende nuk identifikon një sesion. Një klient mund të rilidhet brenda të njëjtës sekondë, kështu që dy sesione mund t'i ndajnë të dyja vlerat. Dy instanca të daemonit, ose një zëvendësim serveri që mban të njëjtin konfigurim, mund ta prodhojnë atë çift nga procese të ndryshme. Adresat e tunelit riciklohen për të njëjtën arsye, gjë që i bën ato atribute të një sesioni, jo identifikues të tij.
Mënyra e dështimit është e qetë. Një shkëputje e vonuar për sesionin e parë përputhet me rreshtin më të ri dhe përfundon një alokim që sesioni i dytë ende po përdor, kështu që përdoruesi përjeton një humbje aksesi të rastësishme që nuk e shkaktoi. Një numërim rreshtash që më pas duket i saktë e bën problemin më të vështirë për t'u vënë re.
Nga vjen një identitet i qëndrueshëm
Ndërfaqja e menaxhimit i cakton çdo klienti një identifikues instance klienti, dhe ai identifikues është i kufizuar në instancën e daemonit që e lëshoi. Një çelës i jashtëm i përdorshëm kombinon një identifikues të qëndrueshëm serveri, një epokë që ndryshon kur daemoni niset, dhe atë ID klienti. Epoka ka rëndësi sepse identifikuesit rinisin me procesin, dhe një ID procesi i zhveshur mund të ripërdoret më vonë nga diçka e palidhur.
Variablat e mjedisit të vendosura brenda një skripti lidhjeje fëmijë nuk udhëtojnë drejt skriptit të mëvonshëm të shkëputjes së daemonit prind, sepse ato skripte ekzekutohen si procese të veçanta me mjediset e tyre. Prandaj gjenerimi i një UUID në kohën e lidhjes është gjysmë zgjidhje. Ana e shkëputjes duhet të jetë në gjendje të emërtojë të njëjtin UUID, që do të thotë se identiteti duhet të jetojë diku ku mund të arrijnë të dyja ngjarjet.
Bëjeni tërheqjen të kushtëzuar dhe idempotente
Tërhiqni sipas pronarit të sesionit, jo sipas përdoruesit. Një trajtues që fshin çdo alokim që aktualisht i përket një emri do të fshijë përfundimisht të gabuarin, dhe mbrojtja e vetme është të kontrolloni që regjistrimi që hiqet është regjistrimi që përshkruan kjo ngjarje.
Ndërfaqja e menaxhimit pranon një klient menaxhimi të lidhur në një kohë, prandaj integrohuni me atë që e zotëron tashmë atë, në vend që të lidhni një vëzhgues të dytë që konkurron për të njëjtin socket.
Trajtoni ngjarjet e përsëritura pa e ndryshuar rezultatin dy herë, dhe mbajini ngjarjet e papërputhura për pajtim në vend që t'i hidhni. Një callback shkëputjeje ka kushte të dokumentuara të ciklit të jetës dhe mund të mos vijë kurrë pas një rrëzimi ose një ndalimi të fortë, prandaj dizajni ka nevojë për një mënyrë për të paraqitur një sesion, ngjarja përfundimtare e të cilit mungon.
Testoni qëllimisht rastet e vështira: dy rilidhje brenda një sekonde, dy instanca të daemonit, një lidhje përpunimi i së cilës dështoi, dhe një rinisje e daemonit në mes të një sesioni. Një çelës që i mbijeton të katërve është një çelës që ia vlen t'i besohet.