AnyConnect na Linuxu: bezpečné skriptování přihlašovací sekvence
Binárka vpn z Cisco AnyConnect čte odpovědi ze stdin a to stačí pro opakovatelné přihlášení. Sestav sekvenci, chraň soubor, ověř a skonči.
vpn klient, který se dodává s Cisco AnyConnect, se chová jako rozhovor: vypíše výzvu, počká na řádek a pak vypíše další. Když ten rozhovor přivedeš ze souboru nebo z roury, stejná binárka běží bez dozoru. Technika je jedno přesměrování plus uspořádaný seznam odpovědí a o tom, jestli je skript spolehlivý, rozhoduje seznam, ne přesměrování.
V praxi to rozbíjí dvě věci. Pořadí výzev se posune, když se brána zeptá na něco navíc, a uložené heslo promění jeden překlep v uzamčení účtu. Ber sekvenci jako verzovaná data, která můžeš po každé změně brány porovnat. Selhávej nahlas místo opakování, protože smyčka je přesně to, jak se z přepsaného hesla stane uzamčený účet.
Jedna sekvence, v pořadí, v jakém se klient ptá
Spusť klienta jednou interaktivně a zapiš každou výzvu v pořadí, v jakém se objeví. Ten přepis se stane souborem odpovědí. Když soubor přesměruješ do binárky, první řádek musí být samotný příkaz pro připojení, a proto sekvence začíná názvem hostitele, ne uživatelským jménem.
connect vpn.example.com
0
<username>
<password>
y
exit
Holé 0 vybere první profil připojení, když brána nabídne seznam; použij index, který tvoje brána vypíše. y přijímá přihlašovací banner, takže ten řádek smaž, když žádný banner není, a vlož ho všude, kde se tvoje brána ptá na další otázku. Závěrečné exit je to, co klientovi umožní čistě skončit, když je poslední odpověď spotřebovaná.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Neinteraktivní režim tu není volitelný. Bez -s může klient převzít terminál a ignorovat přesměrovaný vstup; s ním se odpovědi čtou z proudu a proces se vrátí. Kde binárka potřebuje vyšší oprávnění, obal volání do sudo -n, aby skript selhal okamžitě, místo aby se zablokoval na výzvě k heslu.
Kde soubor odpovědí uniká
Soubor s heslem je přihlašovací údaj, tak mu dej oprávnění údaje: režim 600, vlastníkem je účet, který úlohu spouští, a nikdy uvnitř sdíleného nebo synchronizovaného adresáře. Vytvoř ho s už nastaveným režimem, místo abys ho opravoval dodatečně, protože soubor je mezi zápisem a chmod krátce čitelný pro všechny.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Druhá polovina je argv. Heslo předané jako argument je viditelné každému místnímu uživateli, který vypisuje procesy, a také skončí v historii shellu. Čti ho radši z deskriptoru souboru nebo z proměnné prostředí a data obal uvozovkami, aby v nich shell nemohl nic rozvinout.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Sleduj uvozovky. Uvnitř dvojitých uvozovek může heslo obsahující ! rozvinout interaktivní shell dřív, než ho klient vůbec uvidí, a selhání dorazí jako obecná chyba event-not-found, která vypadá jako problém protokolu.
Dokaž tunel, pak ho zavři
Stav připojeno dokazuje jen to, že klient si myslí, že má relaci. Vyber hostitele, který odpovídá jen zevnitř podnikové sítě, a jednou ho otestuj, než uděláš cokoli dalšího. Selhání tam je chyba směrování nebo politiky a opětovné spuštění přihlášení to nezmění.
/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
Zkontroluj výstup stavu před odpojením a po něm. Klient ponechaný se zastaralou relací může odmítnout další připojení, zatímco skript stále hlásí úspěch, a tento režim selhání je neviditelný, když se díváš jen na návratové kódy. Porovnej obě čtení, místo abys věřil druhému samotnému. Aliasy v profilu shellu stačí pro denní použití, kdežto cokoli naplánovaného si zaslouží stejnou revizi přihlašovacích údajů a identity jako každá jiná úloha bez dozoru.
Když pevný seznam přestane být bezpečný
Soubor odpovědí kóduje dnešní pořadí výzev. Změněný banner, vynucená změna hesla nebo výzva k druhému faktoru z něj udělá smyčku, která může uzamknout účet, a proto musí skript skončit při první neočekávané odpovědi, místo aby se restartoval.
Zachyť, co klient vypsal, vrať nenulový stav a nech rozhodnutí na volajícím. Tam, kde brána vyžaduje druhý faktor, je poctivá odpověď, že přihlášení bez dozoru pro tento profil není dostupné, ne že sekvence potřebuje ještě jeden řádek.
Rotace patří do stejné revize. Pokud se údaj ukládá, rozhodni, kdo ho smí číst, kdy se mění a co ho odstraní při přestavbě hostitele. Skript, který funguje rok, protože na heslo nikdo nesáhl, není návrh, ale nehoda čekající na politiku rotace.
Profily, které nejsou AnyConnect
Dva starší styly přihlašovacích údajů Cisco se s tímto pletou. Profil vpnc se ptá na IPSec ID, což je ve skutečnosti název skupiny, pak na skupinové tajemství, pak na tvoje vlastní údaje, a všechny tři pocházejí od toho, kdo bránu provozuje. Starší Cisco IPsec je jiný protokol než AnyConnect, takže vpnc nedosáhne na službu určenou jen pro AnyConnect; openconnect --protocol=anyconnect je otevřený klient pro tuhle práci.
Soubor .pcf popisuje profil staršího klienta. Hostitel, název skupiny a skupinové heslo v něm lze znovu zadat ručně v klientovi, který mluví Cisco IPsec, i když soubor není univerzální import a jakýkoli nestandardní port nebo režim tunelování obvykle při přenosu zmizí.
Začni tím, co brána skutečně nabízí, a pak vyber klienta, který tím protokolem mluví. Kopírování profilu z jiného webu je způsob, jak lidé skončí u ladění přihlašovacích údajů, které nikdy nebyly problémem.