Si të automatizoni një hyrje VPN që pret një kod tokeni
Një klient VPN i rreshtit të komandës që pyet në terminal bllokon një skript që vetëm kalon një fjalëkalim përmes tubit. Kryeni këto pesë kontrolle përpara se t'i drejtoheni expect.
Një skript që nis një klient VPN të një furnizuesi ngec derisa të skadojë koha, dhe regjistri tregon se klienti kërkon një kod verifikimi që askush nuk e shtypi. Fjalëkalimi ishte dhënë, prandaj përfundimi i dukshëm është se fjalëkalimi është i gabuar. Nuk është. Kërkesa për kod është një bisedë më vete në një kanal më vete, dhe skripti juaj nuk e ka hapur kurrë.
Kryeni pesë kontrollet më poshtë me radhë. Ndaloni në të parën që dështon, sepse çdo hap i mëpasshëm supozon se të mëparshmit vlejnë.
Kontrolli 1: a e lexon klienti fare hyrjen standarde?
Provoni përpara se të shkruani çfarëdo automatizimi: kaloni një sekret të rremë te klienti përmes një tubi dhe shikoni çfarë ndodh. Nëse shtyp kërkesën e vet dhe pastaj pret, nuk po e lexon tubin.
Shumë klientë e hapin pajisjen e terminalit drejtpërdrejt, ose refuzojnë të marrin një sekret nga një rrjedhë që nuk është terminal, që një tub i humbur të mos mund të rrjedhë një fjalëkalim. OpenVPN është përjashtimi i dokumentuar, sepse --auth-user-pass merr një shteg skedari. Klientët e furnizuesve që kërkojnë një kod njëpërdorimësh zakonisht nuk kanë një opsion ekuivalent, dhe kërkesa e tyre pret një terminal që skripti juaj nuk e ka ofruar kurrë.
Kontrolli 2: a ka terminal procesi fëmijë?
Një pty i cakton një terminal fëmijës, gjë që i kthen kërkesat në dalje të lexueshme që mund t'u përgjigjeni me radhë.
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)Vargjet e kërkesave më sipër janë ilustruese; kopjoni tekstin e saktë që shtyp klienti juaj, përfshirë shkronjat e mëdha e të vogla dhe pikësimin. Çdo pritje ka një afat kohor, dhe një fëmijë i mbyllur hedh një përjashtim në vend që të kthejë një status, prandaj mbështillni sekuencën dhe trajtoni fundin e skedarit si dështim. Vini re çfarë nuk bën ky bllok: fëmija vdes me skriptin, sepse një pty nuk është mekanizëm shkëputjeje dhe disown është një komandë e brendshme e shell-it që nuk arrin te një proces që skripti juaj krijoi.
Kontrolli 3: a ka hyrje jo-interaktive të mbështetur?
Gërvishtja e ekranit prishet me përditësimet e klientit, prandaj kërkoni fillimisht një opsion të dokumentuar.
Shikoni daljen e ndihmës për një opsion tokeni ose kodi njëpërdorimësh, dhe kontrolloni nëse shërbimi e pranon kodin e shtuar në fushën e fjalëkalimit. Kur klienti lexon një skedar kredencialesh, jepini skedarin në vend të një kërkese:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Zëvendësimi i proceseve i jep klientit një shteg të lexueshëm në sistemet që ofrojnë /dev/fd. Sekreti mbetet sekret nga këndvështrimi i klientit, prandaj mbajeni jashtë regjistrave, historisë së shell-it dhe listave të proceseve. Nëse klienti e refuzon /dev/fd ose e hap shtegun e kredencialeve më shumë se një herë, shkruani një skedar të vërtetë me leje të rrepta dhe fshijeni në të njëjtin skript.
Kontrolli 4: a do t'i mbijetojë tuneli skriptit?
Si parazgjedhje tuneli vdes me prindin e vet, që është e kundërta e asaj që i duhet një skripti nisjeje.
disown -h ndihmon vetëm kur klientin e keni nisur si punë të shell-it, sepse redakton tabelën e punëve të atij shell-i dhe nuk arrin te një proces që skripti juaj nisi përmes një pty. Një menaxher shërbimesh është shtëpia më e mirë për gjithçka që duhet të rilidhet pa mbikëqyrje, sepse e rinis klientin dhe regjistron përse vdiq. Në çdo rast, prisni një kod të ri pas çdo rilidhjeje: një token njëpërdorimësh konsumohet nga vërtetimi i parë i suksesshëm.
Vini re çfarë bën sudo me sekuencën. Kërkesa për fjalëkalim e sudo nuk është kërkesa e VPN, dhe t'i përgjigjesh asaj me fjalëkalimin e VPN është mënyra më e zakonshme që një rend pritjesh ndryshe i saktë dështon gjithsesi.
Kontrolli 5: a duhet të jetë kodi i një personi në një skript?
Ky është kontrolli që njerëzit e kapërcejnë. Një token i takon një personi, ndërsa një tunel që duhet të ngrihet sipas një orari i takon makinës.
Nëse një punë duhet të rilidhet pa mbikëqyrje, pyesni nëse një certifikatë makine ose një llogari shërbimi mund të zëvendësojë hyrjen interaktive. Automatizimi i kodit njëpërdorimësh të dikujt e kthen një faktor të dytë në një sekret të ruajtur, që është ndryshim politike dhe jo lehtësi skriptimi. Kur shërbimi i mbështet të dyja, zgjidhni kredencialin që përputhet me mënyrën se si puna funksionon në të vërtetë. Shkruajeni përgjigjen, sepse personi tjetër do të pyesë përse skripti mban një token.
Si duket një skript që funksionon
Skripti shtyp hapin ku arriti, kurrë sekretin, dhe del me një kod jo zero në çdo pritje të dështuar.
Provoni duke e prishur me qëllim: fjalëkalim i gabuar, grup i gabuar, token i skaduar. Çdo dështim duhet të ndalet në një hap të emërtuar në vend që të ngecë. Pastaj ekzekutoni një herë kundër shërbimit të vërtetë dhe kontrolloni tunelin nga jashtë skriptit, jo nga brenda.