Prijava v Cisco Secure Client iz lupine Linux brez grafičnega vmesnika
Here-dokument ni prijavni protokol. Zapišite dejanski vrstni red pozivov, uporabite expect, ko se spreminja, in hranite geslo zunaj argv in zgodovine.
Prepričanje je, da je here-dokument s štirimi vrsticami popolna neinteraktivna prijava, in drži točno do takrat, ko prehod ponudi dve skupini, natisne pasico ali po geslu zahteva žeton. Takrat ista skripta vpiše geslo v meni, ki je pričakoval številko. Odjemalec ukazne vrstice v Linuxu je mogoče skriptirati, a le če mu daste tisto, kar zares čaka, in ne tistega, kar je predvideval priročnik.
Fiksni here-dokument je mit
Odjemalec Cisco za Linux namesti majhen program v /opt/cisco/anyconnect/bin/vpn, in Secure Client 5 ga še vedno dobavlja. Dokler storitev vpnagentd teče, stikalo -s bere odgovore s standardnega vhoda v vrstnem redu, v katerem jih odjemalec zahteva. Ta vrstni red med strežniki ni fiksen.
Meni skupin doda eno vrstico. Prijavna pasica doda še eno. Zahteva za žeton po geslu popolnoma zlomi skripto s štirimi vrsticami, ker peta vrstica nikoli ni bila mišljena kot žeton. Napaka je tiha: odjemalec prejme napačen niz, poskus povezave se konča, skripta pa ne sporoči nič uporabnega.
Zaženite odjemalca enkrat ročno proti istemu prehodu in različici ter zapišite pozive v vrstnem redu pojavljanja. Ta zapis je specifikacija, ki jo mora vaša skripta izpolniti.
Kaj odjemalec čaka
V običajnem primeru ene skupine je zaporedje uporabniško ime, geslo in včasih potrditev pasice. Prva vrstica here-dokumenta postane indeks menija le, ko strežnik res pokaže meni, zato ista skripta deluje na enem mestu in odpove na naslednjem.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Berite to kot štiri odgovore na štiri možna vprašanja, ne kot fiksen protokol. Ničla je izbira v meniju, ne geslo, in končni y sprejme pasico, ki je mnogi prehodi nikoli ne pošljejo.
Uporabite expect, ko vrstni red ni predvidljiv
Ko se vrstni red pozivov spreminja, prenehajte šteti vrstice in namesto tega počakajte na poziv. Skripta expect zažene ukaz connect, počaka na poziv za uporabniško ime, pošlje, počaka na poziv za geslo, pošlje in nato počaka na stanje povezave. Vsako čakanje ima svoj časovni limit.
Časovni limit obravnavajte kot napako in izstopite. Skripta, ki po nepričakovanem pozivu še naprej pošilja vhod, bo z veseljem vtipkala geslo v lupino, meni ali karkoli drugega, kar bere. Tako prijavna skripta postane incident.
Expect vam da tudi zapis, ki ga lahko zabeležite z odstranjeno skrivnostjo, in to je vredno več od izhodne kode, ko prehod po nadgradnji spremeni svoje pozive.
Skrivnost mora nekje živeti
Vsaka različica te težave ima eno slabost: geslo mora obstajati v obliki, ki jo odjemalec lahko prebere. Če ga podate kot argument, ga izpostavite v tabeli procesov. Če ga izpišete skozi cev, pogosto pristane v zgodovini lupine. Oboje lahko berejo drugi lokalni uporabniki na skupnem preskočnem gostitelju.
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Datoteka z načinom 600, ki je v lasti računa, je minimum, in je še vedno skrivnost v čistem besedilu na disku. secret-tool lookup bere iz linuxove shrambe ključev, na macOS pa isto delo opravi security find-generic-password -w. Kjer organizacija podpira overjanje s potrdilom ali SAML, mu dajte prednost, ker shranjeno geslo in MFA še vedno ne moreta dokončati prijave brez človeka.
Potrdite tunel in nato prevzemite prekinitev
Ne zaupajte odsotnosti besedila napake. Vprašajte odjemalca za stanje in vmesnik preverite neodvisno:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Stanje bi moralo brati Connected, tunelski vmesnik pa bi moral imeti naslov. Nato zahtevajte en vir, ki naj bi ga tunel dosegel, ker je povezano stanje brez poti resničen izid in ga je lahko spregledati.
Prekinite z vpn disconnect in pustite skripti, ki je zagnala tunel, da prevzame prekinitev. Neuspešno opravilo, ki pusti sejo odprto, porabi licenčno mesto in naslednjemu, ki poskusi, izgleda kot težava z overjanjem.
Vrstni red dela: potrdite vpnagentd, zapišite dejanski vrstni red pozivov, izberite here-dokument ali expect, hranite skrivnost zunaj argv in zgodovine, preverite stanje in en vir, nato se prekinite v isti skripti.