Kuidas automatiseerida VPN-i sisselogimist, mis ootab tokeni koodi
Käsurealt käivitatav VPN-i klient, mis küsib terminalis, blokeerib skripti, mis saadab ainult parooli läbi toru. Tehke need viis kontrolli enne, kui haarasite expecti järele.
Skript, mis käivitab tarnija VPN-i kliendi, ripub kuni ajalõpp, ja logi näitab, et klient küsib kinnituskoodi, mida keegi ei sisestanud. Parool oli antud, seega ilmne järeldus on, et parool on vale. See ei ole nii. Koodi küsimine on eraldi vestlus eraldi kanalil ja teie skript ei avanud seda kunagi.
Käige allolevad viis kontrolli järjekorras läbi. Peatuge esimese juures, mis ebaõnnestub, sest iga järgnev samm eeldab, et eelmised kehtivad.
Kontroll 1: kas klient üldse loeb standard sisendit?
Testige enne mis tahes automatiseerimise kirjutamist: saatke kliendile toru kaudu võlts saladus ja vaadake, mis juhtub. Kui see prindib oma küsimuse ja seejärel ootab, ei loe see toru.
Paljud kliendid avavad terminaliseadme otse või keelduvad võtmast saladust voost, mis ei ole terminal, et eksinud toru ei saaks parooli lekitada. OpenVPN on dokumenteeritud erand, sest --auth-user-pass võtab failitee. Tarnijate kliendid, mis küsivad ühekordset koodi, ei oma tavaliselt samaväärset valikut, ja nende küsimus ootab terminali, mida teie skript kunagi ei pakkunud.
Kontroll 2: kas lapsprotsessil on terminal?
pty eraldab lapsele terminali, mis muudab küsimused loetavaks väljundiks, millele saate järjekorras vastata.
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)Ülaltoodud küsimusstringid on näitlikud; kopeerige täpne tekst, mille teie klient prindib, sealhulgas suur- ja väiketähed ning kirjavahemärgid. Igal ootusel on ajalõpp ja suletud laps viskab erindi, selle asemel et tagastada olek, seega mähkige jada ja käsitlege faili lõppu ebaõnnestumisena. Pange tähele, mida see plokk ei tee: laps sureb koos skriptiga, sest pty ei ole eraldamismehhanism ja disown on kesta sisseehitatud käsk, mis ei ulatu protsessini, mille teie skript lõi.
Kontroll 3: kas on toetatud mitteinteraktiivne sisend?
Ekraani kraapimine katkeb kliendi uuendustega, seega otsige kõigepealt dokumenteeritud valikut.
Kontrollige abiväljundist tokeni või ühekordse koodi valikut ja kontrollige, kas teenus võtab vastu parooli väljale lisatud koodi. Kus klient loeb volituste faili, andke talle fail küsimuse asemel:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Protsessi asendamine annab kliendile loetava tee süsteemides, mis pakuvad /dev/fd. Saladus jääb kliendi vaatenurgast saladuseks, seega hoidke see logidest, kesta ajaloost ja protsesside loenditest väljas. Kui klient keeldub /dev/fd-st või avab volituste tee rohkem kui korra, kirjutage tõeline fail piiravate õigustega ja kustutage see samas skriptis.
Kontroll 4: kas tunnel elab skriptist kauem?
Vaikimisi sureb tunnel koos oma vanemaga, mis on vastupidine sellele, mida alglaadimisskript vajab.
disown -h aitab ainult siis, kui käivitasite kliendi kesta tööna, sest see muudab selle kesta tööde tabelit ega ulatu protsessini, mille teie skript pty kaudu lõi. Teenusehaldur on parem kodu kõigele, mis peab järelevalveta uuesti ühenduma, sest see taaskäivitab kliendi ja registreerib, miks see suri. Igal juhul oodake pärast igat taasühendust uut koodi: ühekordne token kulub esimese eduka autentimisega.
Jälgige, mida sudo jadaga teeb. sudo parooliküsimus ei ole VPN-i küsimus ja sellele VPN-i parooliga vastamine on kõige tavalisem viis, kuidas muidu õige ootuste järjekord siiski ebaõnnestub.
Kontroll 5: kas inimese kood peaks olema skriptis?
See on kontroll, mille inimesed vahele jätavad. Token kuulub inimesele, samas kui graafiku järgi tõusma peav tunnel kuulub masinale.
Kui töö peab järelevalveta uuesti ühenduma, küsige, kas masinasertifikaat või teenusekonto saab interaktiivse sisselogimise asendada. Kellegi ühekordse koodi automatiseerimine muudab teise faktori salvestatud saladuseks, mis on poliitika muudatus, mitte skriptimise mugavus. Kus teenus toetab mõlemat, valige volitus, mis vastab sellele, kuidas töö tegelikult töötab. Kirjutage vastus üles, sest järgmine inimene küsib, miks skript tokenit hoiab.
Kuidas näeb välja töötav skript
Skript prindib sammu, milleni jõudis, mitte kunagi saladust, ja väljub nullist erineva koodiga iga ebaõnnestunud ootuse korral.
Testige seda tahtlikult lõhkudes: vale parool, vale grupp, aegunud token. Iga ebaõnnestumine peaks peatuma nimetatud sammul, mitte rippuma. Seejärel käivitage see korra päris teenuse vastu ja kontrollige tunnelit väljastpoolt skripti, mitte seest.