AnyConnect op Linux: de loginreeks veilig scripten
De AnyConnect vpn-binary leest antwoorden van stdin, en dat is genoeg voor een herhaalbare login. Bouw de reeks, bescherm het bestand, verifieer en stop.
De vpn-client die met Cisco AnyConnect meekomt, gedraagt zich als een gesprek: hij print een prompt, wacht op een regel en print dan de volgende. Voer dat gesprek in vanuit een bestand of een pipe en dezelfde binary draait zonder toezicht. De techniek is één omleiding plus een geordende lijst antwoorden, en het is de lijst, niet de omleiding, die bepaalt of het script betrouwbaar is.
Twee dingen breken het in de praktijk. De volgorde van de prompts verschuift wanneer een gateway iets extra's vraagt, en een opgeslagen wachtwoord maakt van één typefout een accountvergrendeling. Behandel de reeks als geversioneerde data die je na elke gateway-wijziging kunt vergelijken. Faal luid in plaats van opnieuw te proberen, want een lus is precies hoe een verkeerd getypt wachtwoord een vergrendeld account wordt.
Eén reeks, in de volgorde waarin de client vraagt
Draai de client één keer interactief en schrijf elke prompt op in de volgorde waarin hij verschijnt. Dat transcript wordt het antwoordbestand. Wanneer je het bestand naar de binary omleidt, moet de eerste regel het verbindingscommando zelf zijn, daarom begint de reeks met een hostnaam in plaats van een gebruikersnaam.
connect vpn.example.com
0
<username>
<password>
y
exit
De kale 0 selecteert het eerste verbindingsprofiel wanneer de gateway een lijst biedt; gebruik de index die jouw gateway print. y accepteert een loginbanner, dus verwijder die regel als er geen banner is en voeg er een in waar jouw gateway een extra vraag stelt. De afsluitende exit is wat de client netjes laat eindigen wanneer het laatste antwoord verbruikt is.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
De niet-interactieve modus is hier niet optioneel. Zonder -s kan de client de terminal overnemen en omgeleide invoer negeren; ermee worden de antwoorden uit de stream gelezen en keert het proces terug. Waar de binary verhoogde rechten nodig heeft, wikkel de aanroep in sudo -n zodat het script meteen faalt in plaats van te blokkeren op een wachtwoordprompt.
Waar het antwoordbestand lekt
Een bestand met een wachtwoord is een referentie, dus geef het de rechten van een referentie: modus 600, eigendom van het account dat de taak uitvoert, en nooit in een gedeelde of gesynchroniseerde map. Maak het aan met de modus al toegepast in plaats van het achteraf te repareren, want een bestand is even voor iedereen leesbaar tussen het schrijven en de chmod.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
De andere helft is argv. Een wachtwoord dat als argument wordt meegegeven, is zichtbaar voor elke lokale gebruiker die processen opsomt, en het belandt ook in de shell-geschiedenis. Lees het in plaats daarvan uit een bestandsdescriptor of een omgevingsvariabele, en zet de payload tussen aanhalingstekens zodat de shell er niets in kan uitbreiden.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Let op het quoten. Binnen dubbele aanhalingstekens kan een wachtwoord met ! door een interactieve shell worden uitgebreid voordat de client het ooit ziet, en de fout komt binnen als een generieke event-not-found-fout die op een protocolprobleem lijkt.
Bewijs de tunnel en sluit hem dan
Een verbonden status bewijst alleen dat de client denkt dat hij een sessie heeft. Kies een host die alleen van binnen het bedrijfsnetwerk antwoordt en test die één keer voordat je iets anders doet. Een fout daar is een routerings- of beleidsfout, en de login opnieuw uitvoeren verandert dat niet.
/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
Controleer de statusuitvoer voor en na het verbreken. Een client die met een verouderde sessie achterblijft, kan de volgende verbinding weigeren terwijl het script nog succes meldt, en die faalmodus is onzichtbaar als je alleen naar exitcodes kijkt. Vergelijk de twee metingen in plaats van de tweede alleen te vertrouwen. Aliassen in een shell-profiel zijn genoeg voor dagelijks gebruik, terwijl alles wat gepland is dezelfde beoordeling van referenties en identiteit verdient als elke andere onbeheerde taak.
Wanneer een vaste lijst niet meer veilig is
Een antwoordbestand codeert de promptvolgorde van vandaag. Een gewijzigde banner, een geforceerde wachtwoordwijziging of een tweede-factor-uitdaging maken er een lus van die het account kan vergrendelen, daarom moet het script bij het eerste onverwachte antwoord stoppen in plaats van opnieuw te starten.
Leg vast wat de client heeft geprint, geef een niet-nul status terug en laat de aanroeper beslissen. Waar de gateway een tweede factor eist, is het eerlijke antwoord dat een onbeheerde login voor dat profiel niet beschikbaar is, niet dat de reeks nog een regel nodig heeft.
Rotatie hoort bij dezelfde beoordeling. Als de referentie wordt opgeslagen, bepaal dan wie hem mag lezen, wanneer hij verandert en wat hem verwijdert wanneer de host opnieuw wordt gebouwd. Een script dat een jaar werkt omdat niemand het wachtwoord heeft aangeraakt is geen ontwerp, maar een ongeluk dat op een rotatiebeleid wacht.
Profielen die geen AnyConnect zijn
Twee oudere Cisco-referentiestijlen worden met deze verward. Een vpnc-profiel vraagt om een IPSec ID, wat eigenlijk de groepsnaam is, dan een groepsgeheim, dan je eigen referenties, en alle drie komen van degene die de gateway beheert. Oud Cisco IPsec is een ander protocol dan AnyConnect, dus vpnc kan geen dienst bereiken die alleen AnyConnect is; openconnect --protocol=anyconnect is de open client voor die taak.
Een .pcf-bestand beschrijft het oudere clientprofiel. De host, de groepsnaam en het groepswachtwoord erin kunnen met de hand opnieuw worden ingevoerd in een client die Cisco IPsec spreekt, hoewel het bestand geen universele import is en elke niet-standaard poort of tunnelmodus meestal verdwijnt bij de overdracht.
Begin bij wat de gateway echt biedt en kies dan de client die dat protocol spreekt. Een profiel van een andere site kopiëren is de manier waarop mensen referenties gaan debuggen die nooit het probleem waren.