Ostateczny przewodnik po bezpieczeństwie, stwardnienia i poprawie wydajności serwera WWW Nginx
- 2147
- 269
- Tomasz Szatkowski
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:
- Debian GNU/Linux 8.1 (Jessie).
- 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
- „Jak konfigurować wirtualne hosty oparte na nazwach i IP (bloki serwera) z Nginx”
- Wersja Nginx: Nginx/1.6.2.
- 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 nginxWskazó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 NginxUruchom 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.htmlBlokuj 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.htmlWyłą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 NginxMoż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 = autoMonitorowanie dziennika Nginx
Podobnie możesz odfiltrować dziennik dostępu, aby uzyskać informacje zainteresowane, takie jak:
- IP klienta
- Typ przeglądarki
- Typ żądania HTTP
- Zasób żądany
- 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 HotlinkingZauważ, ż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 NginxWskazó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 nginxStreszczenie
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.
- « Jak utworzyć własny serwer IM/CHAT za pomocą „Openfire” w Linux
- Jak naprawić „wspólne połączenie z x.X.xx zamknięty ”Ansible Błąd »