Најава во Cisco Secure Client од Linux школка без графички интерфејс
Here-документот не е протокол за најава. Забележете го вистинскиот ред на барањата, користете expect кога се менува и држете ја лозинката надвор од argv и историјата.
Верувањето е дека here-документ со четири реда е целосна неинтерактивна најава и тоа важи сè додека портата не понуди две групи, не испечати банер или не побара токен по лозинката. Тогаш истата скрипта ја пишува лозинката во мени што очекувало број. Клиентот на командната линија на Linux може да се скриптира, но само ако му го дадете она што навистина го чека, а не она што го претпоставил прирачникот.
Фиксниот here-документ е мит
Linux клиентот на Cisco инсталира мала програма во /opt/cisco/anyconnect/bin/vpn, а Secure Client 5 сè уште ја доставува. Додека работи службата vpnagentd, знамето -s чита одговори од стандардниот влез по редоследот по кој клиентот ги бара. Тој редослед не е фиксен меѓу серверите.
Менито со групи додава еден ред. Банератот за најава додава уште еден. Барањето за токен по лозинката целосно ја крши скриптата од четири реда, бидејќи петиот ред никогаш не требало да биде токенот. Откажувањето е тивко: клиентот добива погрешна низа, обидот за поврзување завршува и скриптата не известува ништо корисно.
Стартувајте го клиентот рачно еднаш кон истата порта и верзија и запишете ги барањата по редоследот на појавување. Тој запис е спецификацијата што вашата скрипта мора да ја задоволи.
Што чека клиентот
Во вообичаениот случај со една група, редоследот е корисничко име, лозинка и понекогаш потврда на банер. Првиот ред на here-документ станува индекс на мени само кога серверот навистина прикажува мени, затоа истата скрипта работи на едно место, а паѓа на следното.
/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-документ или expect, држете ја тајната надвор од argv и историјата, проверете состојба и еден ресурс, потоа исклучете се во истата скрипта.