Għaliex hook ta’ OpenVPN ma jsibx il-fajl ħdejn l-iskript tiegħu
Mogħdijiet relattivi f’hook jiġu riżolti skont il-proċess, mhux skont l-iskript. Ankrahom b’__file__, imbagħad iċċekkja l-ispazju tal-ismijiet u l-identità qabel il-permessi.
Hooks li jaħdmu mingħajr żball u xorta jirrappurtaw fajl nieqes ġeneralment iħarsu lejn il-post ħażin, mhux li jonqsu f’xogħolhom. Mogħdijiet relattivi fi skript jiġu riżolti skont id-direttorju tax-xogħol tal-proċess, u servizz jibda b’direttorju tax-xogħol li int ma għażiltx. Il-fajl ħdejn l-iskript u l-fajl li jiftaħ il-proċess huma l-istess ħaġa biss meta xi ħaġa torbothom. Dan id-distakk jispjega parti kbira mill-fallimenti tal-hooks li jiġu moqrija ħażin bħala problemi ta’ permessi.
Iċċekkja l-mogħdija qabel il-permessi, għax żball ta’ permess fuq il-fajl ħażin xorta jibqa’ l-fajl ħażin.
Mogħdija relattiva tiġi riżolta skont il-proċess, mhux skont il-fajl
Meta skript isejjaħ open("policy.json"), il-kernel jirriżolvi l-isem skont id-direttorju tax-xogħol attwali tal-proċess. Xejn mill-post tal-iskript innifsu ma jipparteċipa f’dik it-tfittxija. OpenVPN jibda hooks minn direttorju li jagħżel hu stess, u l-għażla cd tista’ tibdlu, għalhekk skript ittestjat bl-idejn mill-folder tiegħu jġib ruħu b’mod differenti meta d-daemon imexxih. It-test bl-idejn jgħaddi, it-tħaddim tas-servizz ifalli, u l-linja tal-log issemmi biss l-isem nieqes.
Python jesponi l-post tal-iskript bħala __file__, u dan hu li jagħmel l-ankraġġ possibbli. Path(__file__).resolve().parent / "policy.json" jibni mogħdija mill-fajl minflok mill-proċess. Dik il-linja waħda tneħħi d-dipendenza fuq id-direttorju tax-xogħol mingħajr ma tibdel xejn fil-privileġġi.
Ankra l-mogħdija apposta, imbagħad iċċekkja x’jagħmel resolve
resolve() isegwi links simboliċi, għalhekk installazzjoni li tlinkja l-hook fil-post tiegħu tinkrah fuq il-mira tal-link, mhux fuq id-direttorju li jżomm il-link. Dan ġeneralment hu dak li trid għal skjerament b’verżjonijiet, u hu ħażin għal tqassim li jistenna data ħdejn il-link simboliku. Iddeċiedi liema tfisser l-iskjerament, u ikteb il-kodiċi skond dan minflok ma tiskopri d-differenza fil-produzzjoni. Path(__file__).parent mingħajr resolve() iżomm id-direttorju tal-link innifsu.
Jekk id-data tappartjeni għall-istanza u mhux għall-programm, ħu mogħdija assoluta mill-konfigurazzjoni. L-ikkodifikar iebes ta’ post jorbot il-hook ma’ tqassim wieħed tal-host.
Għaddi minn erba’ fruntieri fl-ordni
Ibda mid-direttorju tax-xogħol: qabbel WorkingDirectory, l-għażla cd ta’ OpenVPN u kwalunkwe tgeżwir li jbiddel id-direttorju qabel exec. Imbagħad ikkonferma l-post riżolt, għax fajl b’isem simili fi skjerament ieħor jista’ jwieġeb għat-tfittxija u jaħbi l-iżball. Wara tiġi l-veduta tas-sistema tal-fajls: chroot jew spazju tal-ismijiet tal-mount tas-servizz jistgħu jagħmlu mogħdija assoluta tal-host sempliċement nieqsa. Fl-aħħar l-identità tal-aċċess, li hija kwistjoni separata mill-viżibilità.
ProtectHome u PrivateTmp jaħbu postijiet differenti, u l-ebda wieħed ma jidher f’lista ta’ direttorju meħuda mill-host. Mogħdija li teżisti għal root f’qoxra tista’ tkun inviżibbli ġewwa l-ispazju tal-ismijiet tal-unità, u għalhekk l-ittestjar tal-istess kmand barra s-servizz jipprova daqshekk ftit.
Sewwi t-tfittxija mingħajr ma twessa’ s-servizz
L-ankraġġ tal-mogħdija jsolvi biss l-ewwel fruntiera. Ma jesponix direttorju li s-servizz jaħbi, u ma jagħtix aċċess lil kont mingħajr privileġġ għal fajl ta’ root biss. Iż-żieda ta’ script-security tbiddel liema skripts se jmexxi OpenVPN; m’għandhiex effett fuq fejn tiġi riżolta isem relattiv. Li tbiddel id-direttorju tax-xogħol għas-servizz kollu hu usa’ mill-problema, għax kull mogħdija relattiva oħra ta’ ċertifikat, log jew għajnuna tiċċaqlaq miegħu.
Ippreferi l-korrezzjoni dejqa: mogħdija deterministika fl-iskript, valur ta’ konfigurazzjoni espliċitu għad-data tal-istanza, u sjieda tal-fajls li taqbel mal-kont li l-hook tassew jaħdem taħtu.
Irrekordja provi li jsemmu l-fruntiera
Rapport utli ta’ falliment fih tliet affarijiet: il-mogħdija eżatta li pprova l-hook, l-ambjent li pproduċa, u liema fruntiera rrifjutat. Ipprintja l-mogħdija riżolta u l-eċċezzjoni mingħajr ma tferra’ l-kontenut tal-fajl. Dan it-tlieta jifred ankraġġ ħażin minn mount moħbi u minn rifjut ta’ permess, li huma tliet korrezzjonijiet differenti.
L-istqarrija li root jista’ jaqra l-fajl minn terminal twieġeb waħda minn dawk il-mistoqsijiet u l-ebda oħra. Ipprova minflok mill-kuntest tas-servizz innifsu.