vpn-klienten som følger med Cisco AnyConnect oppfører seg som en samtale: den skriver en prompt, venter på en linje og skriver så den neste. Fôr den samtalen inn fra en fil eller en pipe, og den samme binæren kjører uten tilsyn. Teknikken er én omdirigering pluss en ordnet liste med svar, og det er listen, ikke omdirigeringen, som avgjør om skriptet er pålitelig.

To ting ødelegger det i praksis. Rekkefølgen på promptene forskyves når en gateway spør om noe ekstra, og et lagret passord gjør én skrivefeil om til en kontolåsing. Behandle sekvensen som versjonerte data du kan sammenligne etter enhver gateway-endring. Feil høyt i stedet for å prøve på nytt, for en løkke er nettopp måten et feilskrevet passord blir en låst konto.

Én sekvens, i den rekkefølgen klienten spør

Kjør klienten interaktivt én gang og skriv ned hver prompt i den rekkefølgen den vises. Den transkripsjonen blir svarfilen. Når du omdirigerer filen inn i binæren, må den første linjen være selve tilkoblingskommandoen, derfor begynner sekvensen med et vertsnavn i stedet for et brukernavn.

connect vpn.example.com
0
<username>
<password>
y
exit

Den bare 0 velger den første tilkoblingsprofilen når gatewayen tilbyr en liste; bruk indeksen gatewayen din skriver ut. y godtar et påloggingsbanner, så slett den linjen hvis det ikke finnes noe banner, og sett inn en der gatewayen din stiller et tilleggsspørsmål. Den avsluttende exit er det som lar klienten avslutte rent når det siste svaret er brukt opp.

/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt

Ikke-interaktiv modus er ikke valgfri her. Uten -s kan klienten ta over terminalen og ignorere omdirigert inndata; med den leses svarene fra strømmen og prosessen returnerer. Der binæren trenger forhøyede rettigheter, pakk kallet inn i sudo -n slik at skriptet feiler med en gang i stedet for å blokkere på en passordforespørsel.

Der svarfilen lekker

En fil med et passord er en legitimasjon, så gi den rettighetene til en slik: modus 600, eid av kontoen som kjører jobben, og aldri inne i en delt eller synkronisert mappe. Lag den med modusen allerede brukt i stedet for å rette den etterpå, for en fil er et øyeblikk lesbar for alle mellom skrivingen og chmod.

install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config

Den andre halvdelen er argv. Et passord som sendes som argument, er synlig for hver lokal bruker som lister prosesser, og det havner også i skallhistorikken. Les det fra en fildeskriptor eller en miljøvariabel i stedet, og sett nyttelasten i hermetegn slik at skallet ikke kan utvide noe inni den.

printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
  | sudo -n /opt/cisco/anyconnect/bin/vpn -s

Følg med på hermetegnene. Inne i doble hermetegn kan et passord med ! bli utvidet av et interaktivt skall før klienten i det hele tatt ser det, og feilen kommer som en generell event-not-found-feil som ser ut som et protokollproblem.

Bevis tunnelen, lukk den så

En tilkoblet tilstand beviser bare at klienten tror den har en sesjon. Velg en vert som svarer bare innenfra bedriftsnettet, og test den én gang før du gjør noe annet. En feil der er en ruting- eller politikkfeil, og å kjøre påloggingen på nytt endrer ikke det.

/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect

Sjekk tilstandsutdata før og etter frakoblingen. En klient som blir stående med en gammel sesjon, kan nekte neste tilkobling mens skriptet fortsatt melder om suksess, og den feilmodusen er usynlig hvis du bare ser på utgangskoder. Sammenlign de to lesningene i stedet for å stole på den andre alene. Aliaser i en skallprofil er nok til daglig bruk, mens alt som er planlagt fortjener samme gjennomgang av legitimasjon og identitet som enhver annen jobb uten tilsyn.

Når en fast liste ikke lenger er trygg

En svarfil koder spørsmålsrekkefølgen i dag. Et endret banner, en påtvunget passordendring eller en utfordring om andre faktor gjør den til en løkke som kan låse kontoen, derfor må skriptet gå ut ved det første uventede svaret i stedet for å starte på nytt.

Fang det klienten skrev ut, returner en status som ikke er null, og la kalleren avgjøre. Der gatewayen krever en andre faktor, er det ærlige svaret at pålogging uten tilsyn ikke er tilgjengelig for den profilen, ikke at sekvensen trenger én linje til.

Rotasjon hører til samme gjennomgang. Hvis legitimasjonen lagres, avgjør hvem som kan lese den, når den endres og hva som fjerner den når verten bygges på nytt. Et skript som fungerer i et år fordi ingen har rørt passordet, er ikke et design, men en ulykke som venter på en rotasjonspolicy.

Profiler som ikke er AnyConnect

To eldre Cisco-stiler for legitimasjon blir blandet sammen med denne. En vpnc-profil spør om en IPSec ID, som egentlig er gruppenavnet, så en gruppehemmelighet, så dine egne legitimasjoner, og alle tre kommer fra den som driver gatewayen. Gammel Cisco IPsec er en annen protokoll enn AnyConnect, så vpnc kan ikke nå en tjeneste som bare er AnyConnect; openconnect --protocol=anyconnect er den åpne klienten for den jobben.

En .pcf-fil beskriver den eldre klientprofilen. Vertsnavnet, gruppenavnet og gruppepassordet i den kan tastes inn på nytt for hånd i en klient som snakker Cisco IPsec, selv om filen ikke er en universell import og enhver port eller tunnelmodus som ikke er standard, vanligvis forsvinner i overføringen.

Start med det gatewayen faktisk tilbyr, og velg så klienten som snakker den protokollen. Å kopiere en profil fra et annet sted er måten folk ender med å feilsøke legitimasjon som aldri var problemet.

Relaterte artikler