Skripts, kas palaiž piegādātāja VPN klientu, karājas, līdz beidzas taimauts, un žurnālā redzams, ka klients pieprasa verifikācijas kodu, kuru neviens nav ievadījis. Parole tika nodota, tāpēc acīmredzamais secinājums ir, ka parole ir nepareiza. Tā nav. Koda pieprasījums ir atsevišķa saruna atsevišķā kanālā, un jūsu skripts to nekad nav atvēris.

Veiciet piecas pārbaudes zemāk pēc kārtas. Apstājieties pie pirmās, kas neizdodas, jo katrs nākamais solis pieņem, ka iepriekšējie ir spēkā.

1. pārbaude: vai klients vispār nolasa standarta ievadi?

Pārbaudiet pirms jebkādas automatizācijas rakstīšanas: padodiet klientam viltus noslēpumu pa cauruli un skatieties, kas notiek. Ja tas izdrukā savu pieprasījumu un pēc tam gaida, tas cauruli nelasa.

Daudzi klienti tieši atver termināļa ierīci vai atsakās saņemt noslēpumu no plūsmas, kas nav terminālis, lai nomaldījusies caurule nevarētu noplūdināt paroli. OpenVPN ir dokumentētais izņēmums, jo --auth-user-pass pieņem faila ceļu. Piegādātāju klienti, kas pieprasa vienreizēju kodu, parasti nav ar līdzvērtīgu opciju, un to pieprasījums gaida termināli, kuru jūsu skripts nekad nav nodrošinājis.

2. pārbaude: vai bērna procesam ir terminālis?

pty piešķir bērnam termināli, kas pieprasījumus pārvērš lasāmā izvadē, uz kuru varat atbildēt pēc kārtas.

import pexpect

child = pexpect.spawn("openconnect vpn.example.net", encoding="utf-8", timeout=30)
child.expect("GROUP:")
child.sendline("staff")
child.expect("USERNAME:")
child.sendline("alice")
child.expect("PASSWORD:")
child.sendline(PASSWORD)
child.expect("Connected as", timeout=60)

Iepriekš minētās pieprasījumu virknes ir ilustratīvas; nokopējiet precīzo tekstu, ko izdrukā jūsu klients, ieskaitot lielos un mazos burtus un pieturzīmes. Katram gaidījumam ir taimauts, un aizvērts bērns izmet izņēmumu, nevis atgriež statusu, tāpēc ietiniet secību un faila beigas uzskatiet par neveiksmi. Ievērojiet, ko šis bloks nedara: bērns mirst kopā ar skriptu, jo pty nav atvienošanas mehānisms un disown ir čaulas iebūvēta komanda, kas nevar sasniegt procesu, kuru jūsu skripts izveidoja.

3. pārbaude: vai ir atbalstīta neinteraktīva ievade?

Ekrāna skrāpēšana lūzt klienta atjauninājumos, tāpēc vispirms meklējiet dokumentētu opciju.

Pārbaudiet palīdzības izvadi, vai ir žetona vai vienreizēja koda opcija, un pārbaudiet, vai pakalpojums pieņem kodu, kas pievienots paroles laukam. Kur klients lasa akreditācijas failu, dodiet tam failu, nevis pieprasījumu:

openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")

Procesu aizstāšana dod klientam lasāmu ceļu sistēmās, kas nodrošina /dev/fd. Noslēpums no klienta viedokļa joprojām ir noslēpums, tāpēc turiet to ārpus žurnāliem, čaulas vēstures un procesu sarakstiem. Ja klients noraida /dev/fd vai atver akreditācijas ceļu vairāk nekā vienu reizi, ierakstiet īstu failu ar stingrām atļaujām un izdzēsiet to tajā pašā skriptā.

4. pārbaude: vai tunelis pārdzīvos skriptu?

Pēc noklusējuma tunelis mirst kopā ar savu vecāku, kas ir pretēji tam, kas nepieciešams palaišanas skriptam.

disown -h palīdz tikai tad, ja klientu palaidāt kā čaulas uzdevumu, jo tā rediģē šīs čaulas uzdevumu tabulu un nevar sasniegt procesu, kuru jūsu skripts palaida ar pty. Pakalpojumu pārvaldnieks ir labākas mājas visam, kam jāpieslēdzas no jauna bez uzraudzības, jo tas restartē klientu un fiksē, kāpēc tas nomira. Jebkurā gadījumā pēc katras atkārtotas pieslēgšanās gaidiet jaunu kodu: vienreizējs žetons tiek iztērēts pirmajā veiksmīgajā autentifikācijā.

Ievērojiet, ko sudo dara ar secību. sudo paroles pieprasījums nav VPN pieprasījums, un atbildēt uz to ar VPN paroli ir visizplatītākais veids, kā citādi pareiza gaidījumu secība tomēr neizdodas.

5. pārbaude: vai cilvēka kodam jābūt skriptā?

Šī ir pārbaude, ko cilvēki izlaiž. Žetons pieder cilvēkam, bet tunelis, kuram jāpaceļas pēc grafika, pieder mašīnai.

Ja darbam jāpieslēdzas no jauna bez uzraudzības, jautājiet, vai mašīnas sertifikāts vai pakalpojuma konts var aizstāt interaktīvo pieteikšanos. Kāda vienreizēja koda automatizēšana pārvērš otro faktoru glabātā noslēpumā, un tās ir politikas izmaiņas, nevis skriptēšanas ērtība. Kur pakalpojums atbalsta abus, izvēlieties akreditāciju, kas atbilst tam, kā darbs patiešām darbojas. Pierakstiet atbildi, jo nākamais cilvēks jautās, kāpēc skripts tur žetonu.

Kā izskatās strādājošs skripts

Skripts izdrukā sasniegto soli, nekad noslēpumu, un jebkura neizdevusies gaidījuma gadījumā beidz ar kodu, kas nav nulle.

Pārbaudiet to, tīši salaužot: nepareiza parole, nepareiza grupa, beidzies žetons. Katrai neveiksmei jāapstājas nosauktā solī, nevis jākarājas. Pēc tam palaidiet to vienreiz pret īsto pakalpojumu un pārbaudiet tuneli no skripta ārpuses, nevis iekšpuses.

Saistītie raksti