Porównaj dwa profile OpenVPN bez ujawniania kluczy
Diff tekstowy może ujawnić klucze wbudowane równie łatwo, jak pokazuje zmienioną dyrektywę. Porównuj według roli na chronionych kopiach, a potem zrób osobny zredagowany plik diagnostyczny.
Dwa profile, jeden się łączy, drugi nie, a szybki sposób, by zobaczyć dlaczego, to diff. Kłopot w tym, że ten sam diff wypisuje wbudowany klucz prywatny, klucz statyczny i każdy blok poświadczeń, który niesie plik, a ludzie wklejają wynik do czatu, zanim to zauważą. Decyzja, co porównujesz, przychodzi przed uruchomieniem polecenia. Porównuj strukturę i role na chronionych kopiach, a gdy ktoś inny ma to zobaczyć, zbuduj osobny zredagowany plik.
Co naprawdę niesie plik .ovpn
Plik .ovpn to konfiguracja z opcjonalnymi blokami wbudowanymi. Może zawierać certyfikat CA, certyfikat klienta, klucz prywatny, klucz tls-auth lub tls-crypt, oraz dyrektywy wskazujące pliki zewnętrzne lub pytające o poświadczenia. Dwa pliki mogą wyglądać niemal identycznie i różnić się tylko wewnątrz bloku, albo w jednej dyrektywie, która całkowicie zmienia transport. Liczba linii nic ci nie mówi o tym, co z tego się stało.
Różnica wewnątrz bloku klucza nie jest publicznym dowodem na nic. Ponownie wystawiony certyfikat i certyfikat z nowym kluczem mogą dać ten sam kształt zmiany, więc niezgodność bloku mówi, że materiał jest inny, a nie która decyzja go wytworzyła. Traktuj to jako sygnał do porównania pól, nie jako ustalenie.
Porównuj według roli, nie według linii
Idź własną kolejnością połączenia: najpierw punkt końcowy i transport, potem zaufanie i oczekiwana tożsamość, potem uwierzytelnianie użytkownika, potem trasy, DNS i haki skryptów. Ta kolejność odpowiada temu, co robi klient, więc pierwsza różnica, na jaką trafisz, jest pierwszą rzeczą, która mogła zerwać połączenie. Porównywanie alfabetyczne rozprasza powiązane ustawienia po całym wyniku.
Przebieg świadomy pól patrzy na te elementy w tej kolejności. Wszystko, o co klient pyta interaktywnie, należy do wiersza uwierzytelniania, a nie do wierszy zaufania.
remote,protoi port, w tym każdy blok połączenia.caicert: wystawca, podmiot i data wygaśnięcia.- Czy klucz prywatny w ogóle istnieje, nigdy nie to, co zawiera.
tls-authlubtls-cryptobecność i kierunek klucza.- Dyrektywy uwierzytelniania, w tym każde odwołanie do pliku poświadczeń.
- Trasy, opcje DNS i haki skryptów uruchamiane przy połączeniu.
Gdy plik zawiera kilka bloków połączenia, trzymaj każdą opcję przy jej punkcie końcowym. Porównanie tylko pierwszej remote linii może pominąć alternatywę, którą klient faktycznie wybiera w tej sieci.
Dlaczego zwykły diff to niewłaściwe narzędzie
Zwykły diff jest zbudowany do tekstu, nie do tajemnic. Chętnie wypisze klucz prywatny w historii ekranu i nie powie ci, że dyrektywa, na którą patrzysz, nie ma związku z awarią. Wyciągi pól są jednocześnie bezpieczniejsze i czytelniejsze, bo materiał certyfikatu można porównywać jako metadane, a nie bajty.
openssl x509 -in ca.crt -noout -subject -issuer -enddate
openssl x509 -in client.crt -noout -subject -issuer -enddate
grep -E '^(remote|proto|port|tls-auth|tls-crypt|route|dhcp-option)' profile.ovpn
Pierwsze dwa polecenia wypisują tożsamość i ważność bez dotykania klucza, więc ich wynik można bezpiecznie wklejać. grep wypisuje nazwy i wartości dyrektyw, ale nigdy treści bloków, co czyni go właściwym pierwszym przebiegiem, gdy podejrzewasz różnicę w transporcie lub routingu. Jeśli trzeba porównać sam blok, porównaj jego hash, a nie zawartość.
Zbuduj zredagowaną kopię do zgłoszenia
Usuń prawdziwe tajemnice i niepotrzebne identyfikatory, zachowując nazwy pól i dość struktury, by wyjaśnić różnicę. Znacznik o tym samym kształcie nadal zdradza, gdzie leży materiał i jak był długi, więc zdecyduj, czy nawet to jest dopuszczalne. Sprawdź sam końcowy załącznik, zamiast ufać poleceniu, które pamiętasz, że uruchomiłeś. Nie edytuj działającego oryginału tylko po to, by zrobić przykład, bo zredagowany profil nie musi być wykonywalny i nigdy nie powinien być ponownie importowany.
Trzymaj oryginały rozpoznawalne po nazwie pliku i hashu, zamiast kopiować je do trzech katalogów o podobnych nazwach. Ciąg hash wystarczy, by dowieść, który plik sprawdzono, i nic nie kosztuje, jeśli wycieknie. Przytnij kopie po zamknięciu zmiany, aby następna osoba odziedziczyła jeden autorytatywny plik.
Trzymaj porównanie powiązane z awarią
Porównanie jest warte swojego kosztu, gdy odpowiada na pytanie o jeden import lub jedną awarię połączenia. Najpierw nazwij krok, który zawodzi, potem porównaj tylko pola, od których ten krok zależy; zebranie wszystkich poświadczeń klienta w jednym katalogu czyni następny wyciek bardziej prawdopodobnym, a następną diagnozę wolniejszą. Im węższe pytanie, tym krótsza lista pól, które mogą na nie odpowiedzieć.
Jeśli nowy plik przyszedł od operatora, potwierdź ścieżkę dystrybucji, zanim zastąpisz materiał zaufania. Po zmianie sprawdź zaimportowaną kopię, którą klient faktycznie wybrał, i wynegocjowany wynik, bo dyrektywa może zostać zignorowana lub odczytana inaczej przez inną wersję klienta. Plik na dysku nie jest dowodem połączenia, które zadziałało. Semantyka dyrektyw jest w podręczniku OpenVPN 2.6.