Pse një grep OpenVPN nuk e gjen skedarin pranë skriptit të vet
Shtigjet relative në një grep zgjidhen kundrejt procesit, jo skriptit. Ankorojini me __file__, pastaj kontrolloni hapësirën e emrave dhe identitetin para lejeve.
Grepët që ekzekutohen pa gabim dhe prapë raportojnë një skedar që mungon zakonisht shikojnë në vendin e gabuar, jo se dështojnë në detyrën e tyre. Shtigjet relative në një skript zgjidhen kundrejt drejtorisë së punës të procesit, dhe një shërbim nis me një drejtori pune që ju nuk e keni zgjedhur. Skedari pranë skriptit dhe skedari që hap procesi janë e njëjta gjë vetëm kur diçka i ankoron. Ky hendek shpjegon një pjesë të madhe të dështimeve të grepëve që lexohen gabimisht si probleme leje.
Kontrolloni shtegun para lejeve, sepse një gabim leje mbi skedarin e gabuar është prapë skedari i gabuar.
Një shteg relativ zgjidhet kundrejt procesit, jo skedarit
Kur një skript thërret open("policy.json"), kerneli e zgjidh emrin kundrejt drejtorisë së punës aktuale të procesit. Asgjë nga vendndodhja e vetë skriptit nuk merr pjesë në atë kërkim. OpenVPN i nis grepët nga një drejtori që e zgjedh vetë, dhe opsioni cd mund ta ndryshojë atë, kështu që një skript i provuar me dorë nga dosja e vet sillet ndryshe kur daemoni e ekzekuton. Prova manuale kalon, ekzekutimi i shërbimit dështon, dhe rreshti i regjistrit përmend vetëm emrin që mungon.
Python e ekspozon vendndodhjen e skriptit si __file__, dhe pikërisht kjo e bën të mundur ankorimin. Path(__file__).resolve().parent / "policy.json" ndërton një shteg nga skedari dhe jo nga procesi. Ai rresht i vetëm heq varësinë nga drejtoria e punës pa ndryshuar asgjë në privilegje.
Ankorojeni shtegun me qëllim, pastaj kontrolloni çfarë bën resolve
resolve() ndjek lidhjet simbolike, prandaj një instalim që e lidh grepën në vend e ankoron në objektivin e lidhjes, jo në drejtorinë që mban lidhjen. Zakonisht kjo është ajo që dëshironi për një vendosje me versione, dhe është e gabuar për një plan që pret të dhëna pranë lidhjes simbolike. Vendosni çfarë do të thotë vendosja, dhe shkruani kodin në përputhje, në vend që ta zbuloni ndryshimin në prodhim. Path(__file__).parent pa resolve() ruan drejtorinë e vetë lidhjes.
Nëse të dhënat i përkasin instancës dhe jo programit, merrni një shteg absolut nga konfigurimi. Kodimi i ngurtë i një vendndodhjeje e lidh grepën me një plan të vetëm hosti.
Kaloni katër kufij me radhë
Filloni me drejtorinë e punës: krahasoni WorkingDirectory, opsionin cd e OpenVPN dhe çdo mbështjellës që ndryshon drejtori përpara exec. Pastaj konfirmoni vendndodhjen e zgjidhur, sepse një skedar me emër të ngjashëm në një vendosje tjetër mund t'i përgjigjet kërkimit dhe ta fshehë gabimin. Më pas vjen pamja e sistemit të skedarëve: një chroot ose një hapësirë emrash mount e shërbimit mund ta bëjnë një shteg absolut hosti thjesht të pamundur. Së fundi identiteti i aksesit, që është një pyetje e ndarë nga dukshmëria.
ProtectHome dhe PrivateTmp fshehin vendndodhje të ndryshme, dhe asnjëra nuk shfaqet në një listim drejtorie të marrë nga hosti. Një shteg që ekziston për root në një shell mund të jetë i padukshëm brenda hapësirës së emrave të njësisë, dhe për këtë arsye provimi i të njëjtit komandë jashtë shërbimit dëshmon kaq pak.
Rregulloni kërkimin pa e zgjeruar shërbimin
Ankorimi i shtegut zgjidh vetëm kufirin e parë. Nuk zbulon një drejtori që shërbimi e fsheh, dhe nuk i jep një llogarie pa privilegje akses në një skedar vetëm për root. Ngritja e script-security ndryshon cilat skripte do të ekzekutojë OpenVPN; nuk ka asnjë efekt mbi vendin ku zgjidhet një emër relativ. Ndryshimi i drejtorisë së punës për të gjithë shërbimin është më i gjerë se problemi, sepse çdo shteg tjetër relativ certifikate, regjistri ose ndihmësi lëviz bashkë me të.
Preferoni rregullimin e ngushtë: një shteg përcaktues në skript, një vlerë konfigurimi të qartë për të dhënat e instancës, dhe pronësi skedarësh që përputhet me llogarinë nën të cilën grepa ekzekutohet vërtet.
Regjistroni prova që emërtojnë kufirin
Një raport i dobishëm dështimi përmban tri gjëra: shtegun e saktë që grepa provoi, mjedisin që e prodhoi, dhe cili kufi refuzoi. Printoni shtegun e zgjidhur dhe përjashtimin pa derdhur përmbajtjen e skedarit. Ai tresh e ndan ankorimin e gabuar nga një mount i fshehur dhe nga një refuzim lejeje, që janë tri rregullime të ndryshme.
Pohimi se root mund ta lexojë skedarin nga një terminal përgjigjet njërën nga ato pyetje dhe asnjërën nga të tjerat. Provoni në vend të kësaj nga konteksti i vetë shërbimit.