Uvjerenje je da je here-dokument s četiri retka potpuna neinteraktivna prijava, i ono se drži sve dok pristupnik ne ponudi dvije grupe, ne ispiše banner ili ne zatraži token nakon lozinke. Tada ista skripta upiše lozinku u izbornik koji je očekivao broj. Klijent naredbenog retka na Linuxu može se skriptirati, ali samo ako mu date ono što stvarno čeka, a ne ono što je vodič pretpostavio.

Fiksni here-dokument je mit

Ciscov Linux klijent instalira mali program na /opt/cisco/anyconnect/bin/vpn, a Secure Client 5 ga još uvijek isporučuje. Dok usluga vpnagentd radi, zastavica -s čita odgovore sa standardnog ulaza redoslijedom kojim ih klijent traži. Taj redoslijed nije fiksan među poslužiteljima.

Izbornik grupa dodaje jedan redak. Prijavni banner dodaje još jedan. Zahtjev za token nakon lozinke potpuno razbija skriptu od četiri retka, jer peti redak nikada nije trebao biti token. Kvar je tih: klijent prima pogrešan niz znakova, pokušaj povezivanja završava, a skripta ne javlja ništa korisno.

Pokrenite klijent ručno jednom prema istom pristupniku i istoj verziji te zapišite upite redoslijedom kojim se pojavljuju. Taj zapis je specifikacija koju vaša skripta mora zadovoljiti.

Što klijent čeka

U uobičajenom slučaju s jednom grupom slijed je korisničko ime, lozinka i ponekad potvrda bannera. Prvi redak here-dokumenta postaje indeks izbornika samo kad poslužitelj doista prikaže izbornik, zato ista skripta radi na jednom mjestu, a pada na sljedećem.

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

Čitajte to kao četiri odgovora na četiri moguća pitanja, a ne kao fiksni protokol. Nula je odabir izbornika, a ne lozinka, a završno y prihvaća banner koji mnogi pristupnici nikada ne pošalju.

Koristite expect kad redoslijed nije predvidiv

Kad se redoslijed upita mijenja, prestanite brojiti retke i umjesto toga čekajte upit. Expect skripta pokreće naredbu connect, čeka upit za korisničko ime, šalje, čeka upit za lozinku, šalje, a zatim čeka stanje povezanosti. Svako čekanje ima vlastito vremensko ograničenje.

Tretirajte istek vremena kao kvar i izađite. Skripta koja nastavi slati unos nakon neočekivanog upita rado će upisati lozinku u ljusku, izbornik ili bilo što drugo što slučajno čita. Tako skripta za prijavu postaje incident.

Expect vam daje i zapis koji možete zabilježiti s uklonjenom tajnom, a to vrijedi više od izlaznog koda kad pristupnik nakon nadogradnje promijeni svoje upite.

Tajna mora negdje živjeti

Svaka verzija ovog problema ima jednu slabost: lozinka mora postojati u obliku koji klijent može pročitati. Slanje kao argumenta izlaže je u tablici procesa. Ispis kroz cjevovod često je stavlja u povijest ljuske. Oboje mogu čitati drugi lokalni korisnici na zajedničkom skakačkom hostu.

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

Datoteka s pravima 600 u vlasništvu računa je minimum, i dalje je tajna u čistom tekstu na disku. secret-tool lookup čita iz Linux privjeska ključeva, a na macOS-u isti posao obavlja security find-generic-password -w. Gdje organizacija podržava autentikaciju certifikatom ili SAML, dajte joj prednost, jer spremljena lozinka plus MFA još uvijek ne može dovršiti prijavu bez čovjeka.

Potvrdite tunel, pa preuzmite raskid

Ne vjerujte odsutnosti teksta o pogrešci. Pitajte klijent za stanje i provjerite sučelje neovisno:

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

Stanje bi trebalo pisati Connected, a tunelsko sučelje trebalo bi imati adresu. Zatim zatražite jedan resurs koji tunel treba dosegnuti, jer je povezano stanje bez rute stvaran ishod i lako ga je propustiti.

Odspojite se s vpn disconnect i pustite skriptu koja je pokrenula tunel da preuzme raskid. Neuspjeli posao koji ostavi sesiju otvorenom troši licencno mjesto i sljedećoj osobi izgleda kao problem s autentikacijom.

Redoslijed rada: potvrdite vpnagentd, zabilježite stvarni redoslijed upita, odaberite here-dokument ili expect, držite tajnu izvan argv i povijesti, provjerite stanje i jedan resurs, pa se odspojite u istoj skripti.

Povezani članci