AnyConnect na Linuxu: sigurno skriptiranje slijeda prijave
AnyConnect vpn binarni program čita odgovore sa stdin, i to je dovoljno za ponovljivu prijavu. Izgradi slijed, zaštiti datoteku, provjeri i zaustavi se.
vpn klijent koji dolazi uz Cisco AnyConnect ponaša se kao razgovor: ispiše upit, čeka red, a zatim ispiše sljedeći. Ako taj razgovor ubacite iz datoteke ili cijevi, isti binarni program radi bez nadzora. Tehnika je jedno preusmjeravanje plus uređena lista odgovora, a o tome je li skripta pouzdana odlučuje lista, a ne preusmjeravanje.
Dvije stvari to kvare u praksi. Redoslijed upita se pomjeri kada gateway pita nešto dodatno, a sačuvana lozinka pretvori jednu grešku u tipkanju u zaključavanje računa. Tretirajte slijed kao verzionirane podatke koje možete uporediti nakon svake promjene gatewaya. Padajte glasno umjesto ponovnog pokušavanja, jer petlja je upravo način na koji pogrešno otkucana lozinka postaje zaključan račun.
Jedan slijed, redom kojim klijent pita
Pokrenite klijent jednom interaktivno i zapišite svaki upit redom kojim se pojavljuje. Taj transkript postaje datoteka odgovora. Kada datoteku preusmjerite u binarni program, prvi red mora biti sama naredba za povezivanje, zato slijed počinje imenom hosta, a ne korisničkim imenom.
connect vpn.example.com
0
<username>
<password>
y
exit
Goli 0 bira prvi profil veze kada gateway ponudi listu; koristite indeks koji vaš gateway ispiše. y prihvata baner za prijavu, pa obrišite taj red ako banera nema i umetnite red gdje vaš gateway postavlja dodatno pitanje. exit na kraju je ono što klijentu omogućava čisto završavanje kada je posljednji odgovor potrošen.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Neinteraktivni način ovdje nije opcionalan. Bez -s klijent može preuzeti terminal i ignorisati preusmjereni ulaz; s njim se odgovori čitaju iz toka i proces se vraća. Gdje binarni program traži povišene privilegije, umotajte poziv u sudo -n da skripta odmah padne umjesto da se blokira na upitu za lozinku.
Gdje datoteka odgovora curi
Datoteka koja sadrži lozinku je akreditiv, pa dajte joj dozvole akreditiva: način 600, vlasništvo računa koji izvršava posao i nikada unutar dijeljenog ili sinhronizovanog direktorija. Kreirajte je s već primijenjenim načinom umjesto da je popravljate naknadno, jer je datoteka nakratko čitljiva svima između upisa i chmoda.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Druga polovina je argv. Lozinka proslijeđena kao argument vidljiva je svakom lokalnom korisniku koji izlistava procese, a završi i u historiji shella. Čitajte je iz datotečnog deskriptora ili varijable okruženja umjesto toga i stavite sadržaj pod navodnike da shell ne može ništa unutar njega proširiti.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Pazite na navodnike. Unutar dvostrukih navodnika lozinku koja sadrži ! može proširiti interaktivni shell prije nego što je klijent uopšte vidi, a greška dolazi kao generička event-not-found greška koja izgleda kao problem protokola.
Dokažite tunel, pa ga zatvorite
Stanje povezano dokazuje samo da klijent vjeruje da ima sesiju. Izaberite host koji odgovara samo iz korporativne mreže i provjerite ga jednom prije bilo čega drugog. Neuspjeh tamo je greška rutiranja ili politike i ponovno pokretanje prijave to neće promijeniti.
/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
Provjerite izlaz stanja prije i poslije prekida veze. Klijent ostavljen sa zastarjelom sesijom može odbiti sljedeću vezu dok skripta još izvještava o uspjehu, a taj način neuspjeha je nevidljiv ako gledate samo izlazne kodove. Uporedite očitanja umjesto da vjerujete drugom samom po sebi. Aliasi u profilu shella dovoljni su za svakodnevnu upotrebu, dok sve zakazano zaslužuje istu reviziju akreditiva i identiteta kao i svaki drugi posao bez nadzora.
Kada fiksna lista prestane biti sigurna
Datoteka odgovora kodira današnji redoslijed upita. Promijenjeni baner, prinudna promjena lozinke ili izazov drugog faktora pretvaraju je u petlju koja može zaključati račun, zato skripta mora izaći na prvi neočekivani odgovor umjesto da se restartuje.
Zabilježite šta je klijent ispisao, vratite status različit od nule i prepustite odluku pozivaocu. Gdje gateway zahtijeva drugi faktor, iskren odgovor je da prijava bez nadzora nije dostupna za taj profil, a ne da slijedu treba još jedan red.
Rotacija pripada istoj reviziji. Ako se akreditiv čuva, odlučite ko ga može čitati, kada se mijenja i šta ga uklanja kada se host ponovo izgradi. Skripta koja radi godinu jer niko nije dirao lozinku nije dizajn, nego nesreća koja čeka politiku rotacije.
Profili koji nisu AnyConnect
Dva starija Cisco stila akreditiva miješaju se s ovim. Profil vpnc traži IPSec ID, što je zapravo ime grupe, zatim grupnu tajnu, pa vaše vlastite akreditive i sve tri dolaze od onoga ko upravlja gatewayem. Naslijeđeni Cisco IPsec je drugi protokol od AnyConnecta, pa vpnc ne može dosegnuti uslugu samo za AnyConnect; openconnect --protocol=anyconnect je otvoreni klijent za taj posao.
Datoteka .pcf opisuje profil starijeg klijenta. Host, ime grupe i grupna lozinka u njoj mogu se ručno ponovo unijeti u klijentu koji govori Cisco IPsec, iako datoteka nije univerzalni uvoz i svaki nestandardni port ili način tuneliranja obično nestane u prijenosu.
Počnite od onoga što gateway zaista nudi, pa odaberite klijent koji govori taj protokol. Kopiranje profila s druge lokacije je način na koji ljudi završe debagujući akreditive koje nikada nisu bile problem.