Oppfatningen er at et here-dokument med fire linjer i seg er en fullstendig ikke-interaktiv innlogging, og den holder helt til gatewayen tilbyr to grupper, skriver ut et banner eller ber om et token etter passordet. Da skriver det samme skriptet passordet inn i en meny som ventet et tall. Kommandolinjeklienten på Linux kan skriptes, men bare hvis du gir den det den faktisk venter på, og ikke det veiledningen antok.

Det faste here-dokumentet er en myte

Ciscos Linux-klient installerer et lite program på /opt/cisco/anyconnect/bin/vpn, og Secure Client 5 leveres fortsatt med det. Når vpnagentd-tjenesten kjører, leser -s-flagget svar fra standard input i den rekkefølgen klienten ber om dem. Den rekkefølgen er ikke fast på tvers av servere.

En gruppemeny legger til én linje. Et innloggingsbanner legger til en annen. En token-forespørsel etter passordet ødelegger et skript med fire linjer fullstendig, fordi den femte linjen aldri skulle være tokenet. Feilen er stille: klienten mottar feil streng, tilkoblingsforsøket avsluttes, og skriptet rapporterer ingenting nyttig.

Kjør klienten for hånd én gang mot samme gateway og versjon, og skriv ned spørsmålene i den rekkefølgen de kommer. Den utskriften er spesifikasjonen skriptet ditt må oppfylle.

Hva klienten venter på

I det vanlige tilfellet med én gruppe er rekkefølgen brukernavn, passord og noen ganger en bannerbekreftelse. Den første linjen i et here-dokument blir bare en menyindeks når serveren faktisk viser en meny, og det er derfor det samme skriptet virker på ett sted og feiler på det neste.

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

Les det som fire svar på fire mulige spørsmål, ikke som en fast protokoll. Nulltallet er et menyvalg, ikke et passord, og den avsluttende y-en godtar et banner som mange gatewayer aldri sender.

Bruk expect når rekkefølgen ikke er forutsigbar

Når rekkefølgen på spørsmålene varierer, slutt å telle linjer og vent på spørsmålet i stedet. Et expect-skript starter connect-kommandoen, venter på brukernavnspørsmålet, sender, venter på passordspørsmålet, sender, og venter deretter på tilkoblet tilstand. Hver venting har sitt eget tidsavbrudd.

Behandle tidsavbrudd som feil og avslutt. Et skript som fortsetter å sende input etter et uventet spørsmål, vil gladelig skrive passordet inn i et skall, en meny eller hva som helst annet som tilfeldigvis leser. Det er slik et innloggingsskript blir en hendelse.

Expect gir deg også en utskrift du kan logge med hemmeligheten fjernet, og den er mer verdt enn utgangskoden når en gateway endrer spørsmålene sine etter en oppgradering.

Hemmeligheten må bo et sted

Hver versjon av dette problemet har én svakhet: passordet må finnes i en form klienten kan lese. Å sende det som argument eksponerer det i prosesstabellen. Å ekko det gjennom et rør legger det ofte i skallhistorikken. Begge er lesbare for andre lokale brukere på en delt hoppvert.

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

En fil med modus 600 eid av kontoen er minimumet, og den er fortsatt en hemmelighet i klartekst på disken. secret-tool lookup leser fra Linux-nøkkelringen, og på macOS gjør security find-generic-password -w samme jobb. Der organisasjonen støtter sertifikat- eller SAML-autentisering, foretrekk det, fordi et lagret passord pluss MFA fortsatt ikke kan fullføre en innlogging uten et menneske.

Bekreft tunnelen, og eie deretter nedkoblingen

Stol ikke på fraværet av feiltekst. Spør klienten om tilstanden og sjekk grensesnittet uavhengig:

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

Tilstanden skal vise Connected, og et tunngrensesnitt skal ha en adresse. Be deretter om én ressurs tunnelen skal nå, fordi en tilkoblet tilstand uten rute er et reelt utfall og lett å overse.

Koble fra med vpn disconnect, og la skriptet som startet tunnelen eie nedkoblingen. En mislykket jobb som lar en økt stå åpen, bruker opp en lisensplass og ser ut som et autentiseringsproblem for neste person som prøver.

Rekkefølge for arbeidet: bekreft vpnagentd, fang den faktiske rekkefølgen på spørsmålene, velg here-dokument eller expect, hold hemmeligheten utenfor argv og historikk, verifiser tilstand og én ressurs, og koble deretter fra i samme skript.

Relaterte artikler