Uzskats ir tāds, ka here-dokuments ar četrām rindām ir pilnīga neinteraktīva pieteikšanās, un tas pastāv tieši līdz brīdim, kad vārteja piedāvā divas grupas, izdrukā baneri vai pēc paroles pieprasa tokenu. Tad tas pats skripts ieraksta paroli izvēlnē, kas gaidīja skaitli. Komandrindas klients Linux vidē ir skriptējams, bet tikai tad, ja tam dodat to, ko tas patiešām gaida, nevis to, ko pieņēma apmācība.

Fiksētais here-dokuments ir mīts

Cisco Linux klients instalē nelielu programmu /opt/cisco/anyconnect/bin/vpn, un Secure Client 5 to joprojām piegādā. Kamēr darbojas pakalpojums vpnagentd, karodziņš -s nolasa atbildes no standarta ievades tādā secībā, kādā klients tās pieprasa. Šī secība serveru starpā nav fiksēta.

Grupu izvēlne pievieno vienu rindu. Pieteikšanās baneris pievieno vēl vienu. Tokena pieprasījums pēc paroles pilnībā salauž četru rindu skriptu, jo piektā rinda nekad nebija domāta tokenam. Kļūme ir klusa: klients saņem nepareizu virkni, savienojuma mēģinājums beidzas, un skripts neziņo neko noderīgu.

Palaidiet klientu ar roku vienu reizi pret to pašu vārteju un versiju un pierakstiet uzvednes to parādīšanās secībā. Šis pieraksts ir specifikācija, kurai jāatbilst jūsu skriptam.

Ko klients gaida

Ierastajā vienas grupas gadījumā secība ir lietotājvārds, parole un dažreiz banera apstiprinājums. Here-dokumenta pirmā rinda kļūst par izvēlnes indeksu tikai tad, kad serveris patiešām rāda izvēlni, tāpēc viens un tas pats skripts strādā vienā vietā un neizdodas nākamajā.

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

Lasiet to kā četras atbildes uz četriem iespējamiem jautājumiem, nevis kā fiksētu protokolu. Nulle ir izvēlnes izvēle, nevis parole, un beigu y pieņem baneri, ko daudzas vārtejas nekad nesūta.

Izmantojiet expect, ja secība nav paredzama

Kad uzvedņu secība mainās, pārtrauciet skaitīt rindas un tā vietā gaidiet uzvedni. Expect skripts palaiž komandu connect, gaida lietotājvārda uzvedni, nosūta, gaida paroles uzvedni, nosūta un pēc tam gaida savienotā stāvokli. Katrai gaidīšanai ir savs taimauts.

Uzskatiet taimautu par kļūmi un izejiet. Skripts, kas pēc negaidītas uzvednes turpina sūtīt ievadi, labprāt ierakstīs paroli čaulā, izvēlnē vai jebkur citur, kas nejauši lasa. Tā pieteikšanās skripts kļūst par incidentu.

Expect sniedz arī pierakstu, ko varat reģistrēt ar izņemtu noslēpumu, un tas ir vērtīgāk par izejas kodu, kad vārteja pēc jaunināšanas maina savas uzvednes.

Noslēpumam kaut kur jādzīvo

Katrai šīs problēmas versijai ir viena vājība: parolei jāpastāv tādā formā, ko klients var nolasīt. Nododot to kā argumentu, tā tiek atklāta procesu tabulā. Izvadot to caur cauruli, tā bieži nonāk čaulas vēsturē. Abus var nolasīt citi vietējie lietotāji koplietotā starphostā.

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

Fails ar režīmu 600, kas pieder kontam, ir minimums, un tas joprojām ir vienkārša teksta noslēpums diskā. secret-tool lookup lasa no Linux atslēgu saišķa, un macOS to pašu darbu veic security find-generic-password -w. Kur organizācija atbalsta sertifikāta vai SAML autentifikāciju, dodiet tai priekšroku, jo saglabāta parole plus MFA joprojām nevar pabeigt pieteikšanos bez cilvēka.

Apstipriniet tuneli, tad pārņemiet atvienošanu

Neuzticieties kļūdas teksta neesamībai. Pajautājiet klientam tā stāvokli un pārbaudiet saskarni neatkarīgi:

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

Stāvoklim jābūt Connected, un tuneļa saskarnei jābūt ar adresi. Pēc tam pieprasiet vienu resursu, kuram tunelim jāsasniedz, jo savienots stāvoklis bez maršruta ir reāls iznākums, un to ir viegli nepamanīt.

Atvienojieties ar vpn disconnect un ļaujiet skriptam, kas palaida tuneli, pārņemt atvienošanu. Neveiksmīgs darbs, kas atstāj sesiju atvērtu, patērē licences vietu un izskatās kā autentifikācijas problēma nākamajam, kas mēģina.

Darbu secība: apstipriniet vpnagentd, reģistrējiet īsto uzvedņu secību, izvēlieties here-dokumentu vai expect, turiet noslēpumu ārpus argv un vēstures, pārbaudiet stāvokli un vienu resursu, tad atvienojieties tajā pašā skriptā.

Saistītie raksti