Куке које раде без грешке и ипак пријављују датотеку која недостаје обично гледају на погрешно место, а не подбацују у свом послу. Релативне путање у скрипти решавају се према радном директоријуму процеса, а услуга се покреће са радним директоријумом који нисте изабрали. Датотека поред скрипте и датотека коју процес отвара јесу исто само када их нешто усидри. Тај јаз објашњава велики део отказа кука који се погрешно читају као проблеми с дозволама.

Проверите путању пре дозвола, јер грешка дозволе на погрешној датотеци ипак је погрешна датотека.

Релативна путања решава се према процесу, а не према датотеци

Када скрипта позове open("policy.json"), језгро решава име према тренутном радном директоријуму процеса. Ништа из саме локације скрипте не учествује у том тражењу. OpenVPN покреће куке из директоријума који сам изабере, а опција cd може га променити, па се скрипта тестирана ручно из свог фасцикле понаша другачије кад је покрене демон. Ручни тест пролази, покретање услуге пада, а линија дневника помиње само име које недостаје.

Python излаже локацију скрипте као __file__, и то омогућава усидрење. Path(__file__).resolve().parent / "policy.json" гради путању из датотеке, а не из процеса. Тај један ред уклања зависност од радног директоријума без промене било чега у привилегијама.

Намерно усидрите путању, па проверите шта resolve ради

resolve() следи симболичке везе, па се инсталација која куку повеже на место усидрује на циљу везе, а не на директоријуму који држи везу. То је обично оно што желите за верзионисано постављање, а погрешно је за распоред који очекује податке поред симболичке везе. Одлучите шта постављање значи и напишите код у складу с тим, уместо да разлику откријете у продукцији. Path(__file__).parent без resolve() чува сопствени директоријум везе.

Ако подаци припадају инстанци, а не програму, узмите апсолутну путању из конфигурације. Тврдо кодирање локације везује куку за један распоред хоста.

Прођите четири границе редом

Почните од радног директоријума: упоредите WorkingDirectory, опцију cd OpenVPN-а и сваки омотач који мења директоријум пре exec. Затим потврдите решену локацију, јер датотека сличног имена у другом постављању може одговорити на тражење и сакрити грешку. Следи поглед на датотечни систем: chroot или mount именски простор услуге могу апсолутну путању хоста просто учинити одсутном. Последњи је идентитет приступа, што је питање одвојено од видљивости.

ProtectHome и PrivateTmp скривају различите локације и ниједно се не појављује у испису директоријума узетом с хоста. Путања која постоји за root у љусци може бити невидљива унутар именског простора јединице, и зато тестирање исте наредбе изван услуге доказује тако мало.

Исправите тражење без проширења услуге

Усидрење путање решава само прву границу. Оно не открива директоријум који услуга скрива и не даје непривилегованом налогу приступ датотеци само за root. Подизање script-security мења које ће скрипте OpenVPN покренути; на то где се релативно име решава нема утицаја. Мењање радног директоријума за целу услугу шире је од проблема, јер се свака друга релативна путања сертификата, дневника или помоћника помера с њом.

Преферирајте уску поправку: детерминистичка путања у скрипти, експлицитна конфигурациона вредност за податке инстанце и власништво датотека које одговара налогу под којим кука стварно ради.

Забележите доказе који именују границу

Користан извештај о отказу садржи три ствари: тачну путању коју је кука покушала, окружење које ју је створило и која граница је одбила. Одштампајте решену путању и изузетак без изливања садржаја датотеке. Та тројка одваја погрешно усидрење од скривеног mount-а и од одбијања дозволе, а то су три различите поправке.

Тврдња да root може прочитати датотеку с терминала одговара на једно од тих питања и ни на једно од осталих. Уместо тога тестирајте из сопственог контекста услуге.

Повезани чланци