OpenVPN pyta o nazwę użytkownika i hasło na terminalu sterującym, a plik przekierowany na standardowe wejście nie jest tym terminalem. Ten jeden szczegół tłumaczy skrypt, który zawiesza się, choć hasło leży tuż w potoku. Zachętę rysuje klient, a odczyt odbywa się z urządzenia terminala, więc przekierowanie stdin niczego nie zmienia. Podaj klientowi dane przez jedno z jego udokumentowanych wejść, a ten sam skrypt połączy się za pierwszym razem.

Trzy wejścia pokrywają prawie każdy przypadek, a każde zawodzi na swój sposób. Wybieraj po zachęcie, którą klient naprawdę pokazuje, a nie po opcji, którą najłatwiej zapisać w skrypcie.

Zachęta nie pochodzi ze stdin

Gdy OpenVPN potrzebuje danych logowania, otwiera terminal sterujący i czyta z niego. Dlatego test interaktywny wygląda dobrze, a to samo polecenie pod cronem albo plikiem unit stoi bezczynnie z zachętą zapisaną w logu, którego nikt nie ogląda. Niektóre kompilacje wracają do standardowego wejścia, gdy nie ma terminala, i ta niespójność jest gorsza od twardego błędu, bo ukrywa problem aż do wdrożenia.

Sprawdź środowisko, zanim napiszesz jakikolwiek kod: uruchom klienta pod tym samym użytkownikiem, z tym samym stdin, jak zrobi to harmonogram albo menedżer usług. Jeśli zachęta nigdy nie pojawia się w logu, a proces nie posuwa się naprzód, coś czeka na terminal, którego nie ma.

Pierwsze wejście: dwulinijkowy plik danych logowania

Opcja uwierzytelniania przyjmuje ścieżkę, a plik zawiera dokładnie dwie linie: najpierw nazwę użytkownika, potem hasło, i nic więcej. Podawaj ścieżkę jawnie, zamiast polegać na domyślnej nazwie pliku, bo zabłąkany plik z danymi logowania w katalogu roboczym to sposób, w jaki do użytku trafia niewłaściwe konto. Ustaw tryb na 0600 i przekaż własność kontu, które uruchamia klienta.

Klient czyta ten plik raz przy starcie, więc rotacja hasła oznacza restart procesu. Zwykle właśnie tego chcesz, a informacja należy do runbooka obok procedury rotacji.

Drugie wejście: askpass do frazy klucza

Klucz prywatny chroniony frazą wywołuje drugą, inną zachętę, a ona ma swoją odpowiedź z pliku: opcja askpass czyta frazę z pierwszej linii pliku. Dla tuneli opartych na SSH odpowiednikiem jest program askpass, który uruchamia klient, a jego standardowe wyjście staje się sekretem.

Żadna z form nie wkłada sekretu do listy argumentów, a obie zostawiają go jako plik albo jako program wykonywalny, który go wypisuje. Ochroną są uprawnienia pliku i własność procesu, nie niejasność. Pomocnik, który powtarza zaszyty w kodzie ciąg, to sekret z dodatkowymi krokami.

Trzecie wejście: własne CLI klienta portalu

Klienci korporacyjni zwykle dostarczają punkt wejścia w wierszu poleceń, który łączy się z nazwanym portalem bez żadnego okna, i to jest obsługiwana droga. W Linux klient GlobalProtect udostępnia przez swoje CLI operacje łączenia i importu certyfikatu, a portale korzystające z uwierzytelniania certyfikatem potrzebują kroku importu, zanim automatyczne połączenie zadziała. Wybieraj je zamiast syntetycznych naciśnięć klawiszy: dostajesz prawdziwy kod wyjścia, żadnej zależności od fokusu okna, i przetrwa zablokowany ekran.

Jeśli pierwsze połączenie nadal wymaga człowieka, który zaakceptuje certyfikat, automatyzacja nie jest skończona. Wykonaj import podczas konfiguracji i zapisz go jako warunek wstępny.

Gdy przepływ wymaga pseudo-terminala

Sekwencja, która prosi o hasło, a potem o kod jednorazowy, nie ma jednego pliku do odczytania. Sterownik terminala taki jak Expect to właściwe narzędzie, bo czeka na każdy wzorzec po kolei, i potrzebuje uruchomionego procesu, zanim w ogóle cokolwiek dopasuje.

Dominują dwa błędy. Skrypt, który czeka na zachętę, nie uruchamiając klienta, czeka wiecznie, a Tcl nie jest powłoką, więc arytmetyka powłoki zapisana w bloku expect nie jest obliczana tak, jak się ją czyta. Trzymaj włączoną flagę debugowania, gdy budujesz wzorce, a potem ją wyłącz.

Sekrety, które wyciekają, i gdzie się ukrywają

Wszystko podane jako argument widać na liście procesów, więc dane logowania należą do pliku albo za pomocnikiem, nigdy do wiersza poleceń. Kody jednorazowe są zużywane z założenia i trzeba je tworzyć dla każdej próby. Logi błędów często niosą nazwę użytkownika, a czasem więcej, więc zredaguj je, zanim wyślesz je gdziekolwiek, i trzymaj sekret poza samym profilem, bo plik konfiguracji z osadzonym hasłem trafia do zgłoszeń i repozytoriów. Rotacja konta oznacza wtedy polowanie na każdą kopię, i dokładnie tego kosztu ta układanka unika.

Przejrzyj wybrane wejścia, a potem podłącz je do pliku unit albo harmonogramu, który naprawdę uruchomi klienta. Tunel żyje dokładnie tak długo, jak ten proces.

Powiązane artykuły