VPN na Macu při spuštění: launchd dohlíží na úlohu, ne na tunel
Čistý plist nic nedokazuje o přihlašovacích údajích ani připravenosti. Přiřaďte úlohu k její relaci, držte klienta v popředí a testujte v tomto kontextu.
Úloha se spouští při přihlášení, log ukazuje start klienta a tunel se nikdy nezvedne. Nebo se zvedne a za pár sekund zmizí. V obou případech byl seznam vlastností pravděpodobně v pořádku. launchd dal při přijetí úlohy dva sliby: bude dohlížet na proces a ten proces poběží dál. VPN potřebuje obojí a správný soubor XML neposkytuje ani jedno.
Platný seznam vlastností není fungující služba
plutil -lint kontroluje strukturu. Nedokáže říct, zda binárka existuje, zda tato verze klienta podporuje argumenty nebo zda úloha startuje v kontextu, kde jsou přihlašovací údaje dostupné. To jsou sémantické otázky a vysvětlují většinu selhání, která vypadají jako problémy s launchd.
plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn
Čtěte výstup druhého příkazu, místo abyste předpokládali, že se úloha načetla. Ukazuje poslední stav ukončení a zda služba běží, což rozliší “nikdy nezačala” od “začala a zemřela”, než sáhnete na profil.
Agenti dědí uživatelskou relaci, démoni ne
Dokumentace Apple k launchd odděluje agenty pro jednotlivé uživatele od systémových démonů. Agent běží v kontextu přihlášeného uživatele s jeho klíčenkou a prostředím. Démon běží bez této relace a přesun úlohy do systémového adresáře nedokáže znovu vytvořit interaktivní přihlašovací údaje uživatele.
Tento rozdíl určuje návrh. Pokud připojení vyžaduje, aby se člověk přihlásil nebo schválil výzvu MFA, podporované uspořádání je úloha v uživatelské relaci, která běží po přihlášení. Pokud musí fungovat bez přihlášeného člověka, klient potřebuje schválenou identitu bez obsluhy s vlastním procesem obnovy a odvolání. Volba špatného řádku vytvoří úlohu, která čistě nastartuje a selže v prvním kroku autentizace.
Nezakrývejte rozdíl heslem v poli argumentů ani vypnutím kontrol certifikátů. Obojí mění požadavek na autentizaci v trvalé tajemství v čitelném souboru a druhé znamená, že tunel autentizuje vše, co odpoví.
Dohled funguje jen tehdy, když proces zůstane vpředu
Klient, který se sám přepne do režimu démona, okamžitě vrátí řízení launchd a dohled pak sleduje proces, který už skončil. Tunel může být nahoře, ale launchd si myslí, že úloha selhala, a jeho politika restartu udělá něco, co jste nezamýšleli.
Použijte dokumentovaný režim popředí nebo služby, který klient nabízí. Pokud má produkt vlastní podporovanou funkci spuštění, ta už ví, jak zůstat v popředí a jak předat řízení síťovému zásobníku; vlastní úloha je samostatný návrh, ne jeho vylepšení.
Dejte úloze jedinečný štítek, zamýšlený spustitelný soubor a promyšlené pole argumentů. Pole není příkazový řádek shellu, takže roury a přesměrování tam nefungují a uvozovky se chovají jinak. Příkaz, který uspěje v terminálu správce, je nanejvýš předběžná kontrola.
Přihlašovací údaje musí fungovat bez výzvy
Provoz bez obsluhy problém s přihlašovacími údaji přesouvá, nikoli odstraňuje. Někdo musí identitu vlastnit, rozhodnout, jak dlouho žije, a zdokumentovat, jak se nahrazuje. Certifikát bez sledování platnosti se změní na výpadek s datem v kalendáři.
Udržujte tajemství mimo argumenty a mimo standardní výstup úlohy. Pokud klient podporuje čtení údajů z chráněného úložiště, použijte tuto cestu a ověřte, že se kontext spuštění úlohy do úložiště dostane. Démon běžící jako root obvykle nepřečte položku přihlašovací klíčenky, a to je detail, který se objeví jen v systémovém kontextu.
Definujte, co znamená připravenost, a testujte ji tam
Úspěšné spuštění dokazuje, že proces začal. Nedokazuje, že síť běží, že brána přijala identitu nebo že je privátní aplikace dostupná. Pokud na tunelu závisí něco dalšího, potřebuje signál připravenosti, který odráží spojení, ne čas startu úlohy.
Opakování by měla být omezená a měla by rozlišit chybějící síť od odmítnutých údajů. Restart při každém selhání neopraví propadlý certifikát a vytvoří log plný stejných pokusů, který skryje ten skutečný.
Přijměte úlohu v kontextu, ve kterém skutečně poběží: bez sítě při startu, při běžném přihlášení, při probuzení ze spánku a při řízeném zastavení. Potom zaznamenejte štítek úlohy, verzi klienta a revizi profilu společně, aby další člověk zdědil přiřaditelnou službu místo souboru, který kdysi fungoval.