Скриптування VPN-клієнта: виберіть шар до пароля
CLI постачальника, rasdial, намір застосунку або автоматизація інтерфейсу зазнають невдачі кожен по-своєму. Виберіть шар, тримайте таємницю поза argv і чекайте на стан, а не на коди виходу.
Скрипти запускають VPN-клієнти на тому шарі, який обрав автор, і цей шар рідко є тим, якого потребувало завдання. Командний рядок постачальника, наборонабирач операційної системи та намір мобільного застосунку повертаються в різні моменти життя з'єднання. Вони також по-різному поводяться з таємницею, і ця різниця визначає, чи видно пароль кожному користувачеві машини. Виберіть шар, перш ніж написати перший рядок скрипта.
Шар 1: командний рядок постачальника
Більшість настільних клієнтів надають командний рядок, який приймає назву профілю і, надто часто, пароль. Старий клієнт Cisco приймав дієслово connect з аргументами користувача й пароля; macOS надає вбудовану службу через networksetup; NetworkManager відповідає на nmcli. Ці виклики повертаються, коли команда завершується, що не є тим самим моментом, коли тунель стає придатним до використання. Прочитайте документацію постачальника для версії, яку розгортаєте, бо ці інтерфейси змінюються, а деякі повністю вилучають.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
Перевага в тому, що постачальник знає власне сховище профілів, тож виклик використовує ту саму конфігурацію, яку використав би GUI. Недолік у тому, що кожен постачальник вигадує власні дієслова, і скрипт, написаний для одного клієнта, не переноситься на інший. Розглядайте цей шар як найкоротший шлях, коли клієнт зафіксований, а версія прикріплена.
Шар 2: власна служба операційної системи
У Windows наборонабирач є частиною операційної системи і працює з записом у телефонній книзі, а не зі сховищем профілів постачальника. Це робить його переноснішим між клієнтами та легшим для скриптування з сервісного облікового запису. Це також означає, що з'єднання може існувати в одному місці, а не в іншому, що заплутує людей, які дивляться в неправильний список.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
Використовуйте поверхню PowerShell, коли потрібно створити або видалити запис, а не набирати його. Шари WMI і cmdlet надають ті самі об'єкти під різними назвами, а видалення є окремою операцією від від'єднання. Скрипт, який лише набирає, залишить застарілі записи після міграції. Перевірте, до якого сховища пише ваша автоматизація, перш ніж пообіцяти, що прибирання відбудеться.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
У macOS еквівалентом є список мережевих служб, де наявна служба під'єднується за назвою, а не створюється на льоту.
Облікові дані просочуються на кожному шарі, тож виберіть канал
Усе, що ви передаєте в командному рядку, з'являється в таблиці процесів для кожного локального користувача і зазвичай переживає також в історії оболонки. Підтримувана альтернатива OpenVPN — читати таємницю з файлу за допомогою --askpass, і сам файл потребує дозволів, що відповідають довірі, яку ви в нього вкладаєте. Іменований канал уникає запису таємниці на диск, але дозволяє будь-якому процесу, який може його відкрити, писати туди. У Windows зберігайте таємницю в менеджері облікових даних або у файлі, який може читати лише сервісний обліковий запис, і ніколи як літерал у batch-файлі.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
Те саме правило застосовується до токенів і одноразових кодів: якщо автоматизація їх потребує, автоматизація потребує каналу, який не є аргументом командного рядка. Обертайте таємницю, коли змінюєте механізм, бо старе значення лежало десь у журналі. Скрипт, який працює і просочується, не є робочим скриптом.
Зачекайте на стан, потім наглядайте за одним власником
Кожен із цих викликів повертається до того, як тунель готовий, тож опитуйте стан, який надає клієнт, або перевірте призначення всередині нього з обмеженням часу. Копіювання файлів або відкриття з'єднання з базою даних одразу після виклику під'єднання — це гонка, і вона періодично зривається в спосіб, що виглядає як збій мережі.
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
Від'єднання має ту саму проблему у зворотному напрямку: процес може завершитися до того, як маршрути зникнуть. Використовуйте хуки клієнта там, де вони є, як-от скрипти up і down OpenVPN або ExecStartPost юніта systemd, бо вони виконуються в точці, яка вам справді важлива. Хуки виконуються з привілеями того, що їх викликало, тож хук, який перезапускає мережу, потребує явного правила, а не припущення. Тримайте рівно одного власника протягом усього життя з'єднання.
Коли два наглядачі запускають і зупиняють той самий профіль, результатом є цикл повторного під'єднання, що читається як збій постачальника. Runbook завершується, коли шар задокументовано, таємниця має канал, що не є argv, умова очікування — це перевірка стану з обмеженням часу, і один процес володіє життєвим циклом.