Wyrzucenie jednego klienta OpenVPN: kill, deny czy unieważnienie certyfikatu?
Trzy działania OpenVPN usuwają klienta, ale każde kończy coś innego: aktywną sesję, jedną próbę logowania albo prawo do ponownego połączenia. Wybieraj według tożsamości.
W notatkach masz common name i adres oraz trzy polecenia, które wszystkie wyglądają, jakby usuwały klienta. Tylko jedno robi to, czego chcesz, a wybór zależy od tego, czy musisz zakończyć działającą teraz sesję, odrzucić następne logowanie, czy odebrać prawo do łączenia się w ogóle. Przeczytaj tożsamość, którą naprawdę masz, zanim czegokolwiek dotkniesz, bo pula OpenVPN przydziela ten sam adres tunelu innej sesji później.
Jaką tożsamość naprawdę masz
Plik statusu w wersji 3 to zwykły punkt wyjścia. Sekcja CLIENT_LIST zawiera common name, rzeczywisty adres, liczniki bajtów i czas połączenia; sekcja ROUTING TABLE mapuje adres wirtualny na common name ze znacznikiem czasu ostatniego odwołania. Common name to stabilna tożsamość. Adres wirtualny to przydział, a rzeczywisty adres za NAT może się zmieniać między sesjami, podczas gdy na serwerze nic się nie zmienia.
Interfejs zarządzania pokazuje podobny widok przez swoje polecenie status i dodaje identyfikator klienta dla każdej sesji. To właśnie ten identyfikator oczekuje client-kill, i nie jest to adres tunelu. Jeśli musisz wiedzieć, który common name otrzymał który adres w chwili połączenia, środowisko skryptu client-connect ma oba, wraz z zaufanym adresem zewnętrznym, ale ten skrypt działa jako użytkownik OpenVPN i wymaga zapisywalnej ścieżki dziennika.
| What you hold | Where it came from | What it can act on |
|---|---|---|
| Common name | CLIENT_LIST, or the auth hook | kill, and credential revocation |
| Client ID | status on the management socket | client-kill, that one session |
| Tunnel address | ROUTING TABLE, client-connect environment | Nothing durable, the address is recycled |
Zabić teraz, odmówić przy logowaniu, unieważnić na dobre
Oba polecenia usuwania w interfejsie zarządzania są działaniami sesji. kill przyjmuje common name albo rzeczywisty adres i port; client-kill przyjmuje identyfikator klienta i natychmiast kończy tę instancję. Żadne nie jest blokadą: wyrzucony klient z ważnym certyfikatem i hasłem łączy się ponownie w kilka sekund, co jest w porządku, gdy odtwarzasz peer testowy, i bezużyteczne, gdy ukradziono laptop.
client-deny to inny rodzaj decyzji. Zwykle jest wydawane z hooka uwierzytelniania lub client-connect i odrzuca sesję z podaniem przyczyny, więc pasuje do polityki odmawiającej logowania, a nie do tej, która przerywa połączenie. Dokumentacja ostrzega też, że odmowa wydana podczas renegocjacji TLS unieważnia renegocjowany klucz, podczas gdy istniejąca sesja może działać do zamknięcia okna przejściowego. Jeśli wymogiem jest, aby klienta już nie było, udokumentowaną odpowiedzią jest client-kill.
Trwałe usunięcie leży poniżej tego wszystkiego. Unieważnij certyfikat i upewnij się, że crl-verify wskazuje listę, którą serwer faktycznie przeładowuje, wyłącz plik konfiguracji specyficzny dla klienta w katalogu ccd albo wyłącz konto w tym backendzie, o który pyta hook uwierzytelniania. Unieważnienie też nie jest natychmiastowe: przy domyślnych ustawieniach reneg-sec ustanowiona sesja może działać do renegocjacji, więc działanie sesji i działanie poświadczeń uzupełniają się, a nie są alternatywami.
Czy gniazdo zarządzania jest wolne?
Interfejs zarządzania obsługuje jednego klienta naraz. Jeśli GUI lub demon monitorujący już trzyma połączenie, twój skrypt nie może podłączyć się obok, a w zależności od klienta możesz wyprzeć istniejące połączenie zamiast czysto zawieść. Jego hasło wędruje tym gniazdem jawnym tekstem, więc należy do adresu lokalnego lub gniazda unix, nigdy do interfejsu publicznego.
Gdy nie możesz przejąć gniazda, nadal masz opcje i wszystkie są wolniejsze. Najpierw zwolnij sesję GUI, jeśli ją kontrolujesz, albo zaakceptuj drogę przez warstwę poświadczeń i poczekaj na następną renegocjację. Nie powinieneś restartować usługi, aby pozbyć się jednego klienta, bo to kończy także wszystkie inne sesje i niszczy dowody z pliku statusu dla tej sesji.
Sekwencja, którą wykonuję na działającym serwerze
Podłącz się, odczytaj bieżący stan, działaj na identyfikatorze, który właśnie odczytałeś, a potem odczytaj go ponownie. Wartości skopiowane z dokumentu to najczęstszy sposób zabicia niewłaściwej osoby.
status # note the client ID and common name
client-kill 3 # end that session now
kill Test-Client # alternative: by common name
status # confirm the session is goneNazwa i numer powyżej to placeholdery, a identyfikatory są ponownie używane po rozłączeniu innych klientów. Zanim cokolwiek zapiszesz jako zrobione, potwierdź, że wiersza nie ma, i sprawdź, czy liczba połączonych klientów zmieniła się o jeden, a nie o kilka.
Potwierdź, że już nie wrócił
Zapisz common name, adres tunelu, adres zewnętrzny i minutę usunięcia. Jeśli ten sam common name pojawi się ponownie minutę później, działanie sesji zadziałało, a warstwa poświadczeń nie, co jest zupełnie inną naprawą niż polecenie, które nigdy nie zaczęło działać.
Potem przetestuj od strony klienta. Unieważniony certyfikat powinien zawieść przy następnym uścisku dłoni; jeśli nadal się łączy, CRL w ogóle nie jest czytana, i to jest ustalenie warte zgłoszenia. Wybierz działanie według tego, co musisz zakończyć, potwierdź drugim status i napraw warstwę poświadczeń, gdy odpowiedź musi przetrwać dłużej niż sesja.