AnyConnect sistemoje Linux: saugus prisijungimo sekos skriptavimas
Cisco AnyConnect vpn dvejetainis failas skaito atsakymus iš stdin, ir to pakanka pakartojamam prisijungimui. Sudaryk seką, apsaugok failą, patikrink ir sustok.
Cisco AnyConnect vpn klientas elgiasi kaip pokalbis: išspausdina raginimą, laukia eilutės ir tada išspausdina kitą. Paduok šį pokalbį iš failo arba vamzdžio ir tas pats dvejetainis failas veikia be priežiūros. Technika yra vienas peradresavimas ir sutvarkytas atsakymų sąrašas, ir būtent sąrašas, o ne peradresavimas, lemia, ar skriptas patikimas.
Praktiškai tai sugadina du dalykai. Ragginimų tvarka pasislenka, kai vartai paprašo ko nors papildomo, o išsaugotas slaptažodis vieną rašybos klaidą paverčia paskyros užrakinimu. Traktuok seką kaip versionuotus duomenis, kuriuos gali palyginti po kiekvieno vartų pakeitimo. Žlungi garsiai, o ne bandyk iš naujo, nes ciklas yra būtent tas kelias, kuriuo neteisingai įvestas slaptažodis tampa užrakinta paskyra.
Viena seka, tokia tvarka, kokia klientas klausia
Paleisk klientą vieną kartą interaktyviai ir užrašyk kiekvieną raginimą ta tvarka, kokia jis pasirodo. Ta išraša tampa atsakymų failu. Kai peradresuoji failą į dvejetainį failą, pirmoji eilutė turi būti pati prisijungimo komanda, todėl seka prasideda mazgo vardu, o ne naudotojo vardu.
connect vpn.example.com
0
<username>
<password>
y
exit
Plikas 0 parenka pirmąjį prisijungimo profilį, kai vartai siūlo sąrašą; naudok tą indeksą, kurį išspausdina tavo vartai. y priima prisijungimo reklamjuostę, todėl ištrink tą eilutę, jei reklamjuostės nėra, ir įterpk vieną ten, kur tavo vartai užduoda papildomą klausimą. Baigiamasis exit leidžia klientui švariai baigti, kai paskutinis atsakymas jau sunaudotas.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Neinteraktyvus režimas čia nepasirenkamas. Be -s klientas gali užvaldyti terminalą ir ignoruoti peradresuotą įvestį; su juo atsakymai skaitomi iš srauto ir procesas grįžta. Kur dvejetainiam failui reikia padidintų teisių, apvyniok kvietimą į sudo -n, kad skriptas iškart žlugtų, o ne užstrigtų prie slaptažodžio raginimo.
Kur nuteka atsakymų failas
Failas su slaptažodžiu yra prisijungimo duomenys, todėl suteik jam tokias teises: 600 režimas, priklauso paskyrai, kuri vykdo darbą, ir niekada bendrame ar sinchronizuotame kataloge. Sukurk jį su jau pritaikytu režimu, o ne taisyk vėliau, nes failas tarp įrašymo ir chmod trumpam yra visiems skaitomas.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Kita pusė yra argv. Slaptažodis, perduotas kaip argumentas, matomas kiekvienam vietiniam naudotojui, kuris išvardija procesus, ir jis taip pat patenka į shell istoriją. Skaityk jį iš failo deskriptoriaus arba aplinkos kintamojo, ir įdėk naudingąją apkrovą į kabutes, kad shell negalėtų nieko joje išplėsti.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Stebėk kabutes. Dvigubose kabutėse slaptažodį su ! interaktyvus shell gali išplėsti dar prieš klientui jį pamatant, o klaida ateina kaip bendra event-not-found klaida, kuri atrodo kaip protokolo problema.
Įrodyk tunelį, tada uždaryk jį
Prisijungta būsena įrodo tik tai, kad klientas tiki turįs sesiją. Pasirink mazgą, kuris atsako tik iš įmonės tinklo vidaus, ir išbandyk jį vieną kartą prieš ką nors darant. Nesėkmė ten yra maršrutizavimo ar politikos trūkumas, ir prisijungimo pakartojimas to nepakeis.
/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
Patikrink būsenos išvestį prieš atjungimą ir po jo. Klientas, paliktas su pasenusia sesija, gali atmesti kitą prisijungimą, kol skriptas vis dar praneša apie sėkmę, ir šis gedimo būdas nematomas, jei žiūri tik į išėjimo kodus. Palygink abu nuskaitymus, o ne pasikliauk antruoju vienu. Shell profilio slapyvardžiai pakanka kasdieniam naudojimui, o viskas suplanuota nusipelno tos pačios prisijungimo duomenų ir tapatybės peržiūros kaip ir bet koks kitas darbas be priežiūros.
Kai fiksuotas sąrašas nustoja būti saugus
Atsakymų failas užkoduoja šiandieninę raginimų tvarką. Pasikeitusi reklamjuostė, priverstinis slaptažodžio keitimas ar antrojo veiksnio iššūkis paverčia jį ciklu, kuris gali užrakinti paskyrą, todėl skriptas turi išeiti prie pirmo netikėto atsakymo, o ne persikrauti.
Užfiksuok, ką klientas išspausdino, grąžink ne nulinį statusą ir palik sprendimą kviečiančiajam. Kur vartai reikalauja antrojo veiksnio, sąžiningas atsakymas yra tas, kad tam profiliui prisijungimas be priežiūros neprieinamas, o ne tai, kad sekai reikia dar vienos eilutės.
Rotacija priklauso tai pačiai peržiūrai. Jei prisijungimo duomenys saugomi, nuspręsk, kas gali juos skaityti, kada jie keičiasi ir kas juos pašalina, kai mazgas perstatomas. Skriptas, kuris veikia metus, nes niekas nelietė slaptažodžio, nėra dizainas, o nelaimė, laukianti rotacijos politikos.
Profiliai, kurie nėra AnyConnect
Du senesni Cisco prisijungimo duomenų stiliai painiojami su šiuo. Profilis vpnc prašo IPSec ID, kuris iš tikrųjų yra grupės pavadinimas, tada grupės paslapties, tada tavo pačių duomenų, ir visi trys ateina iš to, kas administruoja vartus. Senasis Cisco IPsec yra kitas protokolas nei AnyConnect, todėl vpnc negali pasiekti tik-AnyConnect paslaugos; openconnect --protocol=anyconnect yra atvirasis klientas tam darbui.
Failas .pcf aprašo senesnį kliento profilį. Jame esantį mazgą, grupės pavadinimą ir grupės slaptažodį galima rankiniu būdu įvesti iš naujo kliente, kuris kalba Cisco IPsec, nors failas nėra universalus importas ir bet koks nestandartinis prievadas ar tuneliavimo režimas paprastai dingsta perkeliant.
Pradėk nuo to, ką vartai iš tikrųjų siūlo, tada pasirink klientą, kuris kalba tuo protokolu. Profilio kopijavimas iš kitos svetainės yra kelias, kuriuo žmonės pradeda derinti prisijungimo duomenis, kurie niekada nebuvo problema.