Hooky hlásí úspěch, a stejná cesta přesto z shellu vypadá prázdná. Obě tvrzení mohou platit současně, protože služba systemd může žít ve vlastním mount jmenném prostoru se soukromým dočasným adresářem. Jakmile to pochopíte, zajímavou otázkou se stane, zda zápis vůbec uspěl.

Dva dočasné adresáře, jedna cesta

Nastavení izolace dává unitu soukromý pohled na dočasné adresáře, místo aby je udělalo jen pro čtení. Procesy mimo unit nevidí, co tam zapisuje, a vše, co po sobě zanechá, se zahodí, když se unit zastaví. Cesta vypsaná hookem a cesta ověřená z shellu proto mohou označovat různé objekty se stejným názvem.

To je problém viditelnosti a vypadá jako problém ztráty dat. Nic se nesmazalo, protože soubor je prostě ve jmenném prostoru, jehož členem shell není. Stejný příkaz se chová jinak, když se spustí uvnitř unitu, a to je pozorování, které obvykle spor vyřeší. Přečtěte si nastavení unitu, než o zápisu cokoli uzavřete.

Oddělte neviditelné od nezapisovatelného

Úspěšný zápis a neúspěšné otevření dávají různé důkazy a tento rozdíl určuje opravu. Pokud hook tvrdí, že soubor vznikl, ale vnější čtenář ho nemůže najít, máte otázku jmenného prostoru. Pokud hook hlásí chybu oprávnění nebo neúspěšné otevření, soubor nebyl nikdy zapsán a žádná změna jmenného prostoru nepomůže.

systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-state

Cesta kořene procesu odhaluje vlastní pohled služby na souborový systém, podléhající kontrolám oprávnění na daný proces, dokud ještě běží. Čtěte žurnál unitu ve stejné relaci, protože chybu zápisu a chybějící soubor lze snadno zaměnit, jakmile už někdo příčinu rozhodl.

Dejte sdíleným datům výslovné místo

Data, která potřebuje jen služba, patří do jejího soukromého dočasného adresáře. Data, která musí číst jiný proces, potřebují cestu definovanou pro oba, s uvedeným vlastníkem, režimem a platností. Než unit upravíte, rozhodněte, který z těch dvou případů máte. Většina těchto incidentů vzniká tím, že se soukromý soubor považuje za sdílený.

[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750

Běžící adresář umístí složku do systémové oblasti běhu, vytvoří ji pro nakonfigurovaného uživatele a skupinu unitu a odstraní ji, když se unit zastaví. Přidejte ho pomocí drop-in, aby unit z balíčku zůstal nedotčený, potom znovu načtěte správce a restartujte tuto instanci s tím, že se její klienti znovu připojí.

Zachovejte každý běžící adresář, který instalovaný unit už vyžaduje. Nahrazení seznamu místo přidání do něj je běžný způsob, jak rozbít nesouvisející funkci, kterou nikdo se změnou nespojuje.

Dvě vrstvy oprávnění se mohou rozejít

Správce služeb vytvoří adresář pro nakonfigurovaného uživatele unitu, zatímco démon VPN může před spuštěním připojovacího hooku samostatně sestoupit na vlastní účet. To jsou různé vrstvy a mohou pojmenovat různé identity.

Adresář vlastněný rootem s restriktivním režimem je pro démona, který už oprávnění opustil, dokonale viditelný, a přesto pro něj nezapisovatelný. Chyba se pak čte jako problém oprávnění, i když cesta existuje přesně tam, kde jste čekali. Porovnejte vlastníka adresáře s identitou, kterou hook hlásí. Když se liší, režim nikdy nebyl otázkou.

Než změníte vlastnictví, ověřte, pod jakou identitou hook skutečně běží. Změna uživatele, pod kterým služba běží, kvůli opravě adresáře může změnit přístup k zařízením a síťová oprávnění jinde, což je velká cena za malý problém.

Ověřte celé předání

Potvrďte čtyři věci najednou: hook zapisuje pod svou skutečnou identitou, zamýšlený čtenář může soubor spotřebovat, nesouvisející uživatelé ne, a zastavení unitu uklidí tak, jak bylo navrženo. Soubor, který se objeví ve sdíleném dočasném adresáři hostitele, není požadavek a obvykle je to známka, že výměna nikdy nedostala vlastní cestu. Otestujte čtenáře po restartu, ne jen při prvním spuštění. Chování při úklidu je součástí návrhu, proto ho pozorujte, místo abyste ho předpokládali.

Trvalý stav patří někam s odpovídající životností, protože běžící adresář má zmizet. Vyberte místo podle životnosti, ne podle pohodlí. Tento zvyk zabrání příští verzi téhož vyšetřování.

Související články