Zautomatyzuj logowanie VPN, gdy klient nie ma API ani CLI
Wybierz ścieżkę skryptu według tego, co udostępnia klient: profil należący do systemu operacyjnego, CLI dostawcy czytające sekret ze stdin lub automatyzacja GUI jako ostatnia deska ratunku.
Rozstrzygają to trzy pytania i tylko trzy. Czy klient tworzy wpis połączenia w systemie operacyjnym, który przetrwa restart? Czy dostarcza wiersz poleceń, który potrafi wziąć sekret skądinąd niż z własnej listy argumentów? Czy jego wymóg tożsamości zmusza człowieka do odpowiedzi na monit przeglądarki? Odpowiedz w tej kolejności, a wybór przestaje być kwestią gustu, bo zadanie zaplanowane może być tylko tak bezgłowe, jak pozwala na to najsłabsza z trzech odpowiedzi.
Dopasuj klienta do trzech warstw, które da się oskryptować
Natywny profil systemu operacyjnego, CLI dostawcy, klient tylko z GUI i klient z SSO przeglądarki wymagają czterech różnych podejść. Pierwsze dwa przetrwają restarty bez nadzoru, a restarty bez nadzoru są sednem sprawy. Pozostałe dwa wymagają decyzji projektowej, zanim wymagają skryptu.
| What the client exposes | What to script | What still bites |
|---|---|---|
| OS-native connection entry | rasdial, scutil --nc, nmcli | Tunnel is up before DNS and routes settle |
| Vendor CLI reading stdin | CLI wrapped by the scheduler, secret from the credential store | Prompt text changes between releases |
| GUI only | Pinned version plus a state assertion | Locale and DPI break the click targets |
Ścieżka pierwsza: profil należy już do systemu operacyjnego
To najtańsza ścieżka i ta, którą większość przeocza. W Windows rasdial "Office" łączy, a rasdial "Office" /disconnect zamyka połączenie; rasphone -d "Office" prowadzi ten sam wpis przez interfejs połączenia telefonicznego. macOS listuje zapisane usługi za pomocą scutil --nc list i uruchamia jedną za pomocą scutil --nc start. Linux przekazuje zadanie NetworkManagerowi.
rasdial "Office" user *
scutil --nc start "Office"
nmcli connection up id Office
nmcli -t -f GENERAL.STATE connection show OfficeTe interfejsy znają tylko profile należące do systemu operacyjnego, więc nie potrafią sterować dowolnym klientem firmy trzeciej. Gdy profilu brakuje, utwórz go raz i pozwól skryptowi go sprawdzać, zamiast odtwarzać go przy każdym uruchomieniu. Uczyń skrypt idempotentnym: odczytaj bieżący stan, łącz się tylko przy rozłączeniu, a potem sprawdź prywatną nazwę, której zadanie naprawdę potrzebuje.
Ścieżka druga: dostawca dostarcza wiersz poleceń
Niektóre klienty udostępniają dość wiersza poleceń, by dało się je opakować: Cisco AnyConnect od lat ma pomocnika wyłącznie do łączenia, a OpenConnect mówi protokołami AnyConnect, GlobalProtect i Pulse z jednego pliku binarnego. Wymóg, który się liczy, to nie lista przełączników, lecz skąd pochodzi sekret, bo hasło na liście argumentów może odczytać każdy, kto potrafi wylistować procesy.
printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
--user "$VPN_USER" --passwd-on-stdin vpn.example.comFortiClient i niektóre kompilacje GlobalProtect nie mają w ogóle wspieranego CLI, a klient społecznościowy lub zamiennik licencjonowany przez dostawcę to decyzja zakupowa, nie obejście. W CI przyznaj kontu usługi uprawnienia do dokładnie tego pliku binarnego, a nie do powłoki, aby wstrzyknięty argument nie mógł stać się poleceniem roota.
Ścieżka trzecia: automatyzacja GUI i dlaczego jest ostatnia
Gdy oficjalny klient nie ma interfejsu, skrypty klikają przyciski przez komunikaty okien albo SendKeys. To jest kruche wobec wersji i języka, może zostawić wpół połączoną sesję i zawodzi po cichu, gdy okno dialogowe pojawi się w złym języku. Jeśli wybierzesz tę drogę, przypnij wersję klienta, potem zweryfikuj powstały stan połączenia i trzymaj udokumentowany plan ręczny obok skryptu.
Ta sama ostrożność dotyczy wymuszonego rozłączenia klienta przez zabicie jego procesu. Tunel może przeżyć proces albo nadzorca może go uruchomić ponownie, więc zabij-i-uruchom ponownie też nie jest niezawodnym resetem.
Co się psuje po podniesieniu tunelu
Udane połączenie dowodzi uwierzytelnienia i niczego więcej. Przetestuj zasób, dla którego zadanie istnieje, jego własnym protokołem i krótkim limitem czasu, i nazwij etap w komunikacie błędu. Profile, certyfikaty i zapisane poświadczenia widoczne na pulpicie mogą być niewidoczne dla sesji usługi, więc uruchom zadanie raz pod własnym kontem harmonogramu, zanim mu zaufasz.
Ogranicz ponowienia. Pętla powtarzająca odrzucone poświadczenia blokuje konta, a na monit MFA zadanie bezgłowe nie odpowie bez projektu rejestracji; skryptowe ponowienia wobec przepływu SSO przeglądarki tylko palą próby. Preferuj ładunek VPN dostarczany przez MDM albo profil konfiguracji dla floty, gdzie platforma posiada cykl życia poświadczeń, a skrypty zostaw dla klientów, których nie da się tak zarządzać.
Zapisuj kod wyjścia i pierwszy zasób, który zawiódł, a nie fakt, że skrypt się uruchomił. Właśnie ta jedna linia zamienia alert harmonogramu w diagnozę w pięć minut.