Jak naprawić lukę „logjam” w Apache (httpd)

56

Niedawno opublikowano nową lukę w zabezpieczeniach Diffie-Hellman, nieoficjalnie zwaną „logjam”, dla której ta strona została zebrana, sugerując sposób jej wyeliminowania:

Mamy trzy zalecenia dotyczące prawidłowego wdrożenia Diffie-Hellman dla TLS:

  1. Wyłącz eksport szyfrów. Chociaż współczesne przeglądarki nie obsługują już pakietów eksportowych, ataki FREAK i Logjam pozwalają atakującemu typu man-in-the-middle nakłonić przeglądarki do korzystania z kryptografii klasy eksportowej, po czym można odszyfrować połączenie TLS. Szyfry eksportowe to pozostałość po polityce z lat 90., która uniemożliwiła eksport silnych protokołów kryptograficznych ze Stanów Zjednoczonych. Żaden współczesny klient nie polega na pakiecie eksportowym i wyłączanie go ma niewielką wadę.
  2. Wdróż (efemeryczna) eliptyczna krzywa Diffiego-Hellmana (ECDHE). Wymiana klucza Eliffi-Curve Diffie-Hellman (ECDH) pozwala uniknąć wszystkich znanych możliwych ataków kryptoanalitycznych, a współczesne przeglądarki internetowe wolą teraz ECDHE od oryginalnego, skończonego pola, Diffie-Hellman. Algorytmy logów dyskretnych, których używaliśmy do atakowania standardowych grup Diffie-Hellmana, nie zyskują tak silnej przewagi nad obliczeniami wstępnymi, a pojedyncze serwery nie muszą generować unikalnych krzywych eliptycznych.
  3. Wygeneruj silną, unikalną grupę Diffie Hellman . Kilka ustalonych grup jest używanych przez miliony serwerów, co czyni je optymalnym celem do obliczeń wstępnych i potencjalnego podsłuchu. Administratorzy powinni wygenerować unikalne, 2048-bitowe lub silniejsze grupy Diffie-Hellman, używając „bezpiecznych” liczb pierwszych dla każdej witryny lub serwera.

Jakie są najlepsze praktyki, które należy podjąć, aby zabezpieczyć mój serwer zgodnie z powyższymi zaleceniami?

Christophe De Troyer
źródło
4
Powiązane: Co to jest Logjam i jak temu zapobiec?
Przywróć Monikę - M. Schröder

Odpowiedzi:

82

Z artykułu, który podłączyłeś , są trzy zalecane kroki, aby zabezpieczyć się przed tą podatnością. Zasadniczo te kroki dotyczą każdego oprogramowania, którego można używać z SSL / TLS, ale tutaj zajmiemy się konkretnymi krokami, aby zastosować je do Apache (httpd), ponieważ jest to oprogramowanie, o którym mowa.

  1. Wyłącz eksport szyfrów

Zajmij się zmianami konfiguracji, które wprowadzimy w 2. poniżej ( !EXPORTpod koniec SSLCipherSuitelinii jest sposób, w jaki wyłączymy eksport pakietów szyfrów)

  1. Wdróż (efemeryczny) eliptyczny krzywa Diffie-Hellman (ECDHE)

W tym celu trzeba zmienić kilka ustawień w plikach konfiguracyjnych Apache - mianowicie SSLProtocol, SSLCipherSuite, SSLHonorCipherOrderaby mieć „sprawdzone metody” setup. Wystarczy coś takiego:

SSLProtocol             all -SSLv2 -SSLv3

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder     on

Uwaga: jeśli chodzi o to, którego SSLCipherSuiteustawienia użyć, zawsze się to zmienia i dobrym pomysłem jest skonsultowanie się z takimi zasobami, jak ten, aby sprawdzić najnowszą zalecaną konfigurację.

3. Wygeneruj silną, unikalną grupę Diffie Hellman

Aby to zrobić, możesz uruchomić

openssl dhparam -out dhparams.pem 2048.

Pamiętaj, że spowoduje to znaczne obciążenie serwera podczas generowania parametrów - zawsze możesz obejść ten potencjalny problem, generując parametry na innej maszynie i używając scplub w podobny sposób, aby przenieść je na dany serwer w celu użycia.

Aby użyć tych nowo wygenerowanych dhparamsw Apache, z Dokumentacji Apache :

Aby wygenerować niestandardowe parametry DH, użyj komendy openssl dhparam. Alternatywnie możesz dołączyć następujące standardowe 1024-bitowe parametry DH z RFC 2409, sekcja 6.2 do odpowiedniego pliku SSLCertificateFile :

(moje podkreślenie)

po którym następuje standardowy 1024-bitowy parametr DH. Z tego możemy wywnioskować, że parametry DH wygenerowane na zamówienie mogą być po prostu dołączone do odpowiednich danych SSLCertificateFilepytań.

Aby to zrobić, uruchom coś podobnego do następującego:

cat /path/to/custom/dhparam >> /path/to/sslcertfile

Alternatywnie, zgodnie z podsekcją Apache artykułu, do którego pierwotnie się połączyłeś, możesz również określić niestandardowy plik dhparams, który utworzyłeś, jeśli wolisz nie zmieniać samego pliku certyfikatu, a zatem:

SSLOpenSSLConfCmd DHParameters "/path/to/dhparams.pem"

niezależnie od tego, które konfiguracje Apache są odpowiednie dla konkretnej implementacji SSL / TLS - ogólnie w conf.d/ssl.conflub, conf.d/vhosts.confale będzie to różnić się w zależności od konfiguracji Apache.

Warto zauważyć, że zgodnie z tym linkiem ,

Przed Apache 2.4.7 parametr DH jest zawsze ustawiony na 1024 bity i nie może być konfigurowany przez użytkownika. Zostało to naprawione w mod_ssl 2.4.7, że Red Hat dokonał backportacji do swojej dystrybucji RHEL 6 Apache 2.2 z httpd-2.2.15-32.el6

W Debian Wheezy zaktualizuj apache2 do wersji 2.2.22-13 + deb7u4 lub nowszej i openssl do wersji 1.0.1e-2 + deb7u17. Powyższy SSLCipherSuite nie działa idealnie, zamiast tego użyj następujących jak na tym blogu :

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-CAMELLIA128-SHA:!DHE-RSA-CAMELLIA256-SHA

Powinieneś sprawdzić, czy twoja wersja Apache jest późniejsza niż te numery wersji w zależności od twojej dystrybucji, a jeśli nie - zaktualizuj ją, jeśli to możliwe.

Po wykonaniu powyższych kroków w celu zaktualizowania konfiguracji i zrestartowaniu usługi Apache w celu zastosowania zmian, należy sprawdzić, czy konfiguracja jest pożądana, uruchamiając testy na SSLLabs i w artykule dotyczącym tej szczególnej luki.

BE77Y
źródło
1
Jeśli chodzi o obciążenie nałożone na serwer poprzez generowanie parametrów, zawsze możesz wygenerować je na innym komputerze i po prostu scp lub nawet skopiować i wkleić plik na serwer docelowy. Nie ma potrzeby generowania parametrów na serwerze produkcyjnym.
Erathiel,
2
Po zmianie konfiguracji możesz również sprawdzić na stronie SSLLabs.com, aby się upewnić.
user2428118
2
Czy istnieje sposób na usunięcie tej luki w Apache / 2.2.22 (Ubuntu 12.04)? Dołączyłem plik dhparams.pem do certificate.crt, ale słabydh.org/sysadmin.html nadal narzeka
tersmitten
2
@tersmitten To jest zupełnie osobne pytanie do tego.
Michael Hampton
3
zawsze możesz uruchomić generowanie klucza za pomocą polecenia „nice”. więc możesz to ująć jako: nice 19 openssl dhparam -out dhparams.pem 2048. Będzie to działać dłużej, ale zużyje tylko nieużywany czas procesora.
Znik,
1

W oparciu o łatkę Winni Neessen opublikowałem poprawkę dla Apache / 2.2.22 (Debian Wheezy, być może także do użytku na Ubuntu): https://flo.sh/debian-wheezy-apache2-logjam-fix/ - thx . za opinię.

Flo
źródło
3
to bardziej hackish hack niż rozwiązanie. umieszczenie najnowszego nginx przed twoim apache jako odwrotnym proxy byłoby znacznie łatwiejsze i nie polegasz na apache innej firmy.
tamten facet stamtąd
6
Dlaczego powinniśmy ufać tym plikom binarnym?
CVn
2
Nie musisz ufać plikom binarnym; możesz bardzo łatwo samodzielnie skompilować apache2.2.x postępując zgodnie z instrukcjami wyjaśnionymi, jeśli poświęcisz trochę czasu. Zwiększy to ponadto twoje bezpieczeństwo, ponieważ wtedy twoja konfiguracja ma unikalne klucze podstawowe.
Flo
Sugerowałoby, że ludzie nie narzekają na łaty rozwiązujące problem w oprogramowaniu typu open source.
Florian Heigl,
@FlorianHeigl Nie jestem nawet pewien, co
sądzić
-7

Zamiast iść złożoną trasą powyższych „hacków”, rozważ przejście na nginx jako główne oprogramowanie serwera WWW (nie tylko buforowanie lub proxy). Wydaje się, że pod względem bezpieczeństwa bardziej odpowiada obecnym standardom niż stare silniki Apache. Korzystając z repozytorium nginx, zapewnia on znacznie bardziej stabilny silnik serwera WWW niż apache.

Całkowicie się zmieniłem. Zaoszczędziło mi to wiele czasochłonnego rozwiązywania problemów dotyczących TLS, a także - w przypadku naszych konfiguracji - uwolniło wiele pamięci RAM w tym samym czasie. W rzeczywistości znalazłem zatrudnienie nginx odświeżająco proste i jednoznaczne, w porównaniu z niezliczonymi komplikacjami konfiguracyjnymi httpd / apache, do których się przyzwyczaiłem. Może to być kwestia gustu, zanim się odwróciłem, byłem biegły w httpd / apache przepisanie / config / konserwacja i było to łatwiejsze, niż się obawiałem. Dostępne są odpowiednie najnowsze informacje na temat konfiguracji nginx dostępne online, a baza użytkowników jest ogromna, bardzo aktywna i przyjazna dla wsparcia. https://news.netcraft.com/wp-content/uploads/2018/11/wpid-wss-top-1m-share.png

Juliusz
źródło
3
Nginx skonfigurowany tak, aby zezwalał na szyfrowanie eksportu, byłby tak samo podatny na atak Logjam, jak serwer Apache skonfigurowany tak, aby pozwalał na szyfrowanie eksportu. Pytanie dotyczy również rozwiązań w Apache.
CVn
2
Właściwie rozwiązanie: albo przełącz się na dystrybucję, która zapewnia bardziej aktualne pakiety dla oprogramowania, w których absolutnie potrzebujesz nowszej wersji (nie tylko poprawki błędów, jak na przykład w przypadku Debiana lub CentOS), lub sam zbuduj pakiety ze źródła (nie jest to trudne) i zainstaluj je za pomocą menedżera pakietów lub zwykłej starej instalacji z kodu źródłowego (również nie jest trudne, ale zarządzanie wymaga nieco więcej pracy). Na pytanie, które brzmi „w jaki sposób mogę zmniejszyć podatność X w oprogramowaniu Y?”, Odpowiedź brzmi „zamień oprogramowanie Y na oprogramowanie Z” często nie jest przydatną odpowiedzią.
CVn
1
Apache do Nginx nie jest aktualizacją, jest zamiennikiem. Backporting jest możliwością. Jeśli masz dużo pracy zainwestowanej w rozwiązanie Apache, całkowite wyrzucenie go i zastąpienie go czymś innym również wymaga dużo pracy. To pytanie wciąż dotyczy rozwiązań skoncentrowanych wokół Apache , a nie Nginx. Nie zamierzam spędzać więcej czasu na kłótniach; publikując odpowiedzi, upewnij się, że odpowiadają na pytanie zadane u góry strony. Jeśli chcesz opublikować odpowiedź zachęcającą ludzi do przejścia z Apache na Nginx, zrób to, ale na pytanie, które pozwala na Nginx.
CVn
1
Czy właściwie skonfigurowanie oprogramowania w celu zabezpieczenia przed znanymi atakami to „złożona droga włamań”? Dostaję A + na ssllabs.com z prostą konfiguracją apache, musisz tylko poświęcić trochę czasu i przeprowadzić badania, aby zrozumieć, jak prawidłowo skonfigurować oprogramowanie, którego używasz, bez hacków tutaj ...
Chazy Chaz
1
@Julius - opinie negatywne są bardziej związane z brakiem wartości w odpowiedzi na zadane pytanie, niż z jakimkolwiek ukrytym „porządkiem”, który ludzie najwyraźniej mogliby mieć przeciwko nginx przeciwko apache. Tak się składa, że ​​używam nginx wyłącznie ze względu na moje preferencje - ale to ja odpowiedziałem na to pytanie. „Przełącz na inne oprogramowanie” nie jest akceptowalną odpowiedzią na „jak naprawić (jakikolwiek problem)”. Nie wspominając o tym, że całkowicie przegapiłeś punkt faktycznej podatności - była to wymiana kluczy diffie-hellman, a nie apache (lub nginx, sshd lub ...)
BE77Y,