Zergatik OpenVPN kako batek ez duen aurkitzen bere scriptaren ondoko fitxategia
Kako bateko bide erlatiboak prozesuaren arabera ebazten dira, ez scriptaren arabera. Ainguratu itzazu __file__ erabiliz, eta gero egiaztatu izen-espazioa eta identitatea baimenen aurretik.
Errorerik gabe exekutatu eta hala ere fitxategi bat falta dela jakinarazten duten kakoek leku okerrean bilatzen dute normalean, ez dute beren zereginean huts egiten. Script bateko bide erlatiboak prozesuaren lan-direktorioaren arabera ebazten dira, eta zerbitzu bat zuk aukeratu ez duzun lan-direktorio batekin hasten da. Scriptaren ondoko fitxategia eta prozesuak irekitzen duen fitxategia gauza bera dira soilik zerbait ainguratzen dituenean. Arrakala horrek baimen-arazo gisa gaizki irakurtzen diren kako-hutsegiteen zati handi bat azaltzen du.
Egiaztatu bidea baimenen aurretik, fitxategi okerreko baimen-errore bat oraindik fitxategi okerra delako.
Bide erlatibo bat prozesuaren arabera ebazten da, ez fitxategiaren arabera
Script batek open("policy.json") deitzen duenean, kernelak izena prozesuaren uneko lan-direktorioaren arabera ebazten du. Scriptaren beraren kokapenak ez du bilaketa horretan parte hartzen. OpenVPN kakoak berak aukeratzen duen direktorio batetik abiarazten ditu, eta cd aukerak hura alda dezake, beraz bere karpetatik eskuz probatutako script batek beste modu batean jokatzen du daemonak exekutatzen duenean. Eskuzko probak gainditzen du, zerbitzuaren exekuzioak huts egiten du, eta erregistro-lerroak falta den izena baino ez du aipatzen.
Pythonek scriptaren kokapena __file__ gisa agertzen du, eta horrek egiten du ainguraketa posible. Path(__file__).resolve().parent / "policy.json" fitxategitik eraikitzen du bide bat, ez prozesutik. Lerro bakar horrek lan-direktorioarekiko menpekotasuna kentzen du pribilegioetan ezer aldatu gabe.
Ainguratu bidea nahita, eta gero egiaztatu zer egiten duen resolve-k
resolve() esteka sinbolikoak jarraitzen ditu, beraz kakua bere lekuan lotzen duen instalazio bat estekaren helburuan ainguratzen da, esteka duen direktorioan ez. Hori da normalean bertsiodun hedapen baterako nahi duzuna, eta okerra da esteka sinbolikoaren ondoan datuak espero dituen diseinu baterako. Erabaki zer esan nahi duen hedapenak, eta idatzi kodea bat etor dadin, produkzioan aldea aurkitu beharrean. Path(__file__).parent gabe resolve() estekaren bere direktorioa mantentzen du.
Datuak programarenak ez badira, instantziarenak badira, hartu bide absolutua konfiguraziotik. Kokapen bat gogor kodetzeak kakua ostalari-diseinu bakar bati lotzen dio.
Iragan itzazu lau muga hurrenez hurren
Hasi lan-direktorioarekin: alderatu unitatearen WorkingDirectory, OpenVPNren cd aukera eta exec aurretik direktorioa aldatzen duen bilgarri oro. Egiaztatu gero ebatzitako kokapena, beste hedapen bateko izen bereko fitxategi batek bilaketari erantzun eta errorea ezkuta baitezake. Ondoren fitxategi-sistemaren ikuspegia dator: chroot batek edo zerbitzuaren mount izen-espazio batek ostalari-bide absolutua huts-hutsik ezabatu dezakete. Azkena sarbide-identitatea da, ikusgaitasunarekiko galdera bereizia.
ProtectHome eta PrivateTmp kokapen desberdinak ezkutatzen dituzte, eta bat ere ez da ostalaritik hartutako direktorio-zerrenda batean agertzen. Shell batean rootentzat existitzen den bide bat unitatearen izen-espazioaren barruan ikusezina izan daiteke, eta horregatik hain gutxi frogatzen du zerbitzutik kanpo komando bera probatzeak.
Konpondu bilaketa zerbitzua zabaldu gabe
Bidea ainguratzeak lehen muga soilik konpontzen du. Ez du zerbitzuak ezkutatzen duen direktorio bat agerian uzten, eta ez die pribilegiorik gabeko kontuei rootentzako soilik den fitxategirako sarbidea ematen. Igotzeak script-security zein script exekutatuko dituen OpenVPNek aldatzen du; ez du inolako eraginik izen erlatibo bat non ebazten den. Zerbitzu osoaren lan-direktorioa aldatzea arazoa baino zabalagoa da, gainerako ziurtagiri-, erregistro- edo laguntza-bide erlatibo bakoitza harexekin mugitzen delako.
Hobetsi konponketa estua: bide determinista scriptan, konfigurazio-balio esplizitua instantziaren datuetarako, eta kakua benetan exekutatzen den kontuari dagokion fitxategi-jabetza.
Erregistratu muga izendatzen duten frogak
Hutsegite-txosten erabilgarri batek hiru gauza ditu: kakoak saiatu zuen bide zehatza, hura sortu zuen ingurunea, eta zein mugak uko egin zion. Inprimatu ebatzitako bidea eta salbuespena fitxategiaren edukia isuri gabe. Hirukote horrek aingura okerra mount ezkutu batetik eta baimen-ukazio batetik bereizten ditu, eta horiek hiru konponketa desberdin dira.
Rootek fitxategia terminal batetik irakur dezakeelako baieztapenak galdera horietako bati erantzuten dio eta beste bat ere ez. Probatu horren ordez zerbitzuaren beraren testuingurutik.