Prisijungimas prie Cisco Secure Client iš Linux apvalkalo, be GUI
Here-document nėra prisijungimo protokolas. Užsirašykite tikrąją užklausų tvarką, naudokite expect, kai ji kinta, ir laikykite slaptažodį už argv ir istorijos ribų.
Manoma, kad keturių eilučių here-document yra visiškas neinteraktyvus prisijungimas, ir šis įsitikinimas laikosi iki tol, kol vartai pasiūlo dvi grupes, atspausdina banerį arba po slaptažodžio paprašo tokeno. Tada tas pats scenarijus įrašo slaptažodį į meniu, kuris laukė skaičiaus. Linux komandinės eilutės klientą galima skriptuoti, bet tik jei duodate jam tai, ko jis iš tikrųjų laukia, o ne tai, ką numatė vadovas.
Fiksuotas here-document yra mitas
Cisco Linux klientas įdiegia nedidelę programą į /opt/cisco/anyconnect/bin/vpn, ir Secure Client 5 ją vis dar pateikia. Kai veikia vpnagentd paslauga, vėliavėlė -s skaito atsakymus iš standartinės įvesties ta tvarka, kuria klientas jų prašo. Ši tvarka tarp serverių nėra fiksuota.
Grupių meniu prideda vieną eilutę. Prisijungimo baneris prideda dar vieną. Tokeno prašymas po slaptažodžio visiškai sugriauna keturių eilučių scenarijų, nes penktoji eilutė niekada neturėjo būti tokenas. Gedimas tylus: klientas gauna neteisingą eilutę, prisijungimo bandymas baigiasi, o scenarijus nepraneša nieko naudingo.
Paleiskite klientą rankiniu būdu vieną kartą prie tų pačių vartų ir versijos, ir užsirašykite užklausas ta tvarka, kuria jos pasirodo. Ta išklotinė yra specifikacija, kurią jūsų scenarijus turi atitikti.
Ko laukia klientas
Įprastu vienos grupės atveju seka yra naudotojo vardas, slaptažodis ir kartais banerio patvirtinimas. Pirmoji here-document eilutė tampa meniu indeksu tik tada, kai serveris iš tikrųjų rodo meniu, todėl tas pats scenarijus veikia vienoje vietoje, o kitoje nepavyksta.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Skaitykite tai kaip keturis atsakymus į keturis galimus klausimus, o ne kaip fiksuotą protokolą. Nulis yra meniu pasirinkimas, ne slaptažodis, o paskutinis y priima banerį, kurio daugelis vartų niekada nesiunčia.
Naudokite expect, kai tvarka nenuspėjama
Kai užklausų tvarka kinta, nustokite skaičiuoti eilutes ir laukite užklausos. expect scenarijus paleidžia komandą connect, laukia naudotojo vardo užklausos, siunčia, laukia slaptažodžio užklausos, siunčia ir tada laukia prisijungusios būsenos. Kiekvienas laukimas turi savo laiko limitą.
Laiko limito pasibaigimą traktuokite kaip gedimą ir išeikite. Scenarijus, kuris ir toliau siunčia įvestį po netikėtos užklausos, mielai įrašys slaptažodį į apvalkalą, meniu ar bet ką kitą, kas tuo metu skaito. Taip prisijungimo scenarijus tampa incidentu.
expect taip pat duoda išklotinę, kurią galite registruoti be slaptos dalies, ir tai vertingiau už išėjimo kodą, kai vartai po atnaujinimo pakeičia savo užklausas.
Slaptažodis turi kažkur gyventi
Kiekviena šios problemos versija turi vieną silpnybę: slaptažodis turi egzistuoti tokia forma, kurią klientas gali perskaityti. Perdavimas kaip argumento atskleidžia jį procesų lentelėje. Perdavimas per vamzdį dažnai įrašo jį į apvalkalo istoriją. Abu gali perskaityti kiti vietiniai naudotojai bendrame šuolio hoste.
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Failas su 600 teisėmis, priklausantis paskyrai, yra minimumas, ir jis vis dar yra atviras slaptažodis diske. secret-tool lookup skaito iš Linux raktų raištelio, o macOS tą patį darbą atlieka security find-generic-password -w. Kur organizacija palaiko sertifikato arba SAML autentifikaciją, rinkitės ją, nes saugomas slaptažodis ir MFA kartu vis tiek negali užbaigti prisijungimo be žmogaus.
Patvirtinkite tunelį, tada prisiimkite uždarymą
Nepasikliaukite klaidos teksto nebuvimu. Paklauskite kliento apie jo būseną ir patikrinkite sąsają atskirai:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Būsena turėtų rodyti Connected, o tunelio sąsaja turėtų turėti adresą. Tada paprašykite vieno ištekliaus, kurį tunelis turėtų pasiekti, nes prisijungusi būsena be maršruto yra realus rezultatas ir lengvai nepastebimas.
Atsijunkite su vpn disconnect, ir leiskite scenarijui, kuris paleido tunelį, prisiimti uždarymą. Nepavykęs darbas, paliekantis sesiją atvirą, sunaudoja licencijos vietą ir kitam bandančiam atrodo kaip autentifikacijos problema.
Darbo tvarka: patvirtinkite vpnagentd, užfiksuokite tikrąją užklausų tvarką, pasirinkite here-document arba expect, laikykite slaptažodį už argv ir istorijos ribų, patikrinkite būseną ir vieną išteklį, tada atsijunkite tame pačiame scenarijuje.