OpenVPN чете паролата от терминала, а не от stdin
Къде OpenVPN всъщност чете парола, защо файл на stdin се проваля и трите поддържани начина за скриптирано влизане в Linux и macOS.
OpenVPN подканя за потребителско име и парола на управляващия терминал, а файл, пренасочен към стандартния вход, не е този терминал. Тази една подробност обяснява скрипта, който виси, докато паролата стои точно там в тръбата. Подканата се изчертава от клиента, а четенето се взема от терминалното устройство, така че пренасочването на stdin не променя нищо. Подайте клиента през един от документираните му входове и същият скрипт ще се свърже от първия опит.
Три входа покриват почти всеки случай и всеки се проваля по свой начин. Избирайте по подканата, която клиентът наистина показва, а не по опцията, която е най-лесна за скриптиране.
Подканата не идва от stdin
Когато OpenVPN се нуждае от идентификационни данни, той отваря управляващия терминал и чете оттам. Затова интерактивният тест изглежда добре, а същата команда под cron или unit файл стои в покой с подкана, записана в журнал, който никой не гледа. Някои сборки се връщат към стандартния вход, когато няма терминал, и тази непоследователност е по-лоша от твърд отказ, защото скрива проблема до внедряването.
Проверете средата, преди да пишете какъвто и да е код: стартирайте клиента под същия потребител, със същия stdin, както ще го направи планировчикът или мениджърът на услуги. Ако подканата никога не се появи в журнала и процесът не напредва, нещо чака терминал, който не съществува.
Вход първи: файл с идентификационни данни от два реда
Опцията за удостоверяване приема път, а файлът съдържа точно два реда, потребителско име и след това парола, без нищо друго. Подавайте пътя изрично, вместо да разчитате на име по подразбиране, защото отклонен файл с данни в работната директория е начинът грешният акаунт да влезе в употреба. Задайте режим 0600 и дайте собственост на акаунта, който стартира клиента.
Клиентът чете този файл веднъж при стартиране, така че смяната на паролата означава рестартиране на процеса. Обикновено това е поведението, което искате, и то принадлежи в runbook до процедурата за смяна.
Вход втори: askpass за паролата на ключа
Защитен с парола частен ключ повдига втора, различна подкана и има своя отговор от файл: опцията askpass чете паролата от първия ред на файл. За тунели на базата на SSH еквивалентът е програма askpass, която клиентът изпълнява, и чийто стандартен изход става тайната.
Нито една от двете форми не слага тайната в списъка с аргументи и двете я оставят да съществува като файл или като изпълним файл, който я отпечатва. Защитата са правата на файла и собствеността на процеса, не незнанието. Помощник, който извежда твърдо зададен низ, е тайна с допълнителни стъпки.
Вход трети: собственият CLI на порталния клиент
Корпоративните клиенти обикновено предоставят входна точка от командния ред, която се свързва с именуван портал без участие на прозорец, и това е поддържаният път. В Linux клиентът GlobalProtect предлага операции за свързване и импортиране на сертификат през своя CLI, а порталите със сертификатно удостоверяване се нуждаят от стъпката за импортиране, преди автоматизирано свързване да проработи. Предпочитайте го пред синтезирани натискания на клавиши: получавате истински статус при изход, без зависимост от фокуса на прозореца, и той оцелява при заключен екран.
Ако първото свързване все още изисква човек да приеме сертификат, автоматизацията не е завършена. Направете импортирането по време на настройката и го запишете като предварително условие.
Когато потокът се нуждае от псевдотерминал
Последователност, която иска парола и след това еднократен код, няма един файл за четене. Терминален драйвер като Expect е правилният инструмент, защото чака всеки шаблон поред, и се нуждае от стартиран процес, преди да може да съпостави каквото и да е.
Два отказа доминират. Скрипт, който чака подкана, без да стартира клиента, чака вечно, а Tcl не е обвивка, така че shell аритметика, написана вътре в expect блок, не се изчислява както се чете. Дръжте флага за отстраняване включен, докато изграждате шаблоните, после го изключете.
Тайни, които изтичат, и къде се крият
Всичко, подадено като аргумент, е видимо в списъка с процеси, затова идентификационните данни принадлежат във файл или зад помощник, никога на командния ред. Еднократните кодове се изразходват по замисъл и трябва да бъдат създавани за всеки опит. Журналите при отказ често носят потребителското име, а понякога и повече, затова редактирайте ги, преди да ги изпращате някъде, и дръжте тайната извън самия профил, защото конфигурационен файл с вградена парола се поставя в тикети и хранилища. Тогава смяната на акаунта означава лов на всяко копие, което е точно цената, която тази подредба избягва.
Одитирайте избраните входове, после ги свържете към unit файла или планировчика, който наистина ще стартира клиента. Тунелът живее точно толкова, колкото живее този процес.