Log ind på Cisco Secure Client fra en Linux-skal uden GUI
Et here-document er ikke en loginprotokol. Skriv den faktiske rækkefølge af prompter ned, brug expect når den varierer, og hold adgangskoden ude af argv og historik.
Troen er, at et here-document med fire linjer i sig er et fuldstændigt ikke-interaktivt login, og den holder helt indtil gatewayen tilbyder to grupper, udskriver et banner eller beder om et token efter adgangskoden. Så skriver det samme script adgangskoden ind i en menu, der ventede et tal. Kommandolinjeklienten på Linux kan scriptes, men kun hvis du giver den det, den faktisk venter på, og ikke det, vejledningen antog.
Det faste here-document er en myte
Ciscos Linux-klient installerer et lille program på /opt/cisco/anyconnect/bin/vpn, og Secure Client 5 leverer det stadig. Når tjenesten vpnagentd kører, læser -s-flaget svar fra standard input i den rækkefølge, klienten beder om dem. Den rækkefølge er ikke fast på tværs af servere.
En gruppemenu tilføjer én linje. Et loginbanner tilføjer en til. En token-anmodning efter adgangskoden ødelægger et script med fire linjer helt, fordi den femte linje aldrig skulle være tokenet. Fejlen er stille: klienten modtager den forkerte streng, forbindelsesforsøget slutter, og scriptet rapporterer intet brugbart.
Kør klienten manuelt én gang mod samme gateway og version, og skriv prompterne ned i den rækkefølge, de kommer. Den udskrift er den specifikation, dit script skal opfylde.
Hvad klienten venter på
I det almindelige tilfælde med én gruppe er rækkefølgen brugernavn, adgangskode og nogle gange en bannerbekræftelse. Den første linje i et here-document bliver kun et menuindeks, når serveren faktisk viser en menu, og derfor virker det samme script ét sted og fejler det næste.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Læs det som fire svar på fire mulige spørgsmål, ikke som en fast protokol. Nullet er et menutvalg, ikke en adgangskode, og det afsluttende y accepterer et banner, som mange gateways aldrig sender.
Brug expect, når rækkefølgen ikke er forudsigelig
Når rækkefølgen af prompter varierer, stop med at tælle linjer og vent på prompten i stedet. Et expect-script starter connect-kommandoen, venter på brugernavnsprompten, sender, venter på adgangskodeprompten, sender og venter derefter på den tilsluttede tilstand. Hver ventetid har sin egen timeout.
Behandl en timeout som en fejl og afslut. Et script, der fortsætter med at sende input efter en uventet prompt, skriver gladeligt adgangskoden ind i en skal, en menu eller hvad som helst andet, der tilfældigvis læser. Sådan bliver et loginscript til en hændelse.
Expect giver dig også en udskrift, du kan logge med hemmeligheden fjernet, og den er mere værd end exitkoden, når en gateway ændrer sine prompter efter en opgradering.
Hemmeligheden skal bo et sted
Hver version af dette problem har én svaghed: adgangskoden skal findes i en form, klienten kan læse. Sendes den som argument, eksponeres den i procestabellen. Ekko gennem en pipeline sætter den ofte i skallhistorikken. Begge kan læses af andre lokale brugere på en delt springvært.
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 mode 600 ejet af kontoen er minimumet, og den er stadig en hemmelighed i klartekst på disken. secret-tool lookup læser fra Linux-nøgleringen, og på macOS gør security find-generic-password -w det samme arbejde. Hvor organisationen understøtter certifikat- eller SAML-godkendelse, foretræk det, fordi en gemt adgangskode plus MFA stadig ikke kan gennemføre et login uden et menneske.
Bekræft tunnelen, og tag derefter nedkoblingen
Stol ikke på fraværet af fejltekst. Spørg klienten om dens tilstand, og kontroller grænsefladen uafhængigt:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Tilstanden skal vise Connected, og en tunnelgrænseflade skal have en adresse. Bed derefter om én ressource, som tunnelen skal nå, fordi en tilsluttet tilstand uden rute er et reelt udfald og let at overse.
Afbryd med vpn disconnect, og lad scriptet, der startede tunnelen, tage nedkoblingen. Et mislykket job, der efterlader en session åben, bruger en licensplads og ser ud som et godkendelsesproblem for den næste, der prøver.
Arbejdsrækkefølge: bekræft vpnagentd, fang den faktiske rækkefølge af prompter, vælg here-document eller expect, hold hemmeligheden ude af argv og historik, verificér tilstand og én ressource, og afbryd derefter i samme script.