AnyConnect v Linuxe: bezpečné skriptovanie prihlasovacej sekvencie
vpn binárka z Cisco AnyConnect číta odpovede zo stdin a to stačí na opakovateľné prihlásenie. Zostav sekvenciu, chráň súbor, over a skonči.
vpn klient, ktorý sa dodáva s Cisco AnyConnect, sa správa ako rozhovor: vypíše výzvu, počká na riadok a potom vypíše ďalšiu. Keď ten rozhovor privedieš zo súboru alebo z rúry, tá istá binárka beží bez dozoru. Technika je jedno presmerovanie plus usporiadaný zoznam odpovedí a o tom, či je skript spoľahlivý, rozhoduje zoznam, nie presmerovanie.
V praxi to rozbíjajú dve veci. Poradie výziev sa posunie, keď sa brána spýta na niečo navyše, a uložené heslo premení jeden preklep na uzamknutie účtu. Ber sekvenciu ako verziované dáta, ktoré môžeš po každej zmene brány porovnať. Zlyhávaj nahlas namiesto opakovania, pretože slučka je presne to, ako sa z prepísaného hesla stane uzamknutý účet.
Jedna sekvencia, v poradí, v akom sa klient pýta
Spusti klienta raz interaktívne a zapíš každú výzvu v poradí, v akom sa objaví. Ten prepis sa stane súborom odpovedí. Keď súbor presmeruješ do binárky, prvý riadok musí byť samotný príkaz na pripojenie, a preto sekvencia začína názvom hostiteľa, nie používateľským menom.
connect vpn.example.com
0
<username>
<password>
y
exit
Holé 0 vyberie prvý profil pripojenia, keď brána ponúkne zoznam; použi index, ktorý tvoja brána vypíše. y prijíma prihlasovací banner, takže ten riadok zmaž, ak žiadny banner nie je, a vlož ho všade, kde sa tvoja brána pýta na ďalšiu otázku. Záverečné exit je to, čo klientovi umožní čisto skončiť, keď je posledná odpoveď spotrebovaná.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Neinteraktívny režim tu nie je voliteľný. Bez -s môže klient prevziať terminál a ignorovať presmerovaný vstup; s ním sa odpovede čítajú z prúdu a proces sa vráti. Kde binárka potrebuje vyššie oprávnenia, obal volanie do sudo -n, aby skript zlyhal okamžite, namiesto toho, aby sa zablokoval na výzve k heslu.
Kde súbor odpovedí uniká
Súbor s heslom je prihlasovací údaj, tak mu daj oprávnenia údaja: režim 600, vlastníkom je účet, ktorý úlohu spúšťa, a nikdy vnútri zdieľaného alebo synchronizovaného adresára. Vytvor ho s už nastaveným režimom, namieto toho, aby si ho opravoval dodatočne, pretože súbor je medzi zápisom a chmod krátko čitateľný pre všetkých.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Druhá polovica je argv. Heslo odovzdané ako argument je viditeľné každému lokálnemu používateľovi, ktorý vypisuje procesy, a skončí aj v histórii shellu. Čítaj ho radšej z deskriptora súboru alebo z premennej prostredia a údaje obal úvodzovkami, aby v nich shell nemohol nič rozvinúť.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Sleduj úvodzovky. Vnútri dvojitých úvodzoviek môže heslo obsahujúce ! rozvinúť interaktívny shell skôr, než ho klient vôbec uvidí, a zlyhanie dorazí ako všeobecná chyba event-not-found, ktorá vyzerá ako problém protokolu.
Dokáž tunel, potom ho zavri
Stav pripojené dokazuje len to, že klient si myslí, že má reláciu. Vyber hostiteľa, ktorý odpovedá len zvnútra podnikovej siete, a raz ho otestuj, než urobíš čokoľvek ďalšie. Zlyhanie tam je chyba smerovania alebo politiky a opätovné spustenie prihlásenia to nezmení.
/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
Skontroluj výstup stavu pred odpojením a po ňom. Klient ponechaný so zastaranou reláciou môže odmietnuť ďalšie pripojenie, zatiaľ čo skript stále hlási úspech, a tento režim zlyhania je neviditeľný, keď sa pozeráš len na návratové kódy. Porovnaj obe čítania namiesto toho, aby si veril druhému samotnému. Aliasy v profile shellu stačia na denné použitie, kým čokoľvek naplánované si zaslúži rovnakú revíziu prihlasovacích údajov a identity ako každá iná úloha bez dozoru.
Keď pevný zoznam prestane byť bezpečný
Súbor odpovedí kóduje dnešné poradie výziev. Zmenený banner, vynútená zmena hesla alebo výzva k druhému faktoru z neho urobia slučku, ktorá môže uzamknúť účet, preto musí skript skončiť pri prvej neočakávanej odpovedi, namiesto toho, aby sa reštartoval.
Zachyť, čo klient vypísal, vráť nenulový stav a nechaj rozhodnutie na volajúcom. Tam, kde brána vyžaduje druhý faktor, je poctivá odpoveď, že prihlásenie bez dozoru pre tento profil nie je dostupné, nie že sekvencia potrebuje ešte jeden riadok.
Rotácia patrí do tej istej revízie. Ak sa údaj ukladá, rozhodni, kto ho smie čítať, kedy sa mení a čo ho odstráni pri prestavbe hostiteľa. Skript, ktorý funguje rok, pretože na heslo nikto nesiahol, nie je návrh, ale nehoda čakajúca na politiku rotácie.
Profily, ktoré nie sú AnyConnect
Dva staršie štýly prihlasovacích údajov Cisco sa s týmto pletú. Profil vpnc sa pýta na IPSec ID, čo je v skutočnosti názov skupiny, potom na skupinové tajomstvo, potom na tvoje vlastné údaje, a všetky tri pochádzajú od toho, kto bránu prevádzkuje. Starší Cisco IPsec je iný protokol než AnyConnect, takže vpnc nedosiahne službu určenú len pre AnyConnect; openconnect --protocol=anyconnect je otvorený klient pre túto prácu.
Súbor .pcf opisuje profil staršieho klienta. Hostiteľa, názov skupiny a skupinové heslo v ňom možno znovu zadať ručne v klientovi, ktorý hovorí Cisco IPsec, hoci súbor nie je univerzálny import a akýkoľvek neštandardný port alebo režim tunelovania zvyčajne pri prenose zmizne.
Začni tým, čo brána skutočne ponúka, a potom vyber klienta, ktorý hovorí tým protokolom. Kopírovanie profilu z inej lokality je spôsob, akým ľudia skončia pri ladení prihlasovacích údajov, ktoré nikdy neboli problémom.