Skriptiranje VPN klijenta: odaberite sloj prije lozinke
CLI dobavljača, rasdial, namjera aplikacije ili automatizacija sučelja padaju svaki na svoj način. Odaberite sloj, držite tajnu izvan argv i čekajte stanje, a ne izlazne kodove.
Skripte pokreću VPN klijente na onom sloju koji je autor odabrao, a taj sloj rijetko je onaj koji je posao trebao. Naredbena linija dobavljača, biralo operativnog sistema i namjera mobilne aplikacije vraćaju se u različitim trenucima života veze. Tajnu također obrađuju drugačije, a ta razlika odlučuje hoće li lozinka biti vidljiva svakom korisniku na mašini. Odaberite sloj prije nego napišete prvu liniju skripte.
Sloj 1: naredbena linija dobavljača
Većina desktop klijenata isporučuje naredbenu liniju koja prima naziv profila i, prečesto, lozinku. Stari Cisco klijent prihvatao je glagol connect s argumentima korisnika i lozinke; macOS izlaže ugrađenu uslugu kroz networksetup; NetworkManager odgovara na nmcli. Ovi pozivi vraćaju se kada naredba završi, što nije isti trenutak kada tunel postane upotrebljiv. Pročitajte dokumentaciju dobavljača za verziju koju uvajate, jer se ova sučelja mijenjaju i neka se potpuno uklanjaju.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
Prednost je što dobavljač poznaje vlastito spremište profila, pa poziv koristi istu konfiguraciju koju bi koristio GUI. Nedostatak je što svaki dobavljač izmišlja vlastite glagole, a skripta napisana za jednog klijenta ne prenosi se na drugog. Tretirajte ovaj sloj kao najkraći put kada je klijent fiksiran i verzija prikvačena.
Sloj 2: vlastita usluga operativnog sistema
Na Windowsu je biralo dio operativnog sistema i radi protiv unosa u telefonskom imeniku umjesto spremišta profila dobavljača. To ga čini prenosivijim među klijentima i lakšim za skriptiranje iz servisnog računa. To također znači da veza može postojati na jednom mjestu, a ne na drugom, što zbunjuje ljude koji gledaju na pogrešan spisak.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Koristite PowerShell površinu kada trebate stvoriti ili ukloniti unos umjesto da ga birate. WMI i cmdlet slojevi izlažu iste objekte pod različitim imenima, a uklanjanje je odvojena operacija od prekidanja veze. Skripta koja samo bira ostat će zastarjele unose nakon migracije. Provjerite u koje spremište vaša automatizacija piše prije nego obećate da će čišćenje biti obavljeno.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
Na macOSu je ekvivalent popis mrežnih usluga, gdje se postojeća usluga povezuje po imenu umjesto da nastaje u hodu.
Vjerodajnice cure na svakom sloju, pa odaberite kanal
Sve što prenesete na naredbenoj liniji pojavljuje se u tablici procesa za svakog lokalnog korisnika i obično preživi i u povijesti ljuske. Podržana alternativa OpenVPN-a je čitati tajnu iz datoteke uz --askpass, a sama datoteka treba dozvole koje odgovaraju povjerenju koje u nju polažete. Imenovana cijev izbjegava zapisivanje tajne na disk, ali dopušta svakom procesu koji je može otvoriti da piše tamo. Na Windowsu pohranite tajnu u upravitelju vjerodajnica ili u datoteci koju može čitati samo servisni račun, i nikada kao literal u batch datoteci.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
Isto pravilo vrijedi za tokene i jednokratne kodove: ako ih automatizacija treba, treba kanal koji nije argument naredbene linije. Rotirajte tajnu kada promijenite mehanizam, jer je stara vrijednost negdje ležala u dnevniku. Skripta koja radi i curi nije skripta koja radi.
Sačekajte stanje, zatim nadzirite jednog vlasnika
Svaki od ovih poziva vraća se prije nego što je tunel spreman, pa provjeravajte stanje koje klijent izlaže ili isprobajte odredište unutar njega s vremenskim ograničenjem. Kopiranje datoteka ili otvaranje veze s bazom odmah nakon poziva povezivanja je utrka, i povremeno pada na način koji izgleda kao mrežni kvar.
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
Prekidanje ima isti problem u obrnutom smjeru: proces može završiti prije nego što rute nestanu. Koristite kuke klijenta gdje postoje, kao skripte up i down OpenVPN ili ExecStartPost systemd jedinice, jer se izvode u točki koja vam je doista važna. Kuke se izvode s privilegijama onoga što ih je pozvalo, pa kuka koja ponovno pokreće mrežu treba izričito pravilo umjesto pretpostavke. Održavajte točno jednog vlasnika tijekom cijelog života veze.
Kada dva nadzornika pokreću i zaustavljaju isti profil, rezultat je petlja ponovnog povezivanja koja se čita kao ispad pružatelja usluge. Runbook završava kada je sloj dokumentiran, tajna ima kanal koji nije argv, uvjet čekanja je provjera stanja s vremenskim ograničenjem i jedan proces posjeduje životni ciklus.