Մուտք Cisco Secure Client-ից Linux shell-ից՝ առանց GUI-ի
here-document-ը մուտքի արձանագրություն չէ։ Գրանցեք հուշումների իրական հերթականությունը, օգտագործեք expect, երբ այն փոխվում է, և գաղտնաբառը պահեք argv-ից և պատմությունից դուրս։
Համոզմունքն այն է, որ չորս տողից բաղկացած here-document-ը ամբողջական ոչ ինտերակտիվ մուտք է, և այն դիմանում է մինչև այն պահը, երբ դարպասը առաջարկում է երկու խումբ, տպում է banner կամ գաղտնաբառից հետո token է պահանջում։ Այդ ժամանակ նույն script-ը գաղտնաբառը գրում է մենյուի մեջ, որը սպասում էր թվի։ Linux-ի հրամանի տողի client-ը ենթակա է script-ավորման, բայց միայն այն դեպքում, եթե տալիս եք այն, ինչին նա իրականում սպասում է, և ոչ այն, ինչ ենթադրել է ձեռնարկը։
Ֆիքսված here-document-ը առասպել է
Cisco-ի Linux client-ը տեղադրում է փոքր ծրագիր /opt/cisco/anyconnect/bin/vpn հասցեում, և Secure Client 5-ը դեռ մատակարարում է այն։ Երբ vpnagentd ծառայությունը աշխատում է, -s դրոշակը պատասխանները կարդում է ստանդարտ մուտքից այն հերթականությամբ, որով client-ը հարցնում է դրանք։ Այդ հերթականությունը սերվերների միջև ֆիքսված չէ։
Խմբային մենյուն ավելացնում է մեկ տող։ Մուտքի banner-ը՝ ևս մեկը։ Գաղտնաբառից հետո token պահանջելը լիովին կոտրում է չորս տողանոց script-ը, քանի որ հինգերորդ տողը երբեք token չէր լինելու։ Ձախողումը լուռ է՝ client-ը ստանում է սխալ տող, կապի փորձը ավարտվում է, և script-ը ոչ մի օգտակար բան չի հաղորդում։
Գործարկեք client-ը ձեռքով մեկ անգամ նույն դարպասի և տարբերակի դեմ, և գրի առեք հուշումները այն հերթականությամբ, ինչպես դրանք հայտնվում են։ Այդ արձանագրությունը այն բնութագիրն է, որը ձեր script-ը պետք է բավարարի։
Ինչին է սպասում client-ը
Սովորական մեկ խմբի դեպքում հաջորդականությունը օգտանունն է, գաղտնաբառը և երբեմն banner-ի հաստատումը։ here-document-ի առաջին տողը մենյուի ինդեքս է դառնում միայն այն ժամանակ, երբ սերվերը իսկապես մենյու է ցուցադրում, և դրա համար է, որ նույն script-ը աշխատում է մի տեղում և ձախողվում հաջորդում։
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Կարդացեք սա որպես չորս պատասխան չորս հնարավոր հարցի, ոչ որպես ֆիքսված արձանագրություն։ Զրոն մենյուի ընտրություն է, ոչ գաղտնաբառ, և վերջի y-ը ընդունում է banner, որը շատ դարպասներ երբեք չեն ուղարկում։
Օգտագործեք expect, երբ հերթականությունը կանխատեսելի չէ
Երբ հուշումների հերթականությունը փոխվում է, դադարեք տողեր հաշվել և փոխարենը սպասեք հուշմանը։ expect script-ը գործարկում է connect հրամանը, սպասում է օգտանվան հուշմանը, ուղարկում է, սպասում է գաղտնաբառի հուշմանը, ուղարկում է, ապա սպասում է միացված վիճակին։ Յուրաքանչյուր սպասում ունի իր ժամկետը։
Ժամկետի սպառումը համարեք ձախողում և դուրս եկեք։ script-ը, որը անսպասելի հուշումից հետո շարունակում է մուտք ուղարկել, ուրախությամբ գաղտնաբառը կգրի shell-ի, մենյուի կամ ցանկացած այլ բանի մեջ, որն այդ պահին կարդում է։ Այսպես է մուտքի script-ը դառնում միջադեպ։
expect-ը նաև տալիս է արձանագրություն, որը կարող եք պահել գաղտնիքը հեռացված վիճակում, և դա ավելի արժեքավոր է, քան ելքի կոդը, երբ դարպասը թարմացումից հետո փոխում է իր հուշումները։
Գաղտնիքը պետք է ինչ-որ տեղ ապրի
Այս խնդրի յուրաքանչյուր տարբերակ ունի մեկ թուլություն՝ գաղտնաբառը պետք է գոյություն ունենա այնպիսի ձևով, որը client-ը կարողանում է կարդալ։ Որպես արգումենտ փոխանցելը բացահայտում է այն պրոցեսների աղյուսակում։ Խողովակով արտացոլելը հաճախ այն դնում է shell-ի պատմության մեջ։ Երկուսն էլ կարդալի են այլ տեղական օգտատերերի համար համօգտագործվող ցատկող հոսթում։
install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net
Հաշվի սեփականության տակ գտնվող 600 ռեժիմով ֆայլը նվազագույնն է, և այն դեռևս բաց տեքստով գաղտնիք է սկավառակի վրա։ secret-tool lookup-ը կարդում է Linux-ի բանալիների օղակից, իսկ macOS-ում նույն աշխատանքը կատարում է security find-generic-password -w-ը։ Այնտեղ, որտեղ կազմակերպությունը աջակցում է վկայագրով կամ SAML նույնականացմանը, նախապատվությունը տվեք դրան, որովհետև պահված գաղտնաբառը և MFA-ն միասին էլ չեն կարող ավարտել մուտքը առանց մարդու։
Հաստատեք թունելը, ապա ստանձնեք փակումը
Չվստահեք սխալի տեքստի բացակայությանը։ Հարցրեք client-ին նրա վիճակի մասին և ինտերֆեյսը ստուգեք առանձին՝
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Վիճակը պետք է ցույց տա Connected, և թունելի ինտերֆեյսը պետք է ունենա հասցե։ Այնուհետև պահանջեք մեկ ռեսուրս, որին թունելը պետք է հասնի, որովհետև առանց երթուղու միացված վիճակը իրական արդյունք է և հեշտ բաց թողնվող։
Անջատվեք vpn disconnect-ով, և թույլ տվեք, որ թունելը սկսած script-ը ստանձնի փակումը։ Ձախողված աշխատանքը, որը բաց է թողնում սեսիան, ծախսում է լիցենզիայի տեղ և հաջորդ փորձողին թվում է նույնականացման խնդիր։
Աշխատանքի հերթականությունը՝ հաստատեք vpnagentd-ն, գրանցեք հուշումների իրական հերթականությունը, ընտրեք here-document կամ expect, պահեք գաղտնիքը argv-ից և պատմությունից դուրս, ստուգեք վիճակը և մեկ ռեսուրս, ապա անջատվեք նույն script-ում։