GUI-сыз Linux қабықшасынан Cisco Secure Client-ке кіру
here-document — кіру протоколы емес. Сұраулардың нақты ретін жазып алыңыз, ол өзгерсе expect қолданыңыз, ал құпиясөзді argv мен тарихтан тыс ұстаңыз.
Төрт жолдан тұратын here-document толық интерактивті емес кіру деген сенім бар, және ол шлюз екі топ ұсынғанша, баннер басып шығарғанша немесе құпиясөзден кейін токен сұрағанша сақталады. Сонда сол скрипт құпиясөзді сан күтіп тұрған мәзірге жазып салады. Linux-тегі пәрмен жолы клиентін скрипттеуге болады, бірақ оған оқулық болжаған нәрсені емес, шын мәнінде күтіп тұрған нәрсені берсеңіз ғана.
Қатып қалған here-document — аңыз
Cisco-ның Linux клиенті /opt/cisco/anyconnect/bin/vpn жеріне шағын бағдарлама орнатады, және Secure Client 5 оны әлі де жеткізеді. vpnagentd қызметі жұмыс істеп тұрғанда, -s жалаушасы жауаптарды стандартты кірістен клиент сұраған ретпен оқиды. Бұл рет серверлер арасында тұрақты емес.
Топ мәзірі бір жол қосады. Кіру баннері тағы бір жол қосады. Құпиясөзден кейін токен сұрау төрт жолдық скриптті толығымен бұзады, өйткені бесінші жол ешқашан токен болмауы керек еді. Сәтсіздік үнсіз: клиент қате жолды алады, қосылу әрекеті аяқталады, ал скрипт ешқандай пайдалы нәрсе хабарламайды.
Клиентті сол шлюз бен нұсқаға қарсы бір рет қолмен іске қосыңыз және сұрауларды қай ретпен келсе, сол ретпен жазып алыңыз. Сол жазба — скриптіңіз орындауы тиіс спецификация.
Клиент нені күтеді
Әдеттегі бір топ жағдайында рет: пайдаланушы аты, құпиясөз және кейде баннерді растау. here-document-тің бірінші жолы мәзір индексіне сервер шынымен мәзір көрсеткенде ғана айналады, сондықтан бір скрипт бір жерде жұмыс істеп, келесі жерде сәтсіздікке ұшырайды.
/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF
Мұны төрт ықтимал сұраққа төрт жауап ретінде оқыңыз, қатып қалған протокол ретінде емес. Нөл — мәзір таңдауы, құпиясөз емес, ал соңғы y көптеген шлюз ешқашан жібермейтін баннерді қабылдайды.
Рет болжамсыз болса, expect қолданыңыз
Сұраулардың реті өзгерсе, жолдарды санауды тоқтатып, сұрауды күтіңіз. expect скрипті connect пәрменін іске қосады, пайдаланушы атының сұрауын күтеді, жібереді, құпиясөз сұрауын күтеді, жібереді, содан кейін қосылған күйді күтеді. Әр күтудің өз уақыт шегі бар.
Уақыт шегінің бітуін сәтсіздік деп санап, шығыңыз. Күтпеген сұраудан кейін кірісті жібере берген скрипт құпиясөзді қуана қабықшаға, мәзірге немесе сол сәтте оқып тұрған кез келген нәрсеге жазып салады. Осылайша кіру скрипті оқиғаға айналады.
expect сонымен қатар құпияны алып тастап жазуға болатын жазба береді, және шлюз жаңартудан кейін сұрауларын өзгерткенде бұл шығу кодынан қымбат.
Құпия бір жерде тұруы керек
Бұл мәселенің әр нұсқасында бір әлсіздік бар: құпиясөз клиент оқи алатын пішінде болуы керек. Оны аргумент ретінде беру процестер кестесінде ашады. Құбыр арқылы өткізу оны жиі қабықша тарихына қалдырады. Екеуін де ортақ секірме хосттағы басқа жергілікті пайдаланушылар оқи алады.
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 бірге де адамсыз кіруді аяқтай алмайды.
Туннельді растаңыз, содан кейін жабылуды өз мойныңызға алыңыз
Қате мәтінінің жоқтығына сенбеңіз. Клиенттен күйін сұраңыз және интерфейсті бөлек тексеріңіз:
/opt/cisco/anyconnect/bin/vpn state
ip -brief address
Күйде Connected жазылуы керек, ал туннель интерфейсінде мекенжай болуы керек. Содан кейін туннель жетуі тиіс бір ресурсты сұраңыз, өйткені маршрутсыз қосылған күй нақты нәтиже және оңай назардан тыс қалады.
vpn disconnect арқылы ажыратыңыз және туннельді бастаған скрипт жабылуды өз мойнына алсын. Сессияны ашық қалдырған сәтсіз жұмыс лицензия орнын жұмсайды және келесі адамға аутентификация мәселесі болып көрінеді.
Жұмыс реті: vpnagentd растаңыз, сұраулардың нақты ретін жазып алыңыз, here-document немесе expect таңдаңыз, құпияны argv мен тарихтан тыс ұстаңыз, күй мен бір ресурсты тексеріңіз, содан кейін сол скриптте ажыратыңыз.