A hit az, hogy egy négy soros here-document teljes, nem interaktív bejelentkezés, és ez egészen addig tart, amíg az átjáró két csoportot nem kínál, nem nyomtat bannert, vagy a jelszó után nem kér tokent. Akkor ugyanaz a szkript beírja a jelszót egy menübe, amely számot várt. A Linux parancssori kliens szkriptelhető, de csak akkor, ha azt adja neki, amire valóban vár, és nem azt, amit az útmutató feltételezett.

A rögzített here-document mítosz

A Cisco Linux-kliense egy kis programot telepít ide: /opt/cisco/anyconnect/bin/vpn, és a Secure Client 5 még mindig szállítja. Ha a vpnagentd szolgáltatás fut, a -s kapcsoló a szabványos bemenetről olvassa a válaszokat abban a sorrendben, ahogy a kliens kéri őket. Ez a sorrend szerverenként nem rögzített.

Egy csoportmenü egy sort ad hozzá. Egy bejelentkezési banner még egyet. A jelszó utáni tokenkérés teljesen széttöri a négy soros szkriptet, mert az ötödik sor soha nem a token lett volna. A hiba csendes: a kliens rossz karakterláncot kap, a kapcsolódási kísérlet véget ér, és a szkript semmi hasznosat nem jelent.

Futtassa a klienst egyszer kézzel ugyanazzal az átjáróval és verzióval, és írja fel a kéréseket abban a sorrendben, ahogy jönnek. Az a jegyzőkönyv a specifikáció, amelyet a szkriptnek teljesítenie kell.

Mire vár a kliens

A szokásos egycsoportos esetben a sorrend felhasználónév, jelszó és néha bannermegerősítés. A here-document első sora csak akkor lesz menüindex, ha a szerver valóban mutat menüt, ezért működik ugyanaz a szkript az egyik helyen, és hiúsul meg a következőn.

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

Olvassa ezt négy válasznak négy lehetséges kérdésre, nem rögzített protokollnak. A nulla menüválasztás, nem jelszó, és a záró y olyan bannert fogad el, amelyet sok átjáró soha nem küld.

Használjon expectet, ha a sorrend nem kiszámítható

Ha a kérések sorrendje változik, hagyja abba a sorok számlálását, és várjon a kérésre. Az expect szkript elindítja a connect parancsot, vár a felhasználónév-kérésre, küld, vár a jelszókérésre, küld, majd vár a csatlakozott állapotra. Minden várakozásnak saját időkorlátja van.

Az időtúllépést kezelje hibaként, és lépjen ki. Az a szkript, amely egy váratlan kérés után tovább küld bemenetet, készségesen beírja a jelszót egy héjba, egy menübe vagy bármi másba, ami éppen olvas. Így válik egy bejelentkező szkript incidenssé.

Az expect olyan jegyzőkönyvet is ad, amelyet a titok eltávolításával naplózhat, és ez többet ér a kilépési kódnál, amikor egy átjáró frissítés után megváltoztatja a kéréseit.

A titoknak valahol élnie kell

A probléma minden változatának egyetlen gyengéje van: a jelszónak olyan formában kell léteznie, amelyet a kliens olvasni tud. Argumentumként átadva kitettség lesz a folyamattáblában. Csövön keresztül visszhangozva gyakran a héj előzményeibe kerül. Mindkettőt olvashatják más helyi felhasználók egy megosztott ugróhoszton.

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

A fiók tulajdonában lévő, 600 módú fájl a minimum, és továbbra is titok sima szövegként a lemezen. A secret-tool lookup a Linux kulcskarikáról olvas, macOS-en ugyanezt a security find-generic-password -w végzi. Ahol a szervezet támogatja a tanúsítványos vagy SAML-hitelesítést, azt részesítse előnyben, mert a tárolt jelszó és az MFA együtt sem tud ember nélkül befejezni egy bejelentkezést.

Erősítse meg az alagutat, majd vegye át a lezárást

Ne bízzon a hibaüzenet hiányában. Kérdezze meg a klienst az állapotáról, és ellenőrizze külön a csatolót:

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

Az állapotnak Connected értéket kell mutatnia, és az alagút csatolójának címmel kell rendelkeznie. Ezután kérjen le egy erőforrást, amelyet az alagútnak el kell érnie, mert az útvonal nélküli csatlakozott állapot valódi kimenet, és könnyű figyelmen kívül hagyni.

Bontsa a kapcsolatot a vpn disconnect paranccsal, és hagyja, hogy az alagutat indító szkript vegye át a lezárást. Egy sikertelen feladat, amely nyitva hagy egy munkamenetet, licenchelyet fogyaszt, és a következő próbálkozónak hitelesítési problémának tűnik.

A munka sorrendje: erősítse meg a vpnagentd-t, rögzítse a kérések valódi sorrendjét, válasszon here-document vagy expect közül, tartsa a titkot az argv-n és az előzményeken kívül, ellenőrizze az állapotot és egy erőforrást, majd ugyanabban a szkriptben bontsa a kapcsolatot.

Kapcsolódó cikkek