AnyConnect на Linux: безбедно скриптирање на низата за најава
vpn-бинарниот файл на Cisco AnyConnect чита одговори од stdin, и тоа е доволно за повторлива најава. Изгради ја низата, заштити ја датотеката, потврди и запре.
vpn-клиентот што доаѓа со Cisco AnyConnect се однесува како разговор: печати покана, чека ред и потоа ја печати следната. Ако го внесете тој разговор од датотека или цевка, истиот бинарен файл работи без надзор. Техниката е едно пренасочување плус подредена листа одговори, и токму листата, а не пренасочувањето, одлучува дали скриптата е сигурна.
Во практиката две работи го расипуваат тоа. Редоследот на поканите се поместува кога портата бара нешто дополнително, а зачуваната лозинка една печатна грешка ја претвора во заклучен профил. Третирајте ја низата како верзионирани податоци што можете да ги споредите по секоја промена на портата. Паѓајте гласно наместо да обидувате повторно, бидејќи циклусот е токму начинот на кој погрешно внесената лозинка станува заклучен профил.
Една низа, по редоследот по кој клиентот прашува
Стартувајте го клиентот интерактивно еднаш и запишете ја секоја покана по редоследот по кој се појавува. Тој транскрипт станува датотека со одговори. Кога ќе ја пренасочите датотеката во бинарниот файл, првиот ред мора да биде самата команда за поврзување, затоа низата започнува со име на домаќин, а не со корисничко име.
connect vpn.example.com
0
<username>
<password>
y
exit
Голиот 0 го избира првиот профил за поврзување кога портата нуди листа; користете го индексот што го печати вашата порта. y прифаќа банер за најава, затоа избришете го тој ред ако нема банер и вметнете еден таму каде што портата поставува дополнително прашање. Завршниот exit е тоа што му овозможува на клиентот чисто да заврши кога последниот одговор е потрошен.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
Неинтерактивниот режим овде не е изборен. Без -s клиентот може да го преземе терминалот и да го игнорира пренасочения влез; со него одговорите се читаат од текот и процесот се враќа. Каде бинарниот файл бара покачени привилегии, завиткајте го повикот во sudo -n за скриптата веднаш да падне наместо да блокира на барање за лозинка.
Каде истекува датотеката со одговори
Датотека што содржи лозинка е акредитив, затоа дајте ѝ ги дозволите на таков: режим 600, во сопственост на профилот што ја извршува работата и никогаш во споделена или синхронизирана папка. Создајте ја со веќе применет режим наместо да ја поправате подоцна, бидејќи датотеката е кратко читлива за сите помеѓу запишувањето и chmod.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
Другата половина е argv. Лозинката предадена како аргумент е видлива за секој локален корисник што листа процеси, а исто така завршува во историјата на shell. Читајте ја од опис на датотека или од променлива на околината, и ставете го товарот во наводници за shell да не може ништо внатре да прошири.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
Внимавајте на наводниците. Во двојни наводници лозинката што содржи ! може да биде проширена од интерактивен shell пред клиентот воопшто да ја види, а грешката пристигнува како општа event-not-found грешка што изгледа како проблем со протоколот.
Докажете го тунелот, потоа затворете го
Состојбата поврзано докажува само дека клиентот верува дека има сесија. Изберете домаќин што одговара само од внатрешноста на корпоративната мрежа и проверете го еднаш пред да направите нешто друго. Неуспехот таму е дефект во рутирањето или политиката, и повторното пуштање на најавата нема да го смени.
/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect
Проверете го излезот од состојбата пред и по прекинот. Клиент оставен со застарена сесија може да го одбие следното поврзување додека скриптата сè уште известува за успех, и тој начин на неуспех е невидлив ако гледате само излезни кодови. Споредете ги двете читања наместо да ѝ верувате на втората сама. Алијасите во профилот на shell се доволни за секојдневна употреба, додека сè закажано заслужува истиот преглед на акредитиви и идентитет како и секоја друга работа без надзор.
Кога фиксната листа престанува да биде безбедна
Датотеката со одговори го кодира денешниот редослед на покани. Променет банер, насилна промена на лозинка или предизвик за втор фактор ја претвораат во циклус што може да го заклучи профилот, затоа скриптата мора да излезе на првиот неочекуван одговор наместо да се рестартира.
Фатете што отпечатил клиентот, вратете статус различен од нула и оставете го повикувачот да одлучи. Каде портата бара втор фактор, искрениот одговор е дека најава без надзор не е достапна за тој профил, а не дека низата и треба уште еден ред.
Ротацијата припаѓа на истиот преглед. Ако акредитивот се чува, одлучете кој може да го чита, кога се менува и што го отстранува кога домаќинот се преградува. Скрипта што работи една година затоа што никој не ја допрел лозинката не е дизајн, туку несреќа што чека политика за ротација.
Профили што не се AnyConnect
Два постари стила на Cisco акредитиви се мешаат со овој. Профилот vpnc бара IPSec ID, што всушност е името на групата, потоа групна тајна, потоа вашите сопствени акредитиви, и сите три доаѓаат од тој што ја управува портата. Стариот Cisco IPsec е различен протокол од AnyConnect, затоа vpnc не може да стигне до услуга само за AnyConnect; openconnect --protocol=anyconnect е отворениот клиент за таа работа.
Датотеката .pcf го опишува профилот на постариот клиент. Домаќинот, името на групата и групната лозинка во неа можат рачно повторно да се внесат во клиент што зборува Cisco IPsec, иако датотеката не е универзален увоз и секој нестандарден порт или режим на тунелирање обично исчезнува при преносот.
Започнете од она што портата навистина го нуди, потоа изберете го клиентот што зборува тој протокол. Копирањето профил од друга локација е начинот на кој луѓето завршуваат со дебагирање акредитиви што никогаш не биле проблемот.