Kaip automatizuoti VPN prisijungimą, kuris laukia žetono kodo
Komandų eilutės VPN klientas, kuris klausia terminale, sustabdo scenarijų, kuris tik perduoda slaptažodį vamzdžiu. Atlikite šiuos penkis patikrinimus, prieš imdamiesi expect.
Scenarijus, kuris paleidžia tiekėjo VPN klientą, kabo, kol baigiasi laikas, o žurnale matyti, kad klientas prašo patvirtinimo kodo, kurio niekas neįvedė. Slaptažodis buvo perduotas, tad akivaizdi išvada – slaptažodis neteisingas. Taip nėra. Kodo prašymas yra atskiras pokalbis atskiru kanalu, ir jūsų scenarijus jo niekada neatidarė.
Atlikite penkis patikrinimus žemiau iš eilės. Sustokite ties pirmuoju, kuris nepavyksta, nes kiekvienas vėlesnis žingsnis remiasi ankstesniais.
1 patikrinimas: ar klientas apskritai skaito standartinę įvestį?
Išbandykite prieš rašydami bet kokią automatizaciją: perduokite klientui netikrą slaptažodį vamzdžiu ir stebėkite, kas nutinka. Jei jis atspausdina savo prašymą ir tada laukia, vamzdžio jis neskaito.
Daugelis klientų tiesiogiai atidaro terminalo įrenginį arba atsisako priimti slaptažodį iš srauto, kuris nėra terminalas, kad paklydęs vamzdis negalėtų nutekinti slaptažodžio. OpenVPN yra dokumentuota išimtis, nes --auth-user-pass priima failo kelią. Tiekėjų klientai, prašantys vienkartinio kodo, paprastai neturi lygiavertės parinkties, o jų prašymas laukia terminalo, kurio jūsų scenarijus niekada nesuteikė.
2 patikrinimas: ar vaiko procesas turi terminalą?
pty skiria vaikui terminalą, todėl prašymai tampa įskaitoma išvestimi, į kurią galite atsakyti iš eilės.
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)Aukščiau pateiktos prašymų eilutės yra iliustracinės; nukopijuokite tikslų tekstą, kurį spausdina jūsų klientas, įskaitant didžiąsias ir mažąsias raides bei skyrybą. Kiekviena laukimo sąlyga turi laiko limitą, o uždarytas vaikas išmeta išimtį vietoj to, kad grąžintų būseną, todėl apvyniokite seką ir failo pabaigą laikykite nesėkme. Atkreipkite dėmesį, ko šis blokas nedaro: vaikas miršta kartu su scenarijumi, nes pty nėra atjungimo mechanizmas, o disown yra apvalkalo vidinė komanda, kurios nepasiekia procesas, kurį paleido jūsų scenarijus.
3 patikrinimas: ar yra palaikoma neinteraktyvi įvestis?
Ekrano nuskaitymas lūžta atnaujinant klientą, tad pirmiausia ieškokite dokumentuotos parinkties.
Patikrinkite pagalbos išvestį, ar yra žetono ar vienkartinio kodo parinktis, ir patikrinkite, ar paslauga priima kodą, pridėtą prie slaptažodžio lauko. Kur klientas skaito prisijungimo duomenų failą, duokite jam failą vietoj prašymo:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Procesų pakeitimas suteikia klientui įskaitomą kelią sistemose, kurios teikia /dev/fd. Slaptažodis kliento požiūriu tebėra slaptas, tad laikykite jį atokiau nuo žurnalų, apvalkalo istorijos ir procesų sąrašų. Jei klientas atmeta /dev/fd arba prisijungimo duomenų kelią atidaro daugiau nei kartą, įrašykite tikrą failą su griežtomis teisėmis ir ištrinkite jį tame pačiame scenarijuje.
4 patikrinimas: ar tunelis pergyvens scenarijų?
Pagal numatytuosius nustatymus tunelis miršta su savo tėvu, o tai yra priešingai, nei reikia paleidimo scenarijui.
disown -h padeda tik tada, kai klientą paleidote kaip apvalkalo užduotį, nes ji redaguoja to apvalkalo užduočių lentelę ir nepasiekia proceso, kurį jūsų scenarijus paleido per pty. Paslaugų tvarkyklė yra geresni namai viskam, ką reikia prijungti iš naujo be priežiūros, nes ji paleidžia klientą iš naujo ir įrašo, kodėl jis mirė. Bet kuriuo atveju po kiekvieno prisijungimo iš naujo tikkitės naujo kodo: vienkartinis žetonas sunaudojamas pirmos sėkmingos autentifikacijos.
Stebėkite, ką sudo daro sekai. sudo slaptažodžio prašymas nėra VPN prašymas, ir atsakyti į jį VPN slaptažodžiu yra dažniausia priežastis, kodėl kitaip teisinga laukimo tvarka vis tiek nepavyksta.
5 patikrinimas: ar žmogaus kodas turi būti scenarijuje?
Tai patikrinimas, kurį žmonės praleidžia. Žetonas priklauso žmogui, o tunelis, kuris turi kilti pagal grafiką, priklauso mašinai.
Jei darbas turi jungtis iš naujo be priežiūros, paklauskite, ar mašinos sertifikatas ar paslaugos paskyra gali pakeisti interaktyvų prisijungimą. Kieno nors vienkartinio kodo automatizavimas antrąjį veiksnį paverčia saugomu slaptažodžiu, o tai yra politikos pokytis, o ne scenarijų patogumas. Kur paslauga palaiko abu, pasirinkite prisijungimo duomenis, atitinkančius tai, kaip darbas iš tikrųjų vyksta. Užsirašykite atsakymą, nes kitas žmogus paklaus, kodėl scenarijus laiko žetoną.
Kaip atrodo veikiantis scenarijus
Scenarijus atspausdina pasiektą žingsnį, niekada slaptažodžio, ir bet kurio nepavykusio laukimo atveju baigia su nuline nelygiu kodu.
Išbandykite jį tyčia sugadindami: neteisingas slaptažodis, neteisinga grupė, pasibaigęs žetonas. Kiekviena nesėkmė turėtų sustoti ties įvardytu žingsniu, o ne pakibti. Tada paleiskite jį kartą prieš tikrą paslaugą ir patikrinkite tunelį iš scenarijaus išorės, o ne iš vidaus.