Przejdź do treści

Konfiguracja TLS

TLS chroni dane przesyłane przez sieć: między przeglądarką użytkownika a serwerem, między aplikacją mobilną a interfejsem API, a także między komponentami samego systemu. Odpowiada przy tym za dwie różne rzeczy.

Pierwszą jest szyfrowanie, dzięki któremu nikt po drodze nie odczyta ani nie zmieni przesyłanych danych. Jego siła zależy od konfiguracji serwera, czyli od dopuszczonych wersji protokołu i zestawów szyfrów.

Drugą jest potwierdzenie, z kim klient, czyli strona nawiązująca połączenie, naprawdę rozmawia. Służy do tego certyfikat: istotne jest, dla jakiej domeny został wystawiony, kto go podpisał, czy jest wciąż ważny i czy klient w ogóle go sprawdza. Bez tego szyfrowanie zabezpiecza połączenie z kimś, czyjej tożsamości nikt nie potwierdził. Dane mogą wtedy trafić do serwera atakującego, który odczyta je i przekaże dalej do właściwej usługi, a użytkownik nie zauważy różnicy.

Skutki udanego ataku

Błędna konfiguracja TLS może prowadzić do:

  • odczytania przez osoby postronne danych przesyłanych między użytkownikiem a serwerem, w tym haseł i tokenów sesyjnych,
  • niezauważonej modyfikacji przesyłanych treści,
  • podszycia się pod usługę i zebrania danych logowania użytkowników,
  • odszyfrowania komunikacji zarejestrowanej wcześniej, nawet długo po jej przechwyceniu,
  • przerwy w działaniu usługi oraz błędów w aplikacjach i połączeniach z innymi systemami,
  • ostrzeżeń w przeglądarce, które podważają zaufanie użytkowników i uczą ich ignorowania takich komunikatów.

Typowe scenariusze

Przestarzałe wersje protokołu

Protokoły SSL 2.0, SSL 3.0, TLS 1.0 oraz TLS 1.1 powstały kilkanaście lat temu i nie spełniają dzisiejszych wymagań bezpieczeństwa. Mimo to bywają nadal włączone w konfiguracji serwera, z obawy, że starsze urządzenia nie będą mogły się połączyć. Naraża to wszystkich użytkowników, także tych z aktualną przeglądarką, ponieważ atakujący ingerujący w połączenie może wymusić użycie najsłabszej wersji obsługiwanej przez obie strony.

Słabe zestawy szyfrów

Zestaw szyfrów określa, w jaki sposób połączenie jest szyfrowane i jak uzgadniany jest klucz. Serwer ma zwykle włączonych kilkanaście zestawów naraz i zostają wśród nich takie, które dawno przestały być bezpieczne: RC4, z którego da się odtworzyć fragmenty przesyłanych danych, czy 3DES, operujący na zbyt krótkich blokach danych. Zdarzają się też zestawy w ogóle nieszyfrujące (NULL) oraz anonimowe (aNULL), które nie potwierdzają tożsamości serwera i tym samym nie chronią przed podszyciem się pod usługę.

Szyfry eksportowe

Powstałe w latach dziewięćdziesiątych, gdy przepisy Stanów Zjednoczonych ograniczały długość klucza w oprogramowaniu wywożonym za granicę do 40 lub 56 bitów, przetrwały w bibliotekach oraz konfiguracjach przez kolejne dwie dekady. Klucz tej długości łamie się dziś w kilkanaście godzin. Podobnym problemem są zbyt krótkie parametry wymiany klucza Diffiego-Hellmana.

Wygasły certyfikat

W praktyce najczęstsza przyczyna awarii związanych z TLS. Przeglądarki wyświetlają wtedy ostrzeżenie, a aplikacje przerywają połączenie, co oznacza przerwę w działaniu usługi, zwykle zauważoną dopiero po zgłoszeniach użytkowników. Wygaśnięcie certyfikatu jest w pełni przewidywalne, więc jego dopuszczenie świadczy o braku automatyzacji i monitoringu, a nie o błędzie technicznym. Najbardziej narażone są certyfikaty odnawiane ręcznie, certyfikaty na urządzeniach sieciowych i w systemach wewnętrznych oraz te w komponentach, o których nikt już nie pamięta.

Niekompletny łańcuch certyfikatów

Serwer powinien wysyłać certyfikat usługi razem ze wszystkimi certyfikatami pośrednimi. Ich brak łatwo przeoczyć, ponieważ przeglądarki zwykle potrafią uzupełnić łańcuch samodzielnie. Inne programy w tej samej sytuacji odrzucają połączenie. Strona działa więc u administratora, który ją sprawdza, a części użytkowników nie.

Certyfikat wystawiony na inną nazwę

Certyfikat jest wystawiany na konkretne domeny i klient akceptuje go tylko wtedy, gdy domena, z którą się łączy, jest wśród nich wymieniona. Typowe błędy to brak wariantu z przedrostkiem www lub bez niego, dostęp do usługi po adresie IP albo po wewnętrznej nazwie hosta oraz nieporozumienia wokół certyfikatów wieloznacznych: *.example.com nie obejmuje ani example.com, ani a.b.example.com. Użytkownik widzi wtedy ostrzeżenie o tej samej treści co przy prawdziwym ataku.

Certyfikat niezaufany lub samopodpisany

Urządzenia sieciowe, panele administracyjne i środowiska testowe korzystają zwykle z domyślnego certyfikatu, wygenerowanego przez sam system. Klient nie ma jak potwierdzić, kto go wystawił, więc wyświetla ostrzeżenie. Taki certyfikat może wygenerować każdy, również atakujący, więc nie chroni przed podszyciem się pod usługę.

Wyłączona weryfikacja certyfikatu po stronie klienta

Weryfikację wyłącza się zwykle tymczasowo, żeby obejść błąd certyfikatu i uruchomić usługę, po czym ustawienie zostaje na lata. Dotyczy to zarówno skryptów i aplikacji, jak i opcji ignorowania błędów certyfikatu w narzędziach monitoringu.

Dlaczego samo szyfrowanie nie wystarcza

Klient <--- szyfrowane TLS ---> Atakujący <--- szyfrowane TLS ---> Serwer

Atakujący, który znajdzie się w środku połączenia, zestawia dwa w pełni poprawne, szyfrowane połączenia: jedno z klientem, drugie z serwerem. Cały ruch jest szyfrowany, a mimo to atakujący widzi go w postaci jawnej i może go zmieniać. Jedyne, co temu zapobiega, to certyfikat, ponieważ atakujący nie dysponuje certyfikatem wystawionym na atakowaną domenę przez zaufany urząd. Dlatego wyłączenie weryfikacji certyfikatu znosi ochronę niezależnie od tego, jak silne szyfry skonfigurowano na serwerze.

Słabe algorytmy podpisu certyfikatu

Certyfikaty podpisane algorytmem SHA-1 lub MD5 oraz klucze RSA krótsze niż 2048 bitów nie zapewniają dziś wystarczającej ochrony i są odrzucane przez współczesne przeglądarki.

Niewłaściwa ochrona klucza prywatnego

Kopie klucza prywatnego trafiają czasem do repozytoriów kodu, kopii zapasowych czy obrazów maszyn wirtualnych, a jeden klucz bywa współdzielony przez wiele systemów. Jego ujawnienie pozwala podszyć się pod usługę, a potencjalnie także odszyfrować wcześniej zarejestrowany ruch.

Rekomendacje

Protokół i szyfry

  • wyłączyć obsługę SSL 2.0, SSL 3.0, TLS 1.0 oraz TLS 1.1,
  • dopuścić wyłącznie TLS 1.2 i TLS 1.3,
  • ograniczyć listę zestawów szyfrów do silnych algorytmów, takich jak:
    • AES-GCM,
    • ChaCha20-Poly1305,
  • wyłączyć szyfry RC4, 3DES, szyfry eksportowe oraz zestawy NULL i aNULL.

Certyfikaty

  • używać protokołu ACME do automatycznego pozyskiwania i odnawiania certyfikatów. Obsługuje go m.in. Let's Encrypt,
  • ustawić powiadomienia o zbliżającym się wygaśnięciu certyfikatu na kilkanaście dni przed terminem,
  • prowadzić spis certyfikatów wraz z osobami odpowiedzialnymi za ich odnawianie, obejmujący także urządzenia sieciowe i systemy wewnętrzne,
  • wysyłać pełny łańcuch, czyli certyfikat usługi razem z certyfikatami pośrednimi,
  • sprawdzić, czy certyfikat obejmuje wszystkie nazwy, pod którymi usługa jest dostępna, w tym wariant z przedrostkiem www i bez niego,
  • używać kluczy RSA o długości co najmniej 2048 bitów lub kluczy ECDSA co najmniej 256 bitów oraz podpisów SHA-256,
  • przechowywać klucz prywatny wyłącznie na serwerze, na którym jest używany, i nie kopiować go do repozytoriów kodu ani na komputery zespołu,
  • przygotować procedurę szybkiej wymiany certyfikatu i klucza na wypadek jego ujawnienia.

Weryfikacja po stronie klienta

  • nie wyłączać weryfikacji certyfikatu w aplikacjach, skryptach ani w narzędziach monitoringu, nawet tymczasowo,
  • sprawdzać zarówno cały łańcuch certyfikatów (certificate chain), jak i zgodność nazwy hosta z certyfikatem (hostname verification),
  • w systemach wewnętrznych zamiast certyfikatów samopodpisanych korzystać z własnego urzędu certyfikacji i rozesłać jego certyfikat do klientów.

Wdrożenie i utrzymanie

  • włączyć HSTS, czyli nagłówek HTTP, którym serwer informuje przeglądarkę, że z tą domeną wolno łączyć się wyłącznie z wykorzystaniem HTTPS. Przeglądarka zapamiętuje to na wskazany czas i nie wyśle już żądania nieszyfrowanym protokołem HTTP, nawet jeśli użytkownik wpisze adres bez https lub kliknie w taki link:

    Strict-Transport-Security: max-age=31536000; includeSubDomains
    
  • zapewnić szyfrowanie TLS na każdym odcinku komunikacji, w tym pomiędzy poszczególnymi komponentami infrastruktury oraz za proxy i load balancerami,

  • regularnie aktualizować biblioteki kryptograficzne oraz oprogramowanie serwerowe,
  • sprawdzać konfigurację odpowiednimi narzędziami (np. SSL Labs, testssl.sh) okresowo oraz po każdej zmianie ustawień serwera.