AnyConnect na Linuxu: sigurno pisanje skripte za prijavu
AnyConnect vpn binarni program čita odgovore sa stdin, i to je dovoljno za prijavu koja se može ponoviti. Izgradi niz, zaštiti datoteku, proveri i zaustavi se.
vpn klijent koji stiže uz Cisco AnyConnect ponaša se kao razgovor: ispiše pitanje, sačeka liniju, pa ispiše sledeće. Ako taj razgovor ubaciš iz datoteke ili cevi, isti binarni program radi bez nadzora. Tehnika je jedno preusmerenje i uređena lista odgovora, a o pouzdanosti skripte odlučuje lista, a ne preusmerenje.
U praksi to kvare dve stvari. Redosled pitanja se pomeri kad gateway zatraži nešto dodatno, a sačuvana lozinka pretvori jednu grešku u kucanju u zaključavanje naloga. Tretiraj niz kao verzionirane podatke koje možeš uporediti posle svake promene gatewaya. Padaj glasno umesto ponovnog pokušaja, jer petlja je upravo način na koji pogrešno otkucana lozinka postaje zaključan nalog.
Jedan niz, redom kojim klijent pita
Pokreni klijent jednom interaktivno i zapiši svako pitanje redom kojim se pojavljuje. Taj zapis postaje datoteka odgovora. Kada datoteku preusmeriš u binarni program, prva linija mora biti sama naredba za povezivanje, zato niz počinje imenom hosta, a ne korisničkim imenom.
connect vpn.example.com
0
<username>
<password>
y
exit
Goli 0 bira prvi profil veze kad gateway ponudi listu; koristi indeks koji tvoj gateway ispiše. y prihvata baner za prijavu, pa obriši taj red ako banera nema i umetni ga tamo gde tvoj gateway postavlja dodatno pitanje. exit na kraju je ono što klijentu omogućava čisto zatvaranje kad je poslednji odgovor potrošen.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Neinteraktivni režim ovde nije opcionalan. Bez -s klijent može preuzeti terminal i ignorisati preusmereni ulaz; s njim se odgovori čitaju iz toka i proces se vraća. Gde binarni program traži povišene privilegije, umotaj poziv u sudo -n da skripta odmah padne umesto da se blokira na pitanju za lozinku.
Gde datoteka odgovora curi
Datoteka koja sadrži lozinku je akreditiv, pa joj daj dozvole akreditiva: režim 600, vlasništvo naloga koji izvršava posao i nikada unutar deljenog ili sinhronizovanog direktorijuma. Napravi je sa već primenjenim režimom umesto da je popravljaš 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 prosleđena kao argument vidljiva je svakom lokalnom korisniku koji izlistava procese, a završi i u istoriji shella. Čitaj je iz datotečnog deskriptora ili promenljive okruženja umesto toga i stavi 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
Pazi na navodnike. Unutar dvostrukih navodnika lozinku koja sadrži ! može proširiti interaktivni shell pre nego što je klijent uopšte vidi, a greška dolazi kao opšta event-not-found greška koja izgleda kao problem protokola.
Dokaži tunel, pa ga zatvori
Stanje povezano dokazuje samo da klijent veruje da ima sesiju. Izaberi host koji odgovara samo iz korporativne mreže i proveri ga jednom pre bilo čega drugog. Neuspeh tamo je greška rutiranja ili politike i ponovno pokretanje prijave to neće promeniti.
/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
Proveri izlaz stanja pre i posle prekida veze. Klijent ostavljen sa zastarelom sesijom može odbiti sledeću vezu dok skripta još izveštava o uspehu, a taj način neuspeha je nevidljiv ako gledaš samo izlazne kodove. Uporedi oba očitanja umesto da veruješ drugom samo 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 redosled pitanja. Promenjeni baner, prinudna promena lozinke ili izazov drugog faktora pretvaraju je u petlju koja može zaključati nalog, zato skripta mora izaći na prvi neočekivani odgovor umesto da se restartuje.
Zabeleži šta je klijent ispisao, vrati status različit od nule i prepusti odluku pozivaocu. Gde gateway zahteva drugi faktor, iskren odgovor je da prijava bez nadzora nije dostupna za taj profil, a ne da nizu treba još jedan red.
Rotacija pripada istoj reviziji. Ako se akreditiv čuva, odluči ko ga može čitati, kada se menja 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 mešaju se s ovim. Profil vpnc traži IPSec ID, što je zapravo ime grupe, zatim grupnu tajnu, pa tvoje vlastite akreditive i sve tri dolaze od onoga ko upravlja gatewayem. Nasleđ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 uneti u klijentu koji govori Cisco IPsec, iako datoteka nije univerzalni uvoz i svaki nestandardni port ili način tuneliranja obično nestane u prenosu.
Počni od onoga što gateway zaista nudi, pa odaberi klijent koji govori taj protokol. Kopiranje profila sa druge lokacije je način na koji ljudi završe debagujući akreditive koje nikada nisu bile problem.