Cisco Secure Clienti sisselogimine Linuxi kestast, ilma graafilise liideseta
Here-document ei ole sisselogimisprotokoll. Kirjuta üles tegelik viipade järjekord, kasuta expecti, kui see muutub, ja hoia parool argv-st ja ajaloost eemal.
Arvatakse, et neljarealine here-document on täielik mitteinteraktiivne sisselogimine, ja see arvamus püsib täpselt seni, kuni lüüs pakub kahte gruppi, prindib bänneri või küsib pärast parooli tokenit. Siis trükib sama skript parooli menüüsse, mis ootas numbrit. Linuxi käsureaklienti saab skriptida, kuid ainult siis, kui annad talle selle, mida ta tegelikult ootab, mitte selle, mida õpetus eeldas.
Fikseeritud here-document on müüt
Cisco Linuxi klient paigaldab väikese programmi asukohta /opt/cisco/anyconnect/bin/vpn ja Secure Client 5 tarnib selle endiselt. Kui teenus vpnagentd töötab, loeb lipp -s vastuseid standardsisendist selles järjekorras, milles klient neid küsib. See järjekord ei ole serverite lõikes fikseeritud.
Grupimenüü lisab ühe rea. Sisselogimisbänner lisab teise. Tokeni küsimine pärast parooli lõhub neljarealise skripti täielikult, sest viies rida ei pidanud kunagi token olema. Tõrge on vaikne: klient saab vale stringi, ühenduskatse lõpeb ja skript ei teata midagi kasulikku.
Käivita klient üks kord käsitsi sama lüüsi ja versiooni vastu ning kirjuta viibad üles selles järjekorras, nagu need ilmuvad. See logi on spetsifikatsioon, mida sinu skript peab täitma.
Mida klient ootab
Tavalisel ühe grupi juhul on järjekord kasutajanimi, parool ja mõnikord bänneri kinnitus. Here-documenti esimene rida muutub menüüindeksiks ainult siis, kui server tõesti menüü esitab, ja seepärast töötab sama skript ühes kohas ning ebaõnnestub järgmises.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Loe seda nelja vastusena neljale võimalikule küsimusele, mitte fikseeritud protokollina. Null on menüüvalik, mitte parool, ja lõpus olev y kinnitab bänneri, mida paljud lüüsid kunagi ei saada.
Kasuta expecti, kui järjekord ei ole etteaimatav
Kui viipade järjekord muutub, lõpeta ridade lugemine ja oota viipa. expect-skript käivitab käsu connect, ootab kasutajanime viipa, saadab, ootab parooli viipa, saadab ja seejärel ootab ühendatud olekut. Igal ootamisel on oma ajalimiit.
Käsitle ajalimiidi ületamist tõrkena ja välju. Skript, mis jätkab sisendi saatmist pärast ootamatut viipa, trükib hea meelega parooli kestasse, menüüsse või millesse iganes parajasti loeb. Nii muutub sisselogimisskript juhtumiks.
expect annab sulle ka logi, mida saad pidada eemaldatud saladusega, ja see on väärtuslikum kui väljumiskood, kui lüüs pärast uuendust oma viipu muudab.
Saladus peab kuskil elama
Selle probleemi igal versioonil on üks nõrkus: parool peab olema kujul, mida klient suudab lugeda. Argumendina edastamine paljastab selle protsessitabelis. Toru kaudu kõlamine paneb selle sageli kesta ajalukku. Mõlemat saavad lugeda teised kohalikud kasutajad jagatud hüppehostis.
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Konto omanikule kuuluv fail õigustega 600 on miinimum, ja see on ikka krüpteerimata saladus kettal. secret-tool lookup loeb Linuxi võtmerõngast ja macOS-is teeb sama tööd security find-generic-password -w. Kus organisatsioon toetab sertifikaadi või SAML-i autentimist, eelista seda, sest salvestatud parool pluss MFA ei suuda ikkagi ilma inimeseta sisselogimist lõpetada.
Kinnita tunnel ja seejärel võta sulgemine enda kanda
Ära usalda veateksti puudumist. Küsi kliendilt olekut ja kontrolli liidest eraldi:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Olek peaks näitama Connected ja tunneliliidesel peaks olema aadress. Seejärel küsi ühte ressurssi, millele tunnel peaks ligi pääsema, sest ühendatud olek ilma marsruudita on tegelik tulemus ja kergesti märkamata jääv.
Katkesta ühendus käsuga vpn disconnect ja lase skriptil, mis tunneli käivitas, sulgemise enda kanda võtta. Ebaõnnestunud töö, mis jätab sessiooni avatuks, kulutab litsentsikoha ja näeb järgmisele proovijale autentimisprobleemina.
Töö järjekord: kinnita vpnagentd, jäädvusta tegelik viipade järjekord, vali here-document või expect, hoia saladus argv-st ja ajaloost eemal, kontrolli olekut ja üht ressurssi ning katkesta siis ühendus samas skriptis.