Hoe automatisearje jo in VPN-oanmelding dy't op in tokenkoade wachtet
In CLI-VPN-klant dy't yn in terminal freget, blokkearret in skript dat allinnich in wachtwurd troch in buis stjoert. Wurkje dizze fiif kontrôles troch foardat jo nei expect gripe.
In skript dat in VPN-klant fan in leveransier start, hinget oant de tiid ferstrykt, en it loch lit sjen dat de klant om in ferifikaasjekoade freget dy't nimmen yntype hat. It wachtwurd wie levere, dus de foar de hân lizzende konklúzje is dat it wachtwurd ferkeard is. Dat is it net. De koadefrege is in apart petear op in apart kanaal, en jo skript hat dat nea iepene.
Wurkje de fiif kontrôles hjirûnder yn folchoarder troch. Stop by de earste dy't misbeteart, want elke lettere stap ferûnderstelt dat de eardere jilde.
Kontrôle 1: lêst de klant wol standertynfier?
Test foardat jo automatisearring skriuwe: stjoer in dummy-geheim troch in buis nei de klant en sjoch wat der bart. As it syn frege printsje lit en dêrnei wachtet, lêst it de buis net.
In protte klanten iepenje it terminalapparaat direkt, of wegerje in geheim te nimmen fan in stream dy't gjin terminal is, sadat in ferdwaalde buis gjin wachtwurd lekke kin. OpenVPN is de dokumintearre útsûndering, omdat --auth-user-pass in bestânspaad nimt. Klanten fan leveransiers dy't om in ienmalige koade freegje, hawwe meastentiids gjin lykweardige flagge, en har frege wachtet op in terminal dy't jo skript nea levere.
Kontrôle 2: hat it bernproses in terminal?
In pty ken in terminal ta oan it bern, wat fregen omsette yn lêsbere útfier dêr't jo yn folchoarder op antwurdzje kinne.
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)De fregetekst hjirboppe is yllustratyf; kopiearje de krekte tekst dy't jo klant printsjet, ynklusyf haadletters en lêstekens. Eltse ferwachting hat in timeout, en in sletten bern smyt in útsûndering yn stee fan in status werom te jaan, dus wikselje de sekwinsje yn en behannelje ein fan bestân as in mislearring. Tink derom wat dit blok net docht: it bern stjert mei it skript, omdat in pty gjin losmeitsje-meganisme is en disown in ynboude skelopdracht is dy't in proses dat jo skript makke hat net berikke kin.
Kontrôle 3: is der in stipe net-ynteraktive ynfier?
Skermskraabjen brekt by klantfernijingen, dus sykje earst nei in dokumintearre flagge.
Besjoch de helpútfier foar in token- of ienmalige-koade-opsje, en besjoch oft de tsjinst de koade akseptearret dy't oan it wachtwurdfjild taheakke is. Wêr't de klant in referinsjebestân lêst, jout him it bestân yn stee fan in frege:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")Prosesferfanging jout de klant in lêsber paad op systemen dy't /dev/fd leverje. It geheim bliuwt in geheim út it eachpunt fan 'e klant, dus hâld it bûten lochs, skelhistoarje en proseslisten. As de klant /dev/fd wegeret of it referinsjepaad mear as ien kear iepenet, skriuw dan in echt bestân mei strange rjochten en wiskje it yn itselde skript.
Kontrôle 4: oerlibbet de tunnel it skript?
Standert stjert de tunnel mei syn âlder, wat it tsjinoerstelde is fan wat in opstartskript nedich hat.
disown -h helpt allinnich as jo de klant as skeltaak start hawwe, omdat it de taaktabel fan dy skel bewurket en in proses dat jo skript fia in pty makke hat net berikke kin. In tsjinstbehearder is it bettere thús foar alles dat sûnder tafersjoch opnij ferbine moat, omdat it de klant opnij start en fêstleit wêrom't er stoar. Yn alle gefallen, ferwachtsje in nije koade nei elke opnij ferbining: in ienmalich token wurdt brûkt troch de earste suksesfolle autentikaasje.
Sjoch wat sudo mei de sekwinsje docht. In sudo-wachtwurdfrege is net de frege fan 'e VPN, en der mei it VPN-wachtwurd op antwurdzje is de meast foarkommende manier wêrop in oars korrekte oarder fan ferwachtingen dochs misbeteart.
Kontrôle 5: moat de koade fan in persoan yn in skript stean?
Dit is de kontrôle dy't minsken oerslaan. In token heart by in persoan, wylst in tunnel dy't neffens in skema omheech moat by de masine heart.
As in taak sûnder tafersjoch opnij ferbine moat, freegje dan oft in masinesertifikaat of in tsjinstaccount de ynteraktive oanmelding ferfange kin. It automatisearjen fan immen syn ienmalige koade makket in twadde faktor ta in bewarre geheim, wat in beliedswiziging is en gjin gemak foar skripten. Wêr't de tsjinst beide stipet, kies de referinsje dy't past by hoe't de taak echt rint. Skriuw it antwurd op, want de folgjende persoan sil freegje wêrom't it skript in token hâldt.
Hoe't in wurkjend skript derút sjocht
It skript printsjet de stap dy't it berikt hat, nea it geheim, en giet derút mei in net-nul koade by elke mislearre ferwachting.
Test it troch it mei opsetsin te brekken: ferkeard wachtwurd, ferkearde groep, ferrûn token. Eltse mislearring soe by in neamde stap stopje moatte yn stee fan te hingjen. Rin it dan ien kear tsjin de echte tsjinst en kontrolearje de tunnel fan bûten it skript, net fan binnen.