Wstrzymanie dostępu jednego klienta i usunięcie go na zawsze wyglądają jak to samo zadanie, dopóki nie spróbujecie cofnąć jednego z nich. Unieważnienie certyfikatu zapisuje rekord, który serwer traktuje jako ostateczny, a jego cofnięcie oznacza ręczną edycję bazy wystawcy. Porzucenie działającego tunelu to polecenie zarządzania, które niczego nie zmienia w zaufaniu. Wybierzcie dźwignię, pytając, czy klucz jest nadal godny zaufania, a nie pytając, jak pilne wydaje się żądanie.

Przekonanie: unieważniony i zawieszony to to samo

Podwykonawca zostaje wstrzymany na tydzień i odruchem jest unieważnienie, bo unieważnienie brzmi jak wyłączenie czegoś. Wygląda porządnie, zajmuje dziesięć sekund i zostawia edycję bazy jako jedyną drogę powrotu. Odruch jest zrozumiały i bliżej mu do spalenia paszportu niż do zamknięcia drzwi. Wstrzymane urządzenie i skompromitowany klucz wymagają innego traktowania, a tylko jedno z nich jest tanie do cofnięcia.

Różnica dotyczy poświadczenia, a nie osoby. Klucz, który wciąż jest w odpowiednich rękach, można wstrzymać i wznowić bez utraty zaufania. Klucza, który mógł zostać skopiowany, nie należy nigdy przywracać, ponieważ przywrócenie twierdzi, że kopia nie istnieje.

Zapiszcie odpowiedź, zanim dotkniecie któregokolwiek z systemów. Jeśli nie potraficie powiedzieć, czy klucz jest ujawniony, ostrożną odpowiedzią jest wymiana.

Porzućcie działającą sesję przez interfejs zarządzania

OpenVPN udostępnia interfejs zarządzania, który potrafi wylistować sesje i zabić jedną z nich po nazwie wspólnej. Włączcie go na localhost, trzymajcie z dala od interfejsu publicznego i wyślijcie polecenie zabicia, gdy sesja musi zniknąć natychmiast. Polecenie zamyka tylko ten tunel, a każdy inny klient działa dalej.

To jest reakcja na aktywny problem, a nie polityka zawieszania. Ten sam profil może połączyć się ponownie w ciągu minuty, bo nic w jego poświadczeniu się nie zmieniło. Użyjcie go, gdy sesja musi zniknąć, a trwała decyzja wciąż jest podejmowana.

Potwierdźcie, że sesja była podłączona, zanim ją zabijecie, żeby nie tropić klienta, który nigdy się nie połączył. Poniższe polecenie stanu wypisuje, co jest obecnie podłączone.

printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506

Jeśli zabicie zgłasza, że nie ma takiego klienta, nazwa wspólna w certyfikacie nie jest ciągiem, który wpisaliście. Czytajcie wyjście stanu, a nie nazwę pliku profilu.

Co CRL faktycznie kontroluje

Serwer nie zagląda do flagi unieważnienia zapisanej na certyfikacie. Odczytuje listę unieważnionych certyfikatów wskazaną w crl-verify przy każdym nowym połączeniu i odrzuca certyfikat, którego numer seryjny znajduje się na tej liście. Wynikają z tego dwie konsekwencje i obie są ważne operacyjnie. Plik musi być czytelny dla konta, któremu serwer oddaje swoje uprawnienia, a już podłączony klient działa dalej, dopóki nie połączy się ponownie.

Druga konsekwencja zaskakuje ludzi podczas incydentów. Unieważnienie certyfikatu nie zamyka tunelu, który go właśnie używa. Połączcie unieważnienie z zabiciem administracyjnym, jeśli sesja musi się skończyć natychmiast, i traktujcie oba działania jako osobne kroki w instrukcji.

Obejrzyjcie listę, żeby zobaczyć, co serwer naprawdę wyegzekwuje, zamiast ufać znacznikowi czasu ostatniego skopiowanego pliku. Liczba numerów seryjnych jest tą częścią, która się liczy.

openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pem

Lista bez wpisów i lista z właściwymi wpisami wyglądają identycznie w listingu katalogu, dlatego warto wypisać liczbę numerów seryjnych. Linia uprawnień jest równie ważna, bo plik, którego demon nie może odczytać, powoduje awarię wyglądającą jak odrzucony klient.

Przywracanie rekordu, ostrożnie

Przywrócenie certyfikatu oznacza odwrócenie rekordu w bazie wydawania i opublikowanie nowej listy. easy-rsa 3 trzyma tę bazę jako index.txt w katalogu PKI, podczas gdy starsze układy używały innego porządku. Wiersz zaczyna się literą stanu i datą ważności. Unieważniony wiersz wstawia znacznik czasu unieważnienia, zanim przejdzie do numeru seryjnego, nazwy pliku certyfikatu i nazwy wyróżniającej. Przywrócenie wiersza oznacza usunięcie tego znacznika i odwrócenie litery, a wszystko inne zostaje w spokoju.

Najpierw zróbcie kopię zapasową pliku, a edycję wykonajcie skryptem, zamiast pisać w edytorze tekstu. Literówka, która zmienia liczbę pól w wierszu, psuje wydawanie każdego później dodanego certyfikatu. To właśnie dlatego zmianę warto zautomatyzować i skopiować plik przed dotknięciem.

Drugie unieważnienie tej samej nazwy też często się nie udaje, bo pierwsze uruchomienie przeniosło ten certyfikat i jego klucz poza katalogi, w których narzędzie spodziewa się je znaleźć. Narzędzie nie znajduje wtedy tego, o unieważnienie czego poproszono, a komunikat błędu nie zawsze jasno mówi dlaczego.

cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crl

Opublikujcie nową listę, poprawcie jej właściciela i skłońcie serwer do jej odczytania. Przeładowanie wystarcza w większości instalacji, ale potwierdzenie musi przyjść z nowego połączenia, bo istniejąca sesja nigdy niczego ponownie nie sprawdziła.

Sprawdźcie, na którą dźwignię zasługuje sprawa

Zadajcie jedno pytanie, które rozstrzyga całą instrukcję: czy klucz prywatny nadal znajduje się wyłącznie tam, gdzie powinien. Jeśli tak, zabicie sesji plus udokumentowana pauza obejmują sprawę i nie zostawiają trwałego rekordu. Jeśli nie, jedyną bezpieczną odpowiedzią jest nowy klucz, a stary certyfikat pozostaje unieważniony.

Następnie zweryfikujcie wynik próbą połączenia, a nie różnicą w konfiguracji. Różnica mówi, co zamierzaliście, a połączenie mówi, co serwer egzekwuje.

openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506

Gdy przywrócony klient łączy się i pojawia w wyjściu stanu, edycja rekordu zadziałała. Gdy unieważniony klient zostaje odrzucony, a log wskazuje CRL, unieważnienie zadziałało. Wszystko pomiędzy to problem z uprawnieniami albo przeładowaniem, i warto go naprawić, zanim przyjdzie następne żądanie.

Powiązane artykuły