El client vpn que ve amb Cisco AnyConnect es comporta com una conversa: escriu un missatge, espera una línia i després escriu el següent. Si introduïu aquesta conversa des d'un fitxer o una canonada, el mateix binari s'executa sense supervisió. La tècnica és una redirecció més una llista ordenada de respostes, i és la llista, no la redirecció, la que decideix si el script és fiable.

Dues coses ho trenquen a la pràctica. L'ordre dels missatges canvia quan una passarel·la demana alguna cosa extra, i una contrasenya emmagatzemada converteix una errada d'escriptura en un bloqueig del compte. Tracteu la seqüència com a dades versionades que podeu comparar després de qualsevol canvi a la passarel·la. Fallau sorollosament en lloc de reintentar, perquè un bucle és exactament com una contrasenya mal escrita es converteix en un compte bloquejat.

Una seqüència, en l'ordre en què el client pregunta

Executeu el client interactivament una vegada i anoteu cada missatge en l'ordre en què apareix. Aquesta transcripció es converteix en el fitxer de respostes. Quan redirigiu el fitxer cap al binari, la primera línia ha de ser la mateixa ordre de connexió, i per això la seqüència comença amb un nom d'amfitrió en lloc d'un nom d'usuari.

connect vpn.example.com
0
<username>
<password>
y
exit

El 0 nu selecciona el primer perfil de connexió quan la passarel·la ofereix una llista; feu servir l'índex que imprimeixi la vostra passarel·la. El y accepta un bàner d'inici de sessió, així que suprimiu aquella línia si no hi ha bàner i inseriu-ne una allà on la vostra passarel·la faci una pregunta addicional. El exit final és el que permet al client acabar netament quan s'ha consumit l'última resposta.

/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt

El mode no interactiu aquí no és opcional. Sense -s el client pot prendre el terminal i ignorar l'entrada redirigida; amb ell, les respostes es llegeixen del flux i el procés retorna. On el binari necessita privilegis elevats, emboliqueu la invocació amb sudo -n perquè el script falli immediatament en lloc de bloquejar-se en una petició de contrasenya.

On es filtra el fitxer de respostes

Un fitxer que conté una contrasenya és una credencial, així que doneu-li els permisos d'una: mode 600, propietat del compte que executa la feina, i mai dins d'un directori compartit o sincronitzat. Creeu-lo amb el mode ja aplicat en lloc d'arreglar-lo després, perquè un fitxer és breument llegible per tothom entre l'escriptura i el chmod.

install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config

L'altra meitat és argv. Una contrasenya passada com a argument és visible per a cada usuari local que llisti processos, i també acaba a l'historial del shell. Llegiu-la d'un descriptor de fitxer o d'una variable d'entorn en lloc d'això, i poseu la càrrega entre cometes perquè el shell no pugui expandir res al seu interior.

printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
  | sudo -n /opt/cisco/anyconnect/bin/vpn -s

Vigileu les cometes. Dins de cometes dobles, una contrasenya que contingui ! pot ser expandida per un shell interactiu abans que el client la vegi, i la fallada arriba com un error genèric event-not-found que sembla un problema de protocol.

Demostreu el túnel, després tanqueu-lo

Un estat connectat només demostra que el client creu que té una sessió. Trieu un amfitrió que només respongui des de dins de la xarxa corporativa i proveu-lo una vegada abans de fer qualsevol altra cosa. Una fallada allà és un error d'encaminament o de política, i tornar a executar l'inici de sessió no ho canviarà.

/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect

Comproveu la sortida d'estat abans i després de la desconnexió. Un client que es queda amb una sessió obsoleta pot refusar la connexió següent mentre el script encara informa d'èxit, i aquest mode de fallada és invisible si només mireu els codis de sortida. Compareu les dues lectures en lloc de confiar en la segona tota sola. Els àlies en un perfil de shell són suficients per a l'ús diari, mentre que qualsevol cosa programada mereix la mateixa revisió de credencials i identitat que qualsevol altra feina sense supervisió.

Quan una llista fixa deixa de ser segura

Un fitxer de respostes codifica l'ordre de missatges d'avui. Un bàner canviat, un canvi de contrasenya forçat o un repte de segon factor el converteixen en un bucle que pot bloquejar el compte, i per això el script ha de sortir a la primera resposta inesperada en lloc de reiniciar-se.

Captureu què ha imprès el client, retorneu un estat diferent de zero i deixeu que qui crida decideixi. On la passarel·la exigeix un segon factor, la resposta honesta és que un inici de sessió sense supervisió no està disponible per a aquest perfil, no que la seqüència necessiti una línia més.

La rotació pertany a la mateixa revisió. Si la credencial s'emmagatzema, decidiu qui la pot llegir, quan canvia i què l'elimina quan es reconstrueix l'amfitrió. Un script que funciona durant un any perquè ningú no ha tocat la contrasenya no és un disseny, sinó un accident que espera una política de rotació.

Perfils que no són AnyConnect

Dos estils de credencials Cisco més antics es confonen amb aquest. Un perfil vpnc demana un IPSec ID, que en realitat és el nom del grup, després un secret de grup, després les vostres pròpies credencials, i els tres provenen de qui gestiona la passarel·la. El Cisco IPsec heretat és un protocol diferent d'AnyConnect, així que vpnc no pot arribar a un servei només AnyConnect; openconnect --protocol=anyconnect és el client obert per a aquesta feina.

Un fitxer .pcf descriu el perfil de client més antic. L'amfitrió, el nom del grup i la contrasenya de grup que hi ha a dins es poden tornar a introduir a mà en un client que parli Cisco IPsec, tot i que el fitxer no és una importació universal i qualsevol port o mode de tunelatge no predeterminat normalment desapareix en el trasllat.

Comenceu per allò que la passarel·la ofereix realment i després trieu el client que parla aquest protocol. Copiar un perfil d'un altre lloc és com la gent acaba depurant credencials que mai no eren el problema.

Articles relacionats