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 — не абалонка, таму арыфметыка абалонкі, напісаная ўнутры блока expect, не вылічваецца так, як чытаецца. Трымайце сцяг адладкі ўключаным, пакуль будуеце ўзоры, потым выключыце яго.
Сакрэты, якія працякаюць, і дзе яны хаваюцца
Усё, перададзенае як аргумент, бачна ў спісе працэсаў, таму ўліковыя даныя належаць у файл або за памочнікам, а не ў камандным радку. Аднаразовыя коды спажываюцца па задуме і мусяць стварацца для кожнай спробы. Журналы збояў часта нясуць імя карыстальніка, а часам і болей, таму адрэдагуйце іх, перш чым некуды адпраўляць, і трымайце сакрэт па-за профілем, бо канфігурацыйны файл са ўбудаваным паролем трапляе ў тыкеты і рэпазіторыі. Тады змена ўліковага запісу азначае паляванне на кожную копію, і гэта менавіта тая цана, якой гэтая схема пазбягае.
Правядзіце аўдыт абраных уваходаў, а потым падключыце іх да unit-файла або планавальніка, які фактычна будзе запускаць кліент. Тунель жыве роўна столькі, колькі жыве гэты працэс.