Kako automatizirati VPN prijavu koja čeka kod tokena
CLI VPN klijent koji traži unos u terminalu blokira skriptu koja samo prosljeđuje lozinku kroz cijev. Prođite ovih pet provjera prije nego posegnete za expect.
Skripta koja pokreće VPN klijenta dobavljača visi dok ne istekne vrijeme, a zapis pokazuje da klijent traži verifikacijski kod koji nitko nije upisao. Lozinka je bila poslana, pa je očigledan zaključak da je lozinka pogrešna. Nije. Zahtjev za kod je odvojen razgovor na odvojenom kanalu i vaša skripta ga nikada nije otvorila.
Prođite pet provjera u nastavku po redu. Zaustavite se na prvoj koja ne uspije, jer svaki kasniji korak pretpostavlja da prethodni vrijede.
Provjera 1: čita li klijent uopće standardni ulaz?
Testirajte prije nego napišete bilo kakvu automatizaciju: pošaljite lažnu tajnu u klijent kroz cijev i gledajte što se događa. Ako ispiše svoj upit i zatim čeka, ne čita cijev.
Mnogi klijenti otvaraju uređaj terminala izravno ili odbijaju uzeti tajnu iz toka koji nije terminal, kako zalutala cijev ne bi iscurila lozinku. OpenVPN je dokumentirana iznimka, jer --auth-user-pass prima putanju datoteke. Klijenti dobavljača koji traže jednokratni kod obično nemaju ekvivalentnu zastavicu, a njihov upit čeka terminal koji vaša skripta nikada nije osigurala.
Provjera 2: ima li dijete terminal?
pty dodjeljuje terminal djetetu, što upite pretvara u čitljiv izlaz na koji možete odgovarati po redu.
import pexpect
child = pexpect.spawn("openconnect vpn.example.net", encoding="utf-8", timeout=30)
child.expect("GROUP:")
child.sendline("staff")
child.expect("USERNAME:")
child.sendline("alice")
child.expect("PASSWORD:")
child.sendline(PASSWORD)
child.expect("Connected as", timeout=60)Nizovi upita iznad su ilustrativni; kopirajte točan tekst koji vaš klijent ispisuje, uključujući velika i mala slova te interpunkciju. Svako očekivanje nosi vremensko ograničenje, a zatvoreno dijete podiže iznimku umjesto da vrati status, pa omotajte slijed i tretirajte kraj datoteke kao neuspjeh. Obratite pozornost na to što ovaj blok ne radi: dijete umire sa skriptom, jer pty nije mehanizam za odvajanje, a disown je ugrađena naredba ljuske koja ne može dohvatiti proces koji je vaša skripta stvorila.
Provjera 3: postoji li podržani neinteraktivni unos?
Struganje ekrana lomi se pri nadogradnji klijenta, pa prvo tražite dokumentiranu zastavicu.
Provjerite izlaz pomoći za opciju tokena ili jednokratnog koda i provjerite prihvaća li usluga kod pridodan polju lozinke. Gdje klijent čita datoteku vjerodajnica, dajte mu datoteku umjesto upita:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Zamjena procesa daje klijentu čitljivu putanju na sustavima koji nude /dev/fd. Tajna je i dalje tajna iz perspektive klijenta, pa je držite izvan zapisa, povijesti ljuske i popisa procesa. Ako klijent odbije /dev/fd ili putanju vjerodajnica otvori više od jednom, napišite pravu datoteku sa strogim ovlastima i izbrišite je u istoj skripti.
Provjera 4: hoće li tunel nadživjeti skriptu?
Prema zadanom tunel umire sa svojim roditeljem, što je suprotno od onoga što skripti za podizanje treba.
disown -h pomaže samo kad ste klijenta pokrenuli kao posao ljuske, jer uređuje tablicu poslova te ljuske i ne može dohvatiti proces koji je vaša skripta stvorila kroz pty. Upravitelj usluga bolji je dom za sve što se mora ponovno spajati bez nadzora, jer ponovno pokreće klijenta i bilježi zašto je umro. U svakom slučaju, očekujte novi kod nakon svakog ponovnog spajanja: jednokratni token troši se prvom uspješnom autentifikacijom.
Pazite što sudo čini slijedu. Upit za lozinku sudo nije VPN-ov upit, a odgovaranje na njega VPN lozinkom najčešći je način da inače ispravan redoslijed očekivanja ipak ne uspije.
Provjera 5: treba li kod osobe biti u skripti?
Ovo je provjera koju ljudi preskaču. Token pripada osobi, dok tunel koji se mora podizati po rasporedu pripada stroju.
Ako se posao mora ponovno spajati bez nadzora, pitajte može li strojni certifikat ili servisni račun zamijeniti interaktivnu prijavu. Automatiziranje nečijeg jednokratnog koda pretvara drugi faktor u pohranjenu tajnu, što je promjena politike, a ne pogodnost za skripte. Gdje usluga podržava oboje, odaberite vjerodajnicu koja odgovara načinu na koji posao stvarno radi. Zapišite odgovor, jer sljedeća osoba pita zašto skripta drži token.
Kako izgleda skripta koja radi
Skripta ispisuje korak do kojeg je stigla, nikada tajnu, i izlazi s nenultim kodom pri svakom neuspjelom očekivanju.
Testirajte je tako da je namjerno pokvarite: pogrešna lozinka, pogrešna grupa, istekao token. Svaki neuspjeh treba stati na imenovanom koraku umjesto da visi. Zatim je jednom pokrenite protiv stvarne usluge i provjerite tunel izvan skripte, a ne iz nje.