Het script eindigt met nul, de tunnel verschijnt en de volgende run wordt geweigerd voordat er ooit om een wachtwoord wordt gevraagd. Of hetzelfde commando werkt in een terminal en faalt vanuit een geplande taak met een «gebeurtenis niet gevonden»-fout die niets nuttigs noemt. Beide zijn de standaardinvoer-conversatie van de AnyConnect-client die misloopt, geen netwerkstoring. Behandel de login als een uitgeschreven vraag en antwoord en de fouten worden voorspelbaar en klein.

Waarom hetzelfde commando binnen een script faalt

De client leest zijn antwoorden van standaardinvoer, één regel per prompt, in de volgorde waarin de gateway ze vraagt. Alles wat het aantal prompts verandert, zoals een nieuwe banner, een groepskiezer of een tweede-factor-uitdaging, verschuift elk later antwoord met één regel. De client leest dan een gebruikersnaam waar hij een wachtwoord verwachtte en meldt een fout die naar geen van beide wijst.

Een wachtwoord met een uitroepteken voegt een stillere tweede fout toe. Tussen dubbele aanhalingstekens expandeert de shell het ruim voordat de client iets ziet.

Zet de payload tussen enkele aanhalingstekens en het teken reist intact. Dat is de hele oplossing, en het verklaart een hele klasse rapporten waarin dezelfde inloggegevens werken bij het typen en falen bij het opslaan. Controleer wat de shell deed voordat je de gateway controleert: druk de payload af via een wrapper die de exacte bytes toont en tel de regels. De meeste van dit soort onderzoeken eindigen precies daar.

Schrijf de antwoorden in de volgorde waarin de client vraagt

Voer de client één keer interactief uit en noteer elke prompt in volgorde. Een groepskiezer verschijnt alleen als de gateway meerdere profielen publiceert, en een banner-prompt verschijnt alleen als er een is geconfigureerd. Het antwoordbestand moet passen bij de gateway waar je echt op wijst, niet bij die uit de documentatie.

Bouw daarna het bestand met precies die reeks, één antwoord per regel. De groepsindex is het nummer dat de client opsomt, niet de positie van een profiel in een document. Accepteer de banner alleen als je gateway er een stuurt, en voeg een regel toe voor elke extra vraag waarvan bekend is dat die gateway hem stelt. Start de client met de niet-interactieve vlag zodat hij het bestand verbruikt in plaats van op een terminal te wachten.

connect vpn.lab.example
0
username
password
y
exit
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt

Dezelfde reeks kan via een pijp binnenkomen als je liever geen bestand op schijf houdt. De quote-regels bepalen nog steeds of hij overleeft.

Houd de inloggegevens buiten de proceslijst

Een argument op de commandoregel is leesbaar voor elke lokale gebruiker zolang het proces leeft, dus het wachtwoord hoort in een bestand of een pijp en nooit in de argumentenlijst. Maak dat bestand alleen leesbaar voor het account dat het script uitvoert, en verwijder het als de taak klaar is. Op macOS staat het binary meestal op hetzelfde pad als op Linux, maar bevestig de geïnstalleerde locatie in plaats van die aan te nemen. Een wrapper die beide paden test is korter dan het incidentrapport.

printf 'username\npassword\ny\n' | /opt/cisco/anyconnect/bin/vpn -s connect vpn.lab.example

Laat het script ook niet eindeloos opnieuw proberen. Een gewijzigde banner of een wachtwoord dat ’s nachts verliep maakt van een vast antwoordbestand een herhaallus, en die lus is wat het account op slot zet.

Faal één keer, druk de eigen fouttekst van de client af en stop. Een geplande taak heeft dezelfde beoordeling van identiteit en beschikbaarheid van inloggegevens nodig als elke andere onbeheerde taak, omdat inloggegevens die stil verlopen niet te onderscheiden zijn van een storing om drie uur ’s nachts.

Bevestig de sessie voordat je de exitcode vertrouwt

Een verbonden status bewijst dat de tunnel bestaat en niets meer. Test één bron die erdoor bereikbaar moet zijn voordat het script echt werk begint, en behandel een fout daar als een andere storing dan een mislukte login. Anders probeer je een volstrekt goede verbinding opnieuw die simpelweg zijn bestemming niet kan bereiken.

Vraag de client naar zijn status voor en na de verbreking, want een verouderde sessie kan de volgende verbinding weigeren terwijl je script succes meldt.

/opt/cisco/anyconnect/bin/vpn state
/opt/cisco/anyconnect/bin/vpn disconnect

Leg de statusuitvoer naast de exitcode vast, want een code alleen kan een geweigerde login niet scheiden van een sessie die nooit werd gesloten. Als de gateway een tweede factor of een interactieve goedkeuring eist, stop dan met het scripten van die stap en gebruik in plaats daarvan het mechanisme dat de client ondersteunt. Een vast antwoordbestand is een gemak voor inloggegevens die je beheert, geen manier om een verificatiestap te omzeilen die je niet beheert. Houd de omvang zo smal en dit blijft een kort script.

Wanneer een vast antwoordbestand het verkeerde gereedschap is

Een tweede factor of een goedkeuringsprompt verslaan het patroon volledig, en dat is een ontwerpgrens, geen scriptraadsel. Gebruik welk mechanisme de client voor die stap ook ondersteunt in plaats van het antwoord vooraf te raden. Een vast bestand werkt alleen voor inloggegevens die tussen runs gelijk blijven.

Twee oudere stijlen inloggegevens worden ook met AnyConnect verward. Een vpnc-profiel spreekt een ander protocol, en het wil de groepsnaam als IPSec-identificatie, dan een gedeeld groepsgeheim, dan je eigen accountgegevens.

Omdat de protocollen verschillen, kan vpnc geen gateway bereiken die alleen AnyConnect-profielen publiceert, en het gebruikelijke open alternatief voor die dienst is openconnect met het anyconnect-protocol geselecteerd. Een pcf-bestand hoort bij de oude Cisco-client en hoewel de host, groepsnaam en groepswachtwoord opnieuw kunnen worden ingevoerd in een client die nog Cisco IPsec spreekt, verhuist het bestand niet tussen clients. Een ongebruikelijke poort of een niet-standaard tunnelmodus gaat bij die verhuizing meestal verloren. Bepaal welk protocol de gateway biedt voordat je een hulpmiddel kiest.

Gerelateerde artikelen