Uskomus on, että nelirivinen here-document on täydellinen ei-interaktiivinen kirjautuminen, ja se pitää täsmälleen siihen asti, kun yhdyskäytävä tarjoaa kaksi ryhmää, tulostaa bannerin tai pyytää tokenia salasanan jälkeen. Silloin sama skripti kirjoittaa salasanan valikkoon, joka odotti numeroa. Linuxin komentoriviasiakas on skriptattavissa, mutta vain jos sille antaa sen, mitä se todella odottaa, eikä sitä, mitä opas oletti.

Kiinteä here-document on myytti

Ciscon Linux-asiakas asentaa pienen ohjelman polkuun /opt/cisco/anyconnect/bin/vpn, ja Secure Client 5 toimittaa sen edelleen. Kun vpnagentd-palvelu on käynnissä, -s-lippu lukee vastaukset vakiosyötteestä siinä järjestyksessä kuin asiakas niitä kysyy. Tämä järjestys ei ole kiinteä palvelimien välillä.

Ryhmävalikko lisää yhden rivin. Kirjautumisbanneri lisää toisen. Tokenin kysyminen salasanan jälkeen rikkoo nelirivisen skriptin kokonaan, koska viidennen rivin ei koskaan pitänyt olla token. Virhe on hiljainen: asiakas saa väärän merkkijonon, yhteysyritys päättyy eikä skripti raportoi mitään hyödyllistä.

Aja asiakas kerran käsin samaa yhdyskäytävää ja versiota vasten ja kirjoita kehotteet ylös siinä järjestyksessä kuin ne tulevat. Se loki on määrittely, jonka skriptisi on täytettävä.

Mitä asiakas odottaa

Tavallisessa yhden ryhmän tapauksessa järjestys on käyttäjänimi, salasana ja joskus bannerin vahvistus. Here-documentin ensimmäisestä rivistä tulee valikkohakemisto vain silloin, kun palvelin todella näyttää valikon, ja siksi sama skripti toimii yhdessä paikassa ja epäonnistuu seuraavassa.

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

Lue se neljänä vastauksena neljään mahdolliseen kysymykseen, ei kiinteänä protokollana. Nolla on valintavalinta, ei salasana, ja lopun y hyväksyy bannerin, jota monet yhdyskäytävät eivät koskaan lähetä.

Käytä expectiä, kun järjestys ei ole ennustettavissa

Kun kehotteiden järjestys vaihtelee, lopeta rivien laskeminen ja odota kehotetta sen sijaan. expect-skripti käynnistää connect-komennon, odottaa käyttäjänimikehotetta, lähettää, odottaa salasanakehotetta, lähettää ja odottaa sitten yhdistettyä tilaa. Jokaisella odotuksella on oma aikakatkaisunsa.

Käsittele aikakatkaisu virheenä ja poistu. Skripti, joka jatkaa syötteen lähettämistä odottamattoman kehotteen jälkeen, kirjoittaa mielellään salasanan kuoreen, valikkoon tai mihin tahansa muuhun, joka sattuu lukemaan. Näin kirjautumisskriptistä tulee tapaus.

expect antaa myös lokin, jota voit pitää ilman salaisuutta, ja se on arvokkaampi kuin poistumiskoodi, kun yhdyskäytävä muuttaa kehotteitaan päivityksen jälkeen.

Salaisuuden on asuttava jossain

Tämän ongelman jokaisessa versiossa on yksi heikkous: salasanan on oltava muodossa, jonka asiakas pystyy lukemaan. Argumenttina välittäminen paljastaa sen prosessitaulussa. Putken läpi kaiuttaminen jättää sen usein kuoren historiaan. Molemmat ovat muiden paikallisten käyttäjien luettavissa jaetulla hyppyisännällä.

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

Tilin omistama tiedosto oikeuksilla 600 on vähimmäisvaatimus, ja se on yhä salaamaton salaisuus levyllä. secret-tool lookup lukee Linuxin avainrenkaasta, ja macOS:ssä saman työn tekee security find-generic-password -w. Missä organisaatio tukee varmenne- tai SAML-todennusta, suosi sitä, koska tallennettu salasana ja MFA eivät silti pysty suorittamaan kirjautumista ilman ihmistä.

Vahvista tunneli ja ota sitten sulkeminen haltuusi

Älä luota virhetekstin puuttumiseen. Kysy asiakkaalta sen tila ja tarkista liitäntä erikseen:

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

Tilan pitäisi näyttää Connected, ja tunneliliitännällä pitäisi olla osoite. Pyydä sitten yhtä resurssia, johon tunnelin pitäisi päästä, koska yhdistetty tila ilman reittiä on todellinen lopputulos ja helppo jättää huomaamatta.

Katkaise yhteys komennolla vpn disconnect ja anna tunnelin käynnistäneen skriptin hoitaa sulkeminen. Epäonnistunut työ, joka jättää istunnon auki, kuluttaa lisenssipaikan ja näyttää seuraavalle yrittäjälle todennusongelmalta.

Työn järjestys: vahvista vpnagentd, tallenna kehotteiden todellinen järjestys, valitse here-document tai expect, pidä salaisuus poissa argv:sta ja historiasta, tarkista tila ja yksi resurssi ja katkaise sitten yhteys samassa skriptissä.

Aiheeseen liittyvät artikkelit