Перакананне ў тым, што here-дакумент з чатырох радкоў — гэта поўны неінтэрактыўны ўваход, і яно трымаецца роўна да таго моманту, пакуль шлюз не прапануе дзве групы, не надрукуе банер або не запытае токен пасля пароля. Тады той самы сцэнар уводзіць пароль у меню, якое чакала лік. Кліент каманднага радка ў Linux можна сцэнарызаваць, але толькі калі вы дасце яму тое, чаго ён насамрэч чакае, а не тое, што меркавала інструкцыя.

Фіксаваны here-дакумент — гэта міф

Кліент Cisco для Linux усталёўвае невялікую праграму ў /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 і гісторыяй, праверце стан і адзін рэсурс, потым адключыцеся ў тым жа сцэнары.

Падобныя артыкулы