Inici de sessió a Cisco Secure Client des d’un shell de Linux, sense la GUI
Un here-document no és un protocol d’inici de sessió. Anoteu l’ordre real dels avisos, feu servir expect quan variï i mantingueu la contrasenya fora d’argv i de l’historial.
Es creu que un here-document amb quatre línies és un inici de sessió no interactiu complet, i aquesta creença aguanta fins que la passarel·la ofereix dos grups, imprimeix un banner o demana un token després de la contrasenya. Llavors el mateix script escriu la contrasenya en un menú que esperava un número. El client de línia d’ordres de Linux es pot programar, però només si li doneu allò que realment espera i no allò que el tutorial suposava.
El here-document fix és un mite
El client Linux de Cisco instal·la un petit programa a /opt/cisco/anyconnect/bin/vpn, i Secure Client 5 encara el distribueix. Amb el servei vpnagentd en marxa, el flag -s llegeix les respostes de l’entrada estàndard en l’ordre en què el client les demana. Aquest ordre no és fix entre servidors.
Un menú de grup afegeix una línia. Un banner d’inici de sessió n’afegeix una altra. Una petició de token després de la contrasenya trenca del tot un script de quatre línies, perquè la cinquena línia no havia de ser mai el token. La fallada és silenciosa: el client rep la cadena equivocada, l’intent de connexió acaba i el script no informa de res útil.
Executeu el client a mà una vegada contra la mateixa passarel·la i versió, i anoteu els avisos en l’ordre en què apareixen. Aquesta transcripció és l’especificació que el vostre script ha de complir.
Què espera el client
En el cas habitual d’un sol grup, la seqüència és nom d’usuari, contrasenya i de vegades una confirmació de banner. La primera línia d’un here-document només es converteix en un índex de menú quan el servidor presenta realment un menú, i per això el mateix script funciona en un lloc i falla en el següent.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Llegiu-ho com a quatre respostes a quatre preguntes possibles, no com un protocol fix. El zero és una selecció de menú, no una contrasenya, i la y final accepta un banner que moltes passarel·les no envien mai.
Feu servir expect quan l’ordre no és previsible
Quan l’ordre dels avisos varia, deixeu de comptar línies i espereu l’avís. Un script expect llança l’ordre connect, espera l’avís de nom d’usuari, envia, espera l’avís de contrasenya, envia i després espera l’estat connectat. Cada espera té el seu propi temps d’espera.
Tracteu un temps d’espera esgotat com una fallada i sortiu. Un script que continua enviant entrada després d’un avís inesperat escriurà alegrement la contrasenya en un shell, en un menú o en qualsevol altra cosa que estigui llegint. Així és com un script d’inici de sessió es converteix en un incident.
expect també us dona una transcripció que podeu registrar amb el secret eliminat, i val més que el codi de sortida quan una passarel·la canvia els avisos després d’una actualització.
El secret ha de viure en algun lloc
Cada versió d’aquest problema comparteix una feblesa: la contrasenya ha d’existir en una forma que el client pugui llegir. Passar-la com a argument l’exposa a la taula de processos. Fer-la passar per una canonada sovint la posa a l’historial del shell. Totes dues coses són llegibles per altres usuaris locals en un amfitrió de salt compartit.
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Un fitxer amb mode 600 propietat del compte és el mínim, i encara és un secret en text pla al disc. secret-tool lookup llegeix de l’anell de claus de Linux, i a macOS la mateixa feina la fa security find-generic-password -w. On l’organització admet autenticació per certificat o SAML, preferiu-la, perquè una contrasenya desada més MFA encara no pot completar un inici de sessió sense una persona.
Confirmeu el túnel i després feu-vos càrrec del tancament
No confieu en l’absència de text d’error. Demaneu l’estat al client i comproveu la interfície per separat:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
L’estat hauria de dir Connected, i una interfície de túnel hauria de tenir una adreça. Després demaneu un recurs que el túnel hagi d’assolir, perquè un estat connectat sense ruta és un resultat real i fàcil de passar per alt.
Desconnecteu amb vpn disconnect i deixeu que el script que va iniciar el túnel s’encarregui del tancament. Una feina fallida que deixa una sessió oberta consumeix una plaça de llicència i sembla un problema d’autenticació a la propera persona que ho prova.
Ordre de treball: confirmeu vpnagentd, captureu l’ordre real dels avisos, trieu here-document o expect, manteniu el secret fora d’argv i de l’historial, verifiqueu l’estat i un recurs, i desconnecteu al mateix script.