Die oortuiging is dat ’n here-dokument met vier reëls ’n volledige nie-interaktiewe aanmelding is, en dit hou stand totdat die poort twee groepe bied, ’n banier druk of ná die wagwoord om ’n token vra. Dan tik dieselfde skrip die wagwoord in ’n kieslys wat ’n nommer verwag het. Die opdragreël-kliënt op Linux is skripbaar, maar net as jy dit gee waarvoor dit werklik wag, eerder as wat die handleiding aangeneem het.

Die vaste here-dokument is ’n mite

Cisco se Linux-kliënt installeer ’n klein program by /opt/cisco/anyconnect/bin/vpn, en Secure Client 5 lewer dit steeds. Terwyl die vpnagentd-diens loop, lees die -s-vlag antwoorde van standaardinvoer in die orde waarin die kliënt dit vra. Daardie orde is nie vas tussen bedieners nie.

’n Groepkieslys voeg een reël by. ’n Aanmeldbanier voeg nog een by. ’n Token-navraag ná die wagwoord breek ’n skrip van vier reëls heeltemal, want die vyfde reël sou nooit die token wees nie. Die fout is stil: die kliënt kry die verkeerde string, die verbindingspoging eindig, en die skrip rapporteer niks bruikbaars nie.

Hardloop die kliënt een keer met die hand teen dieselfde poort en weergawe, en skryf die prompts neer in die orde waarin hulle verskyn. Daardie transkripsie is die spesifikasie waaraan jou skrip moet voldoen.

Waarvoor die kliënt wag

In die algemene geval met een groep is die volgorde gebruikersnaam, wagwoord en soms ’n banierbevestiging. Die eerste reël van ’n here-dokument word net ’n kieslysindeks wanneer die bediener werklik ’n kieslys wys, en daarom werk dieselfde skrip by een site en misluk by die volgende.

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

Lees dit as vier antwoorde op vier moontlike vrae, nie as ’n vaste protokol nie. Die nul is ’n kieslyskeuse, nie ’n wagwoord nie, en die y aan die einde aanvaar ’n banier wat baie poorte nooit stuur nie.

Gebruik expect wanneer die orde nie voorspelbaar is nie

Wanneer die promptorde wissel, hou op om reëls te tel en wag eerder vir die prompt. ’n Expect-skrip begin die connect-opdrag, wag vir die gebruikersnaam-prompt, stuur, wag vir die wagwoord-prompt, stuur, en wag dan vir die verbinde toestand. Elke wag het sy eie tydsverloop.

Behandel ’n tydsverloop as ’n fout en stop. ’n Skrip wat aanhou invoer stuur ná ’n onverwagte prompt, sal die wagwoord geredelik in ’n dop, ’n kieslys of wat ook al toevallig lees, intik. Dis hoe ’n aanmeldskrip ’n voorval word.

Expect gee jou ook ’n transkripsie wat jy kan log met die geheim verwyder, en dit is meer werd as die uittreekode wanneer ’n poort sy prompts ná ’n opgradering verander.

Die geheim moet iewers woon

Elke weergawe van hierdie probleem het een swakheid: die wagwoord moet bestaan in ’n vorm wat die kliënt kan lees. Om dit as argument te stuur, stel dit in die prosestabel bloot. Om dit deur ’n pyp te eggo, sit dit dikwels in die dopgeskiedenis. Beide is leesbaar vir ander plaaslike gebruikers op ’n gedeelde spronggasheer.

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

’n Lêer met modus 600 wat deur die rekening besit word, is die minimum, en dit is steeds ’n gewone teksgeheim op skyf. secret-tool lookup lees uit die Linux-sleutelring, en op macOS doen security find-generic-password -w dieselfde werk. Waar die organisasie sertifikaat- of SAML-verifikasie ondersteun, verkies dit, want ’n gestoorde wagwoord plus MFA kan steeds nie ’n aanmelding voltooi sonder ’n mens nie.

Bevestig die tonnel, en eien dan die afbreek

Moenie die afwesigheid van foutteks vertrou nie. Vra die kliënt na sy toestand en kontroleer die koppelvlak onafhanklik:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

Die toestand behoort Connected te lees, en ’n tonnelkoppelvlak behoort ’n adres te hê. Vra dan een hulpbron wat die tonnel veronderstel is om te bereik, want ’n verbinde toestand sonder ’n roete is ’n werklike uitkoms en maklik om mis te kyk.

Koppel af met vpn disconnect, en laat die skrip wat die tonnel begin het, die afbreek eien. ’n Mislukte werk wat ’n sessie oop laat, verbruik ’n lisensiesitplek en lyk soos ’n verifikasieprobleem vir die volgende persoon wat probeer.

Werkorde: bevestig vpnagentd, teken die werklike promptorde op, kies here-dokument of expect, hou die geheim uit argv en geskiedenis, verifieer toestand en een hulpbron, koppel dan af in dieselfde skrip.

Verwante artikels