AnyConnect su Linux: mettere in sicurezza lo scripting della sequenza di accesso
Il binario vpn di Cisco AnyConnect legge le risposte da stdin, e questo basta per un accesso ripetibile. Costruisci la sequenza, proteggi il file, verifica e fermati.
Il client vpn che arriva con Cisco AnyConnect si comporta come una conversazione: stampa un prompt, attende una riga, poi stampa il successivo. Se alimenti quella conversazione da un file o da una pipe, lo stesso binario gira senza sorveglianza. La tecnica è un solo reindirizzamento più un elenco ordinato di risposte, ed è l’elenco, non il reindirizzamento, a decidere se lo script è affidabile.
Due cose lo rompono in pratica. L’ordine dei prompt cambia quando un gateway chiede qualcosa in più, e una password memorizzata trasforma un errore di battitura in un blocco dell’account. Tratta la sequenza come dati versionati che puoi confrontare dopo ogni modifica del gateway. Fallisci in modo rumoroso invece di riprovare, perché il ciclo è esattamente il modo in cui una password digitata male diventa un account bloccato.
Una sequenza, nell’ordine in cui il client chiede
Esegui il client in modo interattivo una volta e annota ogni prompt nell’ordine in cui compare. Quella trascrizione diventa il file delle risposte. Quando reindirizzi il file nel binario, la prima riga deve essere il comando di connessione stesso, ed è per questo che la sequenza inizia con un nome host invece che con un nome utente.
connect vpn.example.com
0
<username>
<password>
y
exit
Il 0 nudo seleziona il primo profilo di connessione quando il gateway offre un elenco; usa l’indice che stampa il tuo gateway. Il y accetta un banner di accesso, quindi cancella quella riga se non c’è banner e inseriscine una dove il tuo gateway pone una domanda aggiuntiva. Il exit finale è ciò che permette al client di terminare in modo pulito quando l’ultima risposta è stata consumata.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
La modalità non interattiva qui non è opzionale. Senza -s il client può prendere il terminale e ignorare l’input reindirizzato; con essa le risposte vengono lette dallo stream e il processo ritorna. Dove il binario richiede privilegi elevati, avvolgi la chiamata in sudo -n perché lo script fallisca subito invece di bloccarsi su una richiesta di password.
Dove il file delle risposte perde
Un file che contiene una password è una credenziale, quindi dagli i permessi di una: modalità 600, di proprietà dell’account che esegue il lavoro, e mai dentro una directory condivisa o sincronizzata. Crealo con la modalità già applicata invece di correggerlo dopo, perché un file è brevemente leggibile da tutti tra la scrittura e il chmod.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
L’altra metà è argv. Una password passata come argomento è visibile a ogni utente locale che elenca i processi, e finisce anche nella cronologia della shell. Leggila invece da un descrittore di file o da una variabile d’ambiente, e metti il payload tra virgolette perché la shell non possa espandere nulla al suo interno.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Attenzione al quoting. Tra virgolette doppie una password che contiene ! può essere espansa da una shell interattiva prima ancora che il client la veda, e l’errore arriva come un generico event-not-found che sembra un problema di protocollo.
Dimostra il tunnel, poi chiudilo
Uno stato connesso dimostra solo che il client crede di avere una sessione. Scegli un host che risponde solo dall’interno della rete aziendale e provalo una volta prima di fare qualsiasi altra cosa. Un errore lì è un guasto di routing o di policy, e rieseguire l’accesso non lo cambierà.
/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
Controlla l’output di stato prima e dopo la disconnessione. Un client lasciato con una sessione obsoleta può rifiutare la connessione successiva mentre lo script riporta ancora successo, e questa modalità di guasto è invisibile se guardi solo i codici di uscita. Confronta le due letture invece di fidarti della seconda da sola. Gli alias in un profilo della shell bastano per l’uso quotidiano, mentre qualsiasi cosa pianificata merita la stessa revisione di credenziali e identità di qualsiasi altro lavoro senza sorveglianza.
Quando un elenco fisso smette di essere sicuro
Un file delle risposte codifica l’ordine dei prompt di oggi. Un banner cambiato, un cambio password forzato o una sfida a secondo fattore lo trasformano in un ciclo che può bloccare l’account, ed è per questo che lo script deve uscire alla prima risposta inattesa invece di riavviarsi.
Cattura ciò che il client ha stampato, restituisci uno stato diverso da zero e lascia decidere al chiamante. Dove il gateway esige un secondo fattore, la risposta onesta è che un accesso senza sorveglianza non è disponibile per quel profilo, non che la sequenza ha bisogno di un’altra riga.
La rotazione appartiene alla stessa revisione. Se la credenziale è memorizzata, decidi chi può leggerla, quando cambia e cosa la rimuove quando l’host viene ricostruito. Uno script che funziona per un anno perché nessuno ha toccato la password non è un progetto, è un incidente in attesa di una politica di rotazione.
Profili che non sono AnyConnect
Due stili di credenziali Cisco più vecchi vengono confusi con questo. Un profilo vpnc chiede un IPSec ID, che in realtà è il nome del gruppo, poi un segreto di gruppo, poi le tue credenziali, e tutti e tre arrivano da chi gestisce il gateway. Il Cisco IPsec storico è un protocollo diverso da AnyConnect, quindi vpnc non può raggiungere un servizio solo AnyConnect; openconnect --protocol=anyconnect è il client aperto per quel lavoro.
Un file .pcf descrive il profilo del client più vecchio. L’host, il nome del gruppo e la password di gruppo che contiene possono essere reinseriti a mano in un client che parla Cisco IPsec, anche se il file non è un import universale e qualsiasi porta o modalità di tunneling non predefinita di solito sparisce nel trasferimento.
Parti da ciò che il gateway offre davvero, poi scegli il client che parla quel protocollo. Copiare un profilo da un altro sito è il modo in cui le persone finiscono per fare debug di credenziali che non sono mai state il problema.