Azok a hookok, amelyek hiba nélkül futnak, és mégis hiányzó fájlt jelentenek, általában rossz helyen keresnek, nem a feladatukban vallanak kudarcot. A szkriptben lévő relatív útvonalak a folyamat munkakönyvtárához képest oldódnak fel, a szolgáltatás pedig olyan munkakönyvtárral indul, amelyet nem ön választott. A szkript melletti fájl és a folyamat által megnyitott fájl csak akkor ugyanaz, ha valami rögzíti őket. Ez a rés magyarázza a hookhibák nagy részét, amelyeket tévesen engedélyproblémaként olvasnak.

Az engedélyek előtt ellenőrizze az útvonalat, mert a rossz fájlon jelentkező engedélyhiba még mindig a rossz fájl.

A relatív útvonal a folyamathoz képest oldódik fel, nem a fájlhoz képest

Amikor egy szkript meghívja a következőt: open("policy.json"), a kernel a nevet a folyamat aktuális munkakönyvtárához képest oldja fel. A szkript saját helye semmilyen módon nem vesz részt ebben a keresésben. OpenVPN a hookokat egy általa választott könyvtárból indítja, és a cd opció ezt megváltoztathatja, ezért a saját mappájából kézzel tesztelt szkript másként viselkedik, amikor a démon futtatja. A kézi teszt átmegy, a szolgáltatás futása elbukik, és a naplósor csak a hiányzó nevet említi.

A Python a szkript helyét __file__ néven teszi elérhetővé, és ez teszi lehetővé a rögzítést. Path(__file__).resolve().parent / "policy.json" a folyamat helyett a fájlból épít útvonalat. Ez az egyetlen sor megszünteti a munkakönyvtártól való függést anélkül, hogy bármit változtatna a jogosultságokon.

Rögzítse szándékosan az útvonalat, majd ellenőrizze, mit tesz a resolve

resolve() követi a szimbolikus hivatkozásokat, ezért az a telepítés, amely a hookot a helyére linkeli, a hivatkozás céljánál rögzül, nem a hivatkozást tartalmazó könyvtárnál. Verziózott telepítésnél általában ez a kívánt viselkedés, és helytelen olyan elrendezésnél, amely a szimbolikus hivatkozás mellett vár adatokat. Döntse el, melyiket jelenti a telepítés, és annak megfelelően írja meg a kódot, ahelyett hogy az éles környezetben fedezné fel a különbséget. Path(__file__).parent nélkül resolve() megtartja a hivatkozás saját könyvtárát.

Ha az adatok a példányhoz és nem a programhoz tartoznak, vegyen abszolút útvonalat a konfigurációból. Egy hely kemény kódolása a hookot egyetlen hosztelrendezéshez köti.

Haladjon végig négy határon sorrendben

Kezdje a munkakönyvtárral: hasonlítsa össze az egység WorkingDirectory, az OpenVPN cd opcióját és minden olyan burkolót, amely az exec előtt könyvtárat vált. Ezután erősítse meg a feloldott helyet, mert egy hasonló nevű fájl egy másik telepítésben válaszolhat a keresésre, és elrejtheti a hibát. Ezután következik a fájlrendszer nézete: egy chroot vagy a szolgáltatás mount-névtere egyszerűen hiányzóvá tehet egy abszolút hosztútvonalat. Végül a hozzáférési identitás, amely a láthatóságtól elkülönülő kérdés.

ProtectHome és PrivateTmp különböző helyeket rejt el, és egyik sem jelenik meg a hosztról készített könyvtárlistában. Egy útvonal, amely a shellben létezik a root számára, láthatatlan lehet az egység névterében, és ezért a szolgáltatáson kívül végzett parancspróba olyan keveset bizonyít.

Javítsa a keresést a szolgáltatás kiszélesítése nélkül

Az útvonal rögzítése csak az első határt oldja meg. Nem tár fel olyan könyvtárat, amelyet a szolgáltatás elrejt, és nem ad hozzáférést egy csak root számára elérhető fájlhoz egy jogosulatlan fióknak. A script-security növelése megváltoztatja, hogy az OpenVPN mely szkripteket futtatja; nincs hatással arra, hol oldódik fel egy relatív név. A munkakönyvtár módosítása az egész szolgáltatásra nézve szélesebb a problémánál, mert minden más relatív tanúsítvány-, napló- vagy segédútvonal vele mozdul.

A szűk javítást részesítse előnyben: determinisztikus útvonal a szkriptben, explicit konfigurációs érték a példány adataihoz, és a fájltulajdon, amely megfelel annak a fióknak, amely alatt a hook valóban fut.

Rögzítsen bizonyítékot, amely megnevezi a határt

Egy hasznos hibajelentés három dolgot tartalmaz: a hook által megkísérelt pontos útvonalat, az azt előállító környezetet, és hogy melyik határ tagadta meg. Írja ki a feloldott útvonalat és a kivételt anélkül, hogy kiöntené a fájl tartalmát. Ez a hármas elválasztja a rossz rögzítést egy rejtett mounttól és egy engedélymegtagadástól, amelyek három különböző javítás.

Az az állítás, hogy a root a terminálból olvashatja a fájlt, az egyik kérdésre válaszol, a többire egyikre sem. Teszteljen inkább a szolgáltatás saját környezetéből.

Kapcsolódó cikkek