Skript, ktorý spustí klientského VPN klienta dodávateľa, visí, kým nevyprší časový limit, a záznam ukazuje, že klient žiada overovací kód, ktorý nikto nezadal. Heslo bolo dodané, takže zrejmý záver je, že heslo je nesprávne. Nie je. Žiadosť o kód je samostatná konverzácia na samostatnom kanáli a váš skript ju nikdy neotvoril.

Prejdite päť kontrol nižšie v poradí. Zastavte sa pri prvej, ktorá zlyhá, pretože každý ďalší krok predpokladá, že predchádzajúce platia.

Kontrola 1: číta klient vôbec štandardný vstup?

Otestujte to skôr, než napíšete akúkoľvek automatizáciu: pretlačte do klienta falošné tajomstvo rúrou a sledujte, čo sa stane. Ak vypíše svoju výzvu a potom čaká, rúru nečíta.

Mnoho klientov otvára zariadenie terminálu priamo, alebo odmieta prijať tajomstvo z prúdu, ktorý nie je terminál, aby zblúdilá rúra nemohla uniknúť heslo. OpenVPN je dokumentovaná výnimka, pretože --auth-user-pass prijíma cestu k súboru. Klienti dodávateľov, ktorí žiadajú jednorazový kód, zvyčajne nemajú ekvivalentný prepínač a ich výzva čaká na terminál, ktorý váš skript nikdy neposkytol.

Kontrola 2: má potomok terminál?

pty pridelí potomkovi terminál, čo premení výzvy na čitateľný výstup, na ktorý môžete odpovedať v poradí.

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)

Reťazce výziev vyššie sú ilustratívne; skopírujte presný text, ktorý váš klient vypisuje, vrátane veľkosti písmen a interpunkcie. Každé očakávanie má časový limit a uzavretý potomok vyvolá výnimku namiesto vrátenia stavu, takže sekvenciu obaľte a koniec súboru berte ako zlyhanie. Všimnite si, čo tento blok nerobí: potomok umiera so skriptom, pretože pty nie je mechanizmus odpútania a disown je vstavaný príkaz shellu, ktorý nedosiahne na proces, ktorý váš skript vytvoril.

Kontrola 3: existuje podporovaný neinteraktívny vstup?

Snímanie obrazovky sa láme pri aktualizáciách klienta, takže najprv hľadajte dokumentovaný prepínač.

Prezrite výstup nápovedy, či ponúka voľbu tokenu alebo jednorazového kódu, a overte, či služba prijíma kód pripojený k poľu hesla. Kde klient číta súbor poverení, dajte mu súbor namiesto výzvy:

openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")

Nahradenie procesov dá klientovi čitateľnú cestu v systémoch, ktoré poskytujú /dev/fd. Tajomstvo zostáva z pohľadu klienta tajomstvom, takže ho držte mimo záznamov, histórie shellu a výpisov procesov. Ak klient odmietne /dev/fd alebo otvorí cestu k povereniam viac ako raz, napíšte skutočný súbor s obmedzujúcimi právami a v tom istom skripte ho zmažte.

Kontrola 4: prežije tunel skript?

V predvolenom nastavení tunel umiera so svojím rodičom, čo je opak toho, čo spúšťací skript potrebuje.

disown -h pomôže len vtedy, keď ste klienta spustili ako úlohu shellu, pretože upravuje tabuľku úloh tohto shellu a nedosiahne na proces, ktorý váš skript vytvoril cez pty. Správca služieb je lepší domov pre všetko, čo sa musí pripájať znova bez dozoru, pretože klienta reštartuje a zaznamená, prečo zomrel. V každom prípade po každom opätovnom pripojení čakajte nový kód: jednorazový token sa spotrebuje pri prvom úspešnom overení.

Sledujte, čo sudo robí so sekvenciou. Výzva na heslo sudo nie je výzvou VPN a odpovedať na ňu heslom VPN je najčastejší spôsob, akým inak správne poradie očakávaní stále zlyhá.

Kontrola 5: má byť niečí kód v skripte?

Toto je kontrola, ktorú ľudia preskakujú. Token patrí človeku, zatiaľ čo tunel, ktorý sa musí zdvihnúť podľa plánu, patrí stroju.

Ak sa úloha musí pripájať znova bez dozoru, spýtajte sa, či strojový certifikát alebo servisný účet môže nahradiť interaktívne prihlásenie. Automatizácia niečieho jednorazového kódu mení druhý faktor na uložené tajomstvo, čo je zmena politiky, nie pohodlie pre skripty. Kde služba podporuje oboje, vyberte poverenie, ktoré zodpovedá tomu, ako úloha skutočne beží. Odpoveď zapíšte, pretože ďalší človek sa opýta, prečo skript drží token.

Ako vyzerá funkčný skript

Skript vypisuje krok, ku ktorému sa dostal, nikdy tajomstvo, a pri každom neúspešnom očakávaní skončí s nenulovým kódom.

Otestujte ho tak, že ho úmyselne pokazíte: nesprávne heslo, nesprávna skupina, prepadnutý token. Každé zlyhanie by sa malo zastaviť na pomenovanom kroku namiesto visenia. Potom ho raz spustite proti skutočnej službe a skontrolujte tunel zvonku skriptu, nie zvnútra.

Súvisiace články