Cisco Secure Client-innlogging frå eit Linux-skal utan det grafiske grensesnittet
Eit here-dokument er ikkje ein innloggingsprotokoll. Skriv ned den verkelege rekkjefølgja på spørsmåla, bruk expect når ho varierer, og hald passordet utanfor argv og historikk.
Trua er at eit here-dokument med fire linjer er ei fullstendig ikkje-interaktiv innlogging, og ho held heilt til gatewayen tilbyr to grupper, skriv ut eit banner eller ber om eit token etter passordet. Då skriv det same skriptet passordet inn i ei meny som venta eit tal. Kommandolinjeklienten på Linux kan skriptast, men berre viss du gjev han det han faktisk ventar på, og ikkje det rettleiinga antok.
Det faste here-dokumentet er ein myte
Linux-klienten til Cisco installerer eit lite program på /opt/cisco/anyconnect/bin/vpn, og Secure Client 5 leverer det framleis. Medan tenesta vpnagentd køyrer, les flagget -s svar frå standard inn og i den rekkjefølgja klienten ber om dei. Den rekkjefølgja er ikkje fast mellom tenarar.
Ei gruppemeny legg til éi linje. Eit innloggingsbanner legg til ei anna. Eit token-spørsmål etter passordet øydelegg eit skript med fire linjer heilt, fordi den femte linja aldri skulle vera tokenet. Feilen er stille: klienten får feil streng, tilkoplingsforsøket tek slutt, og skriptet rapporterer ingenting nyttig.
Køyr klienten for hand éin gong mot same gateway og versjon, og skriv ned spørsmåla i den rekkjefølgja dei kjem. Den utskrifta er spesifikasjonen skriptet ditt må oppfylle.
Kva klienten ventar på
I det vanlege tilfellet med éi gruppe er rekkjefølgja brukarnamn, passord og stundom ei bannerstadfesting. Den første linja i eit here-dokument vert berre ein menyindeks når tenaren faktisk viser ei meny, og difor verkar det same skriptet på éin stad og feilar på den 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 moglege spørsmål, ikkje som ein fast protokoll. Nulltalet er eit menyval, ikkje eit passord, og den avsluttande y-en godtek eit banner som mange gatewayar aldri sender.
Bruk expect når rekkjefølgja ikkje er føreseieleg
Når rekkjefølgja på spørsmåla varierer, slutt å telje linjer og vent på spørsmålet i staden. Eit expect-skript startar connect-kommandoen, ventar på brukarnamnspørsmålet, sender, ventar på passordspørsmålet, sender, og ventar så på tilkopla tilstand. Kvar venting har sin eigen tidsfrist.
Behandla ein tidsfrist som ein feil og avslutt. Eit skript som held fram med å sende inn data etter eit uventa spørsmål, vil gjerne skrive passordet inn i eit skal, ei meny eller kva anna som tilfeldigvis les. Slik vert eit innloggingsskript ein hending.
Expect gjev deg òg ei utskrift du kan logge med hemmelegheita fjerna, og ho er meir verd enn utgangskoden når ein gateway endrar spørsmåla sine etter ei oppgradering.
Hemmelegheita må bu ein stad
Kvar versjon av dette problemet har éi svakheit: passordet må finnast i ei form klienten kan lese. Å sende det som argument eksponerer det i prosesstabellen. Å ekko det gjennom eit røyr set det ofte i skalthistorikken. Begge kan lesast av andre lokale brukarar på ein 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
Ei fil med modus 600 som kontoen eig er minimumet, og ho er framleis ei hemmelegheit i klartekst på disken. secret-tool lookup les frå Linux-nøkkelringen, og på macOS gjer security find-generic-password -w same jobben. Der organisasjonen støttar sertifikat- eller SAML-autentisering, føretrekk det, fordi eit lagra passord pluss MFA framleis ikkje kan fullføre ei innlogging utan eit menneske.
Stadfest tunnelen, og ta så over nedkoplinga
Ikkje stol på at feilteksten manglar. Spør klienten om tilstanden og sjekk grensesnittet sjølvstendig:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Tilstanden skal lese Connected, og eit tunngrensesnitt skal ha ei adresse. Be så om éin ressurs tunnelen skal nå, fordi ein tilkopla tilstand utan rute er eit reelt utfall og lett å oversjå.
Kople frå med vpn disconnect, og lat skriptet som starta tunnelen ta over nedkoplinga. Eit mislukka arbeid som lèt ei økt stå open, brukar ein lisensplass og ser ut som eit autentiseringsproblem for den neste som prøver.
Rekkjefølgje for arbeidet: stadfest vpnagentd, skriv ned den verkelege rekkjefølgja på spørsmåla, vel here-dokument eller expect, hald hemmelegheita utanfor argv og historikk, verifiser tilstand og éin ressurs, og kople så frå i det same skriptet.