Presvedčenie je, že here-dokument so štyrmi riadkami je úplné neinteraktívne prihlásenie, a drží sa presne dovtedy, kým brána ponúkne dve skupiny, vytlačí banner alebo po hesle požiada o token. Vtedy ten istý skript napíše heslo do menu, ktoré očakávalo číslo. Klient príkazového riadka na Linuxe sa dá skriptovať, ale iba ak mu dáte to, na čo naozaj čaká, nie to, čo predpokladal návod.

Pevný here-dokument je mýtus

Linuxový klient Cisco inštaluje malý program do /opt/cisco/anyconnect/bin/vpn a Secure Client 5 ho stále dodáva. Kým beží služba vpnagentd, prepínač -s číta odpovede zo štandardného vstupu v poradí, v akom ich klient žiada. To poradie nie je medzi servermi pevné.

Menu skupín pridáva jeden riadok. Prihlasovací banner pridáva ďalší. Žiadosť o token po hesle úplne zlomí skript so štyrmi riadkami, pretože piaty riadok nikdy nemal byť token. Zlyhanie je tiché: klient dostane nesprávny reťazec, pokus o pripojenie sa skončí a skript neoznámi nič užitočné.

Spustite klienta ručne raz proti tej istej bráne a verzii a zapíšte výzvy v poradí, v akom sa objavujú. Ten záznam je špecifikácia, ktorú musí váš skript splniť.

Na čo klient čaká

V bežnom prípade jednej skupiny je postupnosť používateľské meno, heslo a niekedy potvrdenie banneru. Prvý riadok here-dokumentu sa stane indexom menu iba vtedy, keď server naozaj zobrazí menu, preto ten istý skript funguje na jednom mieste a zlyhá na ďalšom.

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

Čítajte to ako štyri odpovede na štyri možné otázky, nie ako pevný protokol. Nula je voľba v menu, nie heslo, a záverečné y prijíma banner, ktorý mnohé brány nikdy nepošlú.

Použite expect, keď poradie nie je predvídateľné

Keď sa poradie výziev mení, prestaňte počítať riadky a namiesto toho čakajte na výzvu. Skript expect spustí príkaz connect, čaká na výzvu používateľského mena, odošle, čaká na výzvu hesla, odošle a potom čaká na stav pripojenia. Každé čakanie má vlastný časový limit.

Berte časový limit ako zlyhanie a skončite. Skript, ktorý po neočakávanej výzve ďalej posiela vstup, ochotne napíše heslo do shellu, menu alebo čohokoľvek iného, čo práve číta. Tak sa z prihlasovacieho skriptu stane incident.

Expect vám dá aj záznam, ktorý môžete zalogovať s odstráneným tajomstvom, a to má väčšiu cenu než návratový kód, keď brána po aktualizácii zmení svoje výzvy.

Tajomstvo musí niekde žiť

Každá verzia tohto problému má jednu slabinu: heslo musí existovať vo forme, ktorú klient dokáže prečítať. Odovzdanie ako argument ho vystaví v tabuľke procesov. Vypísanie cez potrubie ho často umiestni do histórie shellu. Obe sú čitateľné pre iných lokálnych používateľov na zdieľanom skokovom hostiteľovi.

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

Súbor s režimom 600, ktorý patrí účtu, je minimum, a stále je to tajomstvo v čistom texte na disku. secret-tool lookup číta z linuxovej kľúčenky a na macOS robí tú istú prácu security find-generic-password -w. Kde organizácia podporuje autentifikáciu certifikátom alebo SAML, uprednostnite ju, pretože uložené heslo plus MFA stále nedokáže dokončiť prihlásenie bez človeka.

Potvrďte tunel a potom prevezmite odpojenie

Neverte neprítomnosti chybového textu. Opýtajte sa klienta na jeho stav a rozhranie overte nezávisle:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

Stav by mal znieť Connected a tunelové rozhranie by malo mať adresu. Potom požiadajte o jeden zdroj, ktorý má tunel dosiahnuť, pretože pripojený stav bez trasy je reálny výsledok a ľahko sa prehliadne.

Odpojte sa cez vpn disconnect a nechajte skript, ktorý tunel spustil, prevziať odpojenie. Neúspešná úloha, ktorá nechá reláciu otvorenú, spotrebuje licenčné miesto a ďalšiemu, kto to skúsi, sa javí ako problém s autentifikáciou.

Poradie práce: potvrďte vpnagentd, zaznamenajte skutočné poradie výziev, vyberte here-dokument alebo expect, držte tajomstvo mimo argv a histórie, overte stav a jeden zdroj, potom sa odpojte v tom istom skripte.

Súvisiace články