Ostateczny przewodnik po bezpieczeństwie, stwardnienia i poprawie wydajności serwera WWW Nginx

Ostateczny przewodnik po bezpieczeństwie, stwardnienia i poprawie wydajności serwera WWW Nginx
Nginx Wskazówki dotyczące hartowania bezpieczeństwa

Na podstawie cudownych rzeczy, o których słyszałeś Nginx, Być może postanowiłeś spróbować. Być może bardzo ci się podobało, że rozważają zastąpienie instalacji Apache Nginx po przejściu niektórych artykułów na ten temat, który opublikowaliśmy na tej stronie.

Jeśli tak, jestem pewien, że powitacie tego przewodnika z otwartymi ramionami, ponieważ zamierzamy pokryć 12 wskazówek, aby zwiększyć bezpieczeństwo twojego nginx serwery (od aktualizacji Nginx na bieżąco po użycie TLS i przekierowanie HTTP do HTTPS), a zauważysz, że niektóre z nich są bardzo podobne do tego, co zrobiłbyś z Apache.

Nie przegap:

13 Wskazówki dotyczące bezpieczeństwa serwera WWW Apache i utwardzania

25 sztuczek Apache Htaccess w celu zabezpieczenia serwera WWW Apache

Środowisko testowania Nginx

W tym przewodniku użyjemy następującego środowiska:

  1. Debian GNU/Linux 8.1 (Jessie).
  2. Adres IP: 192.168.0.25 (Tecmintlovesnginx.com) i 192.168.0.26 (Nginxmeanspower.com), jak opisano w sekcji wirtualnych hostów opartych na IP pod numerem
    1. „Jak konfigurować wirtualne hosty oparte na nazwach i IP (bloki serwera) z Nginx”
  3. Wersja Nginx: Nginx/1.6.2.
  4. Dla Twojej wygody oto ostateczny plik konfiguracyjny (link pastebin).

Mając to na uwadze, zacznijmy.

Wskazówka nr 1: Utrzymuj nginx na bieżąco

W chwili pisania tego tekstu najnowsze wersje Nginx w Centos (w Epel), a repozytoria Debiana są 1.6.3 I 1.6.2-5, odpowiednio.

Nie przegap: Zainstaluj najnowszą stabilną wersję Nginx z repozytoriów i źródła

Chociaż instalowanie oprogramowania z repozytoriów jest łatwiejsze niż kompilowanie programu z kodu źródłowego, ta ostatnia opcja ma dwie zalety: 1) pozwala na zbudowanie dodatkowych modułów na Nginx (takie jak Mod_Security) i 2) zawsze zapewni nowszą wersję wersji niż repozytoria (1.9.9 od dzisiaj). Notatki z wydania są zawsze dostępne na stronie internetowej Nginx.

Nie przegap:

Chronić Apache przed brutalną siłą i atakami DDOS za pomocą MOD_Security i mod_evasive

Wskazówka nr 2: Usuń niepotrzebne moduły w Nginx

Aby wyraźnie usunąć moduły z Nginx podczas instalowania ze źródła, zrób:

# ./konfiguruj--without-module1--without-module2--without-module3 

Na przykład:

# ./konfiguruj--without-http_dav_module--withouthttp_spdy_module 

Jak prawdopodobnie zgadniesz, usunięcie modułów z poprzedniej instalacji Nginx ze źródła wymaga ponownego wykonania kompilacji.

Słowo ostrzeżenia: Dyrektywy konfiguracyjne są dostarczane przez moduły. Upewnij się, że nie wyłączysz modułu zawierającego dyrektywę, której potrzebujesz na drodze! Należy sprawdzić dokumenty Nginx dla listy dyrektyw dostępnych w każdym module przed podjęciem decyzji o wyłączeniu modułów.

Wskazówka nr 3: Wyłącz dyrektywę Server_Tokens w Nginx

server_tokens Dyrektywa mówi Nginx, aby wyświetlała swoją bieżącą wersję na stronach błędów. Nie jest to pożądane, ponieważ nie chcesz udostępniać tych informacji światu, aby zapobiec atakom na serwerze WWW spowodowanym przez znane luki w tej konkretnej wersji.

Wyłączyć server_tokens Dyrektywa, ustaw, jeśli wyłącz się w bloku serwera:

serwer Słuchaj 192.168.0.25:80; server_tokens off; Server_name TecmintLovesnginx.com www.Tecmintlovesnginx.com; access_log/var/www/logs/tecMIntLovesnginx.dostęp.dziennik; error_log/var/www/logs/tecMIntLovesnginx.błąd.Błąd dziennika; root/var/www/tecmintlovesnginx.com/public_html; indeks indeksu.Indeks HTML.HTM;  

Uruchom ponownie Nginx i zweryfikuj zmiany:

Ukryj informacje o wersji nginx

Wskazówka 4: Odmowa agentów użytkowników HTTP w Nginx

Agent użytkownika HTTP to oprogramowanie używane do negocjacji treści z serwerem WWW. Obejmuje to również złośliwe boty i pełzanie, które mogą mieć wpływ na wydajność Twojego serwera WWW poprzez marnowanie zasobów systemowych.

Aby łatwiej utrzymać listę niepożądanych agentów użytkowników, utwórz plik (/etc/nginx/blockuseragents.zasady na przykład) z następującymi treściami:

Map $ http_user_agent $ blockedagent default 0; ~*złośliwy 1; ~*bot 1; ~*Backdoor 1; ~*Crawler 1; ~*bandyt 1;  

Następnie umieść następujący wiersz przed definicją bloku serwera:

obejmują/etc/nginx/blockuseragents.zasady; 

Oraz instrukcja IF, aby zwrócić odpowiedź 403, jeśli ciąg agenta użytkownika znajduje się na czarnej liście zdefiniowanej powyżej:

Wyłącz agentów użytkowników w Nginx

Uruchom ponownie Nginx i wszystkich agentów użytkowników, których ciąg pasuje powyższe, zostaną zablokowane dostęp do serwera WWW. Zastępować 192.168.0.25 z adresem IP swojego serwera i wybierz inny ciąg dla --agent użytkownika wyłączać wget:

# wget http: // 192.168.0.25/indeks.html # wget-User-agent „I Am A Bandit Haha” http: // 192.168.0.25/indeks.html 
Blokuj agentów użytkowników w Nginx

Wskazówka #5: Wyłącz niechciane metody HTTP w Nginx

Znane również jako czasowniki, metody HTTP wskazują pożądane działanie, które należy podjąć na zasobach obsługiwanym przez Nginx. W przypadku wspólnych stron internetowych i aplikacji należy tylko zezwolić DOSTAWAĆ, POST, I GŁOWA i wyłącz wszystkie inne.

Aby to zrobić, umieść następujące wiersze wewnątrz bloku serwerowego. A 444 Odpowiedź HTTP oznacza pustą reakcję i jest często używana w Nginx do oszukania ataków złośliwego oprogramowania:

if ($ request_method !~ ^(Get | Head | Post) $) return 444;  

Aby przetestować, użyj kędzior Aby wysłać USUWAĆ poproś i porównaj wyjście do wysyłania regularnego DOSTAWAĆ:

# curl -x usuń http: // 192.168.0.25/indeks.html # curl -x post http: // 192.168.0.25/indeks.html 
Wyłącz niechciane żądania HTTP w Nginx

Wskazówka nr 6: Ustaw ograniczenia wielkości bufora w nginx

Aby zapobiec atakom przepełnienia bufora na serwer WWW Nginx, ustaw następujące dyrektywy w osobnym pliku (utwórz nowy plik o nazwie /etc/nginx/conf.D/Bufor.conf, Na przykład):

client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; LIST_CLIENT_HEADER_BUFFERS 2 1K; 

Powyższe dyrektywy zapewnią, że żądania złożone na serwerze WWW nie spowodują przepełnienia bufora w systemie. Jeszcze raz zapoznaj się z dokumentami, aby uzyskać więcej informacji na temat tego, co robi każdy z nich.

Następnie dodaj dyrektywę w pliku konfiguracyjnym:

obejmują/etc/nginx/conf.D/*.conf; 
Ustaw rozmiar bufora w Nginx

Wskazówka 7: Ogranicz liczbę połączeń według IP w Nginx

Aby ograniczyć połączenia według IP, użyj limit_conn_zone (W kontekście HTTP lub przynajmniej poza blokiem serwera) i limit_conn (w kontekście HTTP, bloku serwera lub lokalizacji).

Należy jednak pamiętać, że nie wszystkie połączenia są liczone - ale tylko te, które mają żądanie przetworzone przez serwer i odczytano cały nagłówek żądania.

Na przykład ustawmy maksymalną liczbę połączeń na 1 (Tak, to przesada, ale w tym przypadku wykonuje to zadanie) w strefie o nazwie Addr (możesz ustawić to na dowolną nazwę):

limit_conn_zone $ binary_remote_addr strefa = addr: 5m; limit_conn addr 1; 
Limit liczby żądań HTTP w Nginx

Prosty test z testem porównawczym Apache (wykonaj nginx obciążenie) gdzie 10 Całkowite połączenia są wykonane z 2 Jednoczesne prośby pomogą nam zademonstrować nasz punkt:

# ab -n 10 -C 2 http: // 192.168.0.25/indeks.html 

Zobacz następną wskazówkę, aby uzyskać dalsze szczegóły.

Wskazówka nr 8: Konfiguracja dzienników monitora dla Nginx

Po przeprowadzeniu testu opisanego w poprzedniej wskazówki sprawdź dziennik błędów zdefiniowany dla bloku serwera:

Dziennik błędów Nginx

Możesz chcieć użyć Grep Aby filtrować dzienniki dla nieudanych żądań złożonych do dodaćstrefa r zdefiniowana w Wskazówka #7:

# grep addr/var/www/logs/tecMIntLovesnginx.błąd.log - -color = auto 
Monitorowanie dziennika Nginx

Podobnie możesz odfiltrować dziennik dostępu, aby uzyskać informacje zainteresowane, takie jak:

  1. IP klienta
  2. Typ przeglądarki
  3. Typ żądania HTTP
  4. Zasób żądany
  5. Blok serwera Odpowiadający na żądanie (przydatne, jeśli kilka wirtualnych hostów loguje się do tego samego pliku).

I podejmij odpowiednie działania, jeśli wykryjesz jakąkolwiek nietypową lub niepożądaną aktywność.

Wskazówka nr 9: Zapobiegaj obrazie hotlinking w nginx

Obraz Hotlinking ma miejsce, gdy osoba wyświetla się na innej stronie, obraz hostowany na twoim. Powoduje to wzrost korzystania z przepustowości (za co płacisz), podczas gdy druga osoba szczęśliwie wyświetla obraz, jakby to była jego własność. Innymi słowy, jest to dla ciebie podwójna strata.

Załóżmy na przykład, że masz wymieniony podkład img Wewnątrz bloku serwera, w którym przechowujesz wszystkie obrazy używane w tym wirtualnym hoście. Aby zapobiec korzystaniu z zdjęć innych witryn, musisz wstawić następujący blok lokalizacji do definicji wirtualnego hosta:

lokalizacja / IMG / valid_referers Brak blokowany 192.168.0.25; if ($ invalid_referer) return 403;  

Następnie zmodyfikuj indeks.html Plik w każdym wirtualnym hoście w następujący sposób:

192.168.0.26

192.168.0.25





Nginx oznacza moc


Nginx oznacza moc!








Tecmint uwielbia Nginx


Tecmint uwielbia Nginx!




Teraz przejrzyj do każdej witryny i jak widać, obraz jest poprawnie wyświetlany 192.168.0.25 ale jest zastąpiony przez 403 Odpowiedź w 192.168.0.26:

Wyłącz Nginx Image Hotlinking

Zauważ, że ta wskazówka zależy od zdalnej przeglądarki wysyłającej pole odwołania.

Wskazówka #10: Wyłącz SSL i włącz tylko TLS w Nginx

O ile to możliwe, rób wszystko, aby uniknąć SSL w dowolnej wersji i użyciu Tls Zamiast. Następujące SSL_PROTOCOLS powinien być umieszczony w kontekście serwera lub HTTP w wirtualnym pliku hosta lub jest osobnym plikiem za pośrednictwem dyrektywy dołączonej (niektóre osoby używają pliku o nazwie SSL.conf, Ale to zależy całkowicie od ciebie):

SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2; 

Na przykład:

Wyłącz SSL i włącz TLS w Nginx

Wskazówka 11: Utwórz certyfikaty w Nginx

Po pierwsze, wygeneruj klucz i certyfikat. Jeśli chcesz, użyj innego rodzaju szyfrowania:

# OpenSsl genrsa -aes256 -out Tecmintlovesnginx.Klucz 1024 # Openssl req -new -key tecmintlovesnginx.Klucz -out Tecmintlovesnginx.CSR # CP Tecmintlovesnginx.Klucz TecMintLovesnginx.klucz.org # openssl rsa -in tecmintlovesnginx.klucz.Org -out Tecmintlovesnginx.Klucz # OpenSSL x509 -Req -Days 365 -in Tecmintlovesnginx.CSR -SIGNKEY TECMINTLOVESNGINX.Klucz -out Tecmintlovesnginx.crt 

Następnie dodaj następujące wiersze wewnątrz osobnego bloku serwerowego w ramach przygotowania do następnej wskazówki (http -> https Przekierowanie) i przenieś dyrektywy związane z SSL do nowego bloku:

serwer Słuchaj 192.168.0.25: 443 SSL; server_tokens off; Server_name TecmintLovesnginx.com www.Tecmintlovesnginx.com; root/var/www/tecmintlovesnginx.com/public_html; SSL_Certificate/Etc/nginx/Sites-obsługujący/certs/tecMIntLovesnginx.crt; SSL_Certificate_Key/etc/nginx/Sites-Enabled/certs/tecMintLovesnginx.klucz; SSL_PROTOCOLS TLSV1 TLSV1.1 TLSV1.2;  

W następnej wskazówce zweryfikujemy, w jaki sposób nasza strona jest teraz korzystana.

Wskazówka #12: Przekieruj ruch HTTP do HTTPS w Nginx

Dodaj następujący wiersz do pierwszego bloku serwera:

return 301 https: // $ server_name $ request_URI; 
Przekieruj HTTP do HTTPS w Nginx

Powyższa dyrektywa zwróci 301 (Przeniesiony na stałe) Odpowiedź, która jest używana do stałego przekierowania adresu URL za każdym razem, gdy żądanie jest składane do portu 80 wirtualnego hosta i przekieruje żądanie do bloku serwera, który dodano w poprzedniej wskazówki.

Poniższy obraz pokazuje przekierowanie i potwierdza fakt, że używamy TLS 1.2 I AES-256 do szyfrowania:

Sprawdź szyfrowanie TLS nginx

Streszczenie

W tym artykule udostępniliśmy kilka wskazówek, aby zabezpieczyć Twój serwer WWW Nginx. Chcielibyśmy usłyszeć, co myślisz, a jeśli masz inne wskazówki, które chciałbyś podzielić się z resztą społeczności, daj nam znać, wysyłając nam notatkę za pomocą poniższego formularza komentarza.