Ktoś chce sprawdzić, co klienci wysyłają przez tunel, znajduje hook połączenia w dokumentacji i zaczyna pisać skrypt, który nigdy nie otrzyma ani jednego pakietu. Hook jest prawdziwy i przydatny, ale jego jednostką pracy jest sesja, a nie bajt. Wybór właściwego komponentu to porównanie trzech miejsc, w których może dziać się praca, a decydujące pytanie brzmi, którą jednostkę każde z nich naprawdę widzi.

Co hook otrzymuje, a czego nigdy nie otrzymuje

Hook połączenia klienta uruchamia się raz, gdy uwierzytelniony klient ustanawia sesję, w kontekście procesu serwera, z udokumentowanymi argumentami i wartościami środowiska, takimi jak nazwa wspólna i przypisany adres. Może zapisać konfigurację dla klienta, podjąć decyzję o dopuszczeniu, przydzielić zasób zewnętrzny lub odnotować, że połączenie nastąpiło. Nie może natomiast obserwować ruchu, bo zanim pierwszy pakiet przekroczy tunel, hook już wrócił.

To nie jest ograniczenie, które trzeba obejść. Wywołanie zwrotne sesji, które próbowałoby przetwarzać strumień, musiałoby działać przez cały czas życia połączenia, a kontrakt skryptowy demona nie jest zbudowany pod taki kształt. Zapytaj, do czego służy hook, zanim uznasz, że stoi ci na drodze.

Ponowne połączenia też mają znaczenie. Klient, który się rozłączy i połączy ponownie, to nowa sesja, więc wszystko, co przydziela hook, musi być idempotentne albo sparowane ze zdarzeniem rozłączenia, które sprząta. Stan, który wycieka przy każdym ponownym połączeniu, to typowa pierwsza usterka w projekcie opartym na hooku.

Polityka sesji należy do hooka

Dopuszczanie to naturalna praca hooka. Wiesz, kto się połączył, skąd i z jakim certyfikatem, i możesz zdecydować, czy ta sesja ma być kontynuowana, czy odrzucona. Ta decyzja jest tania, zapada raz i nie wymaga spojrzenia na ani jeden bajt ładunku.

Przydzielanie konfiguracji pasuje do tego samego kształtu. Hook może wybrać adres klienta, wysłać opcje odpowiednie dla tej tożsamości albo zapisać fragment, który serwer czyta dla tego klienta. Ponieważ decyzja jest na sesję, pozostaje zrozumiała, gdy coś idzie nie tak i ktoś musi wyjaśnić, dlaczego dany klient dostał dany adres.

Zapisywanie to trzecie dopasowanie. Wpis audytowy mówiący, że sesja została dopuszczona, wraz z jej tożsamością i czasem, należy dokładnie tutaj. To nie jest dziennik ruchu i nie powinien udawać, że nim jest. Jeśli ktoś później zapyta, co klient robił wewnątrz tunelu, odpowiedź musi przyjść skądinąd.

Praca z pakietami należy do ścieżki pakietów

Jeśli wymaganiem jest widzenie lub zmiana bajtów w locie, komponent musi znajdować się na ścieżce przekazywania: reguła zapory z kolejką, hook kontroli ruchu albo przekazywacz w przestrzeni użytkownika. Te mechanizmy widzą pakiety i mają własny stan, własne tryby awarii i własny profil wydajności.

Edytowanie ładunku na tej warstwie jest trudniejsze niż jego czytanie. Zmiana jednego bajtu może unieważnić pole długości, sumę kontrolną albo maszynę stanów protokołu, a tunel trzeciej warstwy nie chroni przed niczym z tego. Oznacza to tylko, że nagłówki zewnętrzne nie są tymi, które edytujesz. Zaplanuj tę naprawę, zanim komukolwiek obiecasz przepisanie treści.

Przechwytywanie interfejsu to najtańsze narzędzie w tej kategorii i jest obserwacją, a nie edytorem. Ludzie mylą oba, bo oba opisuje się jako widzenie ruchu, ale przechwytywanie tworzy plik, a ścieżka pakietów tworzy decyzję.

Zmiany aplikacji należą do aplikacji

Gdy celem jest zmiana tego, co zawiera żądanie, albo sposobu formowania odpowiedzi, właściwym miejscem jest sama usługa albo proxy, które celowo kończy protokół. Te komponenty rozumieją już żądania, odpowiedzi i uwierzytelnianie, którego oczekuje aplikacja, i to jest dokładnie ten kontekst, którego brakuje filtrowi pakietów.

Tłumaczenie adresów jest na dole tej listy nie bez powodu. Przepisuje adresy i porty, a ładunek zostawia w spokoju, więc nie jest narzędziem do treści, jakkolwiek często pojawiałoby się w przepisie, który wspomina też o treści.

Rozdzielenie tych granic jest tym, co czyni projekt wytłumaczalnym. Polityka sesji w hooku, obsługa pakietów na ścieżce pakietów i zmiana aplikacji tam, gdzie protokół jest celowo kończony: trzy zdania, które służą też jako lista kontrolna do przeglądu.

Gdzie TLS wciąż kończy rozmowę

Jedno przetrwa wszystko powyższe: ruch wewnątrz tunelu, który niesie HTTPS, zachowuje własne szyfrowanie transportu. Posiadanie kluczy VPN daje wewnętrzny pakiet IP i nie daje kluczy sesji witryny po drugiej stronie.

Dlatego hook nie może sprawdzać treści nawet w zasadzie, i dlatego ścieżka pakietów widzi zaszyfrowany tekst, chyba że wdrożenie celowo kończy wewnętrzny TLS. kontrakt skryptowy opisuje, co otrzymuje hook; nie mówi nic o ładunku, bo nie ma ładunku do przekazania.

Powiązane artykuły