VPN na Macu pri podizanju: launchd nadzire zadatak, a ne tunel
Plist koji prođe lint ne dokazuje ništa o akreditivima ili spremnosti. Uskladite zadatak s njegovom sesijom, držite klijent u prvom planu i testirajte u tom kontekstu.
Zadatak se pokreće pri prijavi, log pokazuje da klijent starta, ali tunel se nikad ne diže. Ili se digne i nestane nekoliko sekundi kasnije. U oba slučaja lista svojstava je verovatno bila u redu. launchd je dao dva obećanja kada je prihvatio zadatak: nadziraće proces i taj proces će nastaviti da radi. VPN-u treba oboje, a ispravan XML fajl ne daje nijedno.
Ispravna lista svojstava nije usluga koja radi
plutil -lint proverava strukturu. Ne može da vam kaže da li binarni fajl postoji, da li argumente podržava ova verzija klijenta ili da li zadatak startuje u kontekstu u kome su akreditivi dostupni. To su semantička pitanja i ona objašnjavaju većinu neuspeha koji izgledaju kao problemi s launchd-om.
plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn
Pročitajte izlaz druge komande umesto da pretpostavite da je zadatak učitan. On prijavljuje poslednji izlazni status i da li usluga radi, što razlikuje „nikad nije startovao” od „startovao i umro” pre nego što dirnete profil.
Agenti nasleđuju korisničku sesiju, demoni ne
Apple-ova dokumentacija za launchd razdvaja agente po korisniku od sistemskih demona. Agent radi u kontekstu prijavljenog korisnika, s njegovim priveskom ključeva i okruženjem. Demon radi bez te sesije, a premeštanje zadatka u sistemski direktorijum ne ponovo stvara interaktivne akreditive korisnika.
Ta razlika odlučuje dizajn. Ako veza zahteva da se osoba prijavi ili odobri MFA upit, podržani raspored je zadatak u korisničkoj sesiji koji se pokreće posle prijave. Ako mora da radi bez ikoga prijavljenog, klijentu treba odobreni nenadgledani identitet sa sopstvenim procesom obnove i opoziva. Izbor pogrešnog reda daje zadatak koji čisto startuje i pada na prvom koraku autentifikacije.
Ne prikrivajte razliku lozinkom u nizu argumenata ili isključivanjem provere sertifikata. Oboje pretvaraju zahtev za autentifikaciju u trajnu tajnu u čitljivom fajlu, a drugo znači da tunel autentifikuje sve što odgovori.
Nadzor funkcioniše samo ako proces ostane napred
Klijent koji sam sebe pretvori u demon odmah vraća kontrolu launchd-u, a nadzornik tada gleda proces koji je već završen. Tunel može biti podignut, ali launchd smatra da je zadatak neuspešan i njegova politika restarta će uraditi nešto što niste nameravali.
Koristite dokumentovani režim prvog plana ili usluge koji klijent nudi. Ako proizvod ima sopstvenu podržanu funkciju startovanja, ona već zna kako da ostane napred i kako da preda mrežnom steku; prilagođeni zadatak je zaseban dizajn, a ne njeno poboljšanje.
Dajte zadatku jedinstvenu oznaku, namenjeni izvršni fajl i promišljen niz argumenata. Niz nije shell komandna linija, pa cevi i preusmeravanja tamo ne rade, a navodnici se ponašaju drugačije. Komanda koja uspe u terminalu administratora je u najboljem slučaju preliminarna provera.
Akreditivi moraju da rade bez upita
Rad bez nadzora premešta problem akreditiva umesto da ga ukloni. Neko mora da poseduje identitet, odluči koliko dugo živi i dokumentuje kako se zamenjuje. Sertifikat bez praćenja isteka postaje prekid s datumom u kalendaru.
Držite tajne van argumenata i van standardnog izlaza zadatka. Ako klijent podržava čitanje akreditiva iz zaštićenog skladišta, koristite taj put i proverite da li kontekst izvršavanja zadatka može da dođe do skladišta. Demon koji radi kao root obično ne može da pročita stavku u privesku ključeva za prijavu, a to je vrsta detalja koja se pojavljuje samo u sistemskom kontekstu.
Definišite šta znači spremno i testirajte tamo
Uspešno pokretanje dokazuje da je proces počeo. Ono ne dokazuje da je mreža podignuta, da je gejtvej prihvatio identitet ili da je privatna aplikacija dostupna. Ako nešto drugo zavisi od tunela, treba mu signal spremnosti koji odražava vezu, a ne vreme starta zadatka.
Ponovni pokušaji treba da budu ograničeni i treba da razlikuju mrežu koja nedostaje od odbijenih akreditiva. Restartovanje pri svakom neuspehu ne može da popravi istekao sertifikat i stvara log pun identičnih pokušaja koji skriva pravi.
Prihvatite zadatak u kontekstu u kome će zaista raditi: bez mreže pri podizanju, uz normalnu prijavu, buđenje iz sna i kontrolisano zaustavljanje. Zatim zapišite oznaku zadatka, verziju klijenta i reviziju profila zajedno, da sledeća osoba nasledi uslugu koja se može pripisati, a ne fajl koji je nekad radio.