Den ultimative guide til sikring, hærdning og forbedring af Nginx-webserverens ydeevne
Baseret på de vidunderlige ting, du har hørt om Nginx, besluttede du måske at prøve det. Du har muligvis ønsket det så meget, at du overvejer at erstatte dine Apache-installationer med Nginx efter at have gennemgået nogle af artiklerne om emnet, som vi har offentliggjort på dette websted.
I så fald er jeg sikker på, at du vil byde denne vejledning velkommen med åbne arme, da vi vil dække 12 tip til at øge sikkerheden på dine Nginx-servere (lige fra at holde Nginx opdateret hele vejen til brug af TLS og omdirigering af HTTP til HTTPS), og du vil bemærke, at nogle af dem minder meget om, hvad du ville gøre med Apache.
Gå ikke glip af:
Vi bruger følgende miljø i denne vejledning:
- Debian GNU/Linux 8.1 (jessie).
- IP-adresse: 192.168.0.25 (tecmintlovesnginx.com) og 192.168.0.26 (nginxmeanspower.com) som beskrevet i det IP-baserede virtuelle værtsafsnit på
- “Sådan konfigureres navne- og IP-baserede virtuelle værter (serverblokke) med Nginx”
Med det i tankerne, lad os begynde.
TIP # 1: Hold Nginx opdateret
På dette tidspunkt er de nyeste Nginx-versioner i CentOS (i EPEL) og Debian-arkiver henholdsvis 1.6.3 og 1.6.2-5.
Selvom installation af software fra arkiverne er nemmere end at kompilere programmet fra kildekoden, har denne sidste mulighed to fordele: 1) det giver dig mulighed for at opbygge ekstra moduler i Nginx (såsom mod_security) og 2) det vil altid give en nyere version end arkiverne (1.9.9 pr. i dag). Udgivelsesnoterne er altid tilgængelige på Nginx-webstedet.
Gå ikke glip af:
TIP # 2: Fjern unødvendige moduler i Nginx
For eksplicit at fjerne moduler fra Nginx under installation fra kilden skal du gøre:
# ./configure --without-module1 --without-module2 --without-module3
For eksempel:
# ./configure --without-http_dav_module --withouthttp_spdy_module
Som du sandsynligvis vil gætte, skal du udføre kompilering igen, hvis du fjerner moduler fra en tidligere Nginx-installation fra kilden.
Et forsigtighedsord: Konfigurationsdirektiver leveres af moduler. Sørg for, at du ikke deaktiverer et modul, der indeholder et direktiv, du har brug for på vejen! Du bør kontrollere nginx-dokumenterne for at få vist listen over direktiver, der er tilgængelige i hvert modul, inden du træffer en beslutning om deaktivering af moduler.
TIP # 3: Deaktiver server_tokens-direktivet i Nginx
Direktivet
server_tokens
beder Nginx om at vise sin aktuelle version på fejlsider. Dette er ikke ønskeligt, da du ikke ønsker at dele disse oplysninger med verden for at forhindre angreb på din webserver forårsaget af kendte sårbarheder i den specifikke version.For at deaktivere
server_tokens
-direktivet skal du indstille, om det skal deaktiveres inde i en serverblok:server { listen 192.168.0.25:80; server_tokens off; server_name tecmintlovesnginx.com www.tecmintlovesnginx.com; access_log /var/www/logs/tecmintlovesnginx.access.log; error_log /var/www/logs/tecmintlovesnginx.error.log error; root /var/www/tecmintlovesnginx.com/public_html; index index.html index.htm; }
Genstart nginx og kontroller ændringerne:
TIP # 4: Afvis HTTP-brugeragenter i Nginx
En HTTP-brugeragent er en software, der bruges til indholdsforhandlinger mod en webserver. Dette inkluderer også malware-bots og -crawlere, der muligvis ender med at påvirke din webservers ydeevne ved at spilde systemressourcer.
For lettere at vedligeholde listen over uønskede brugeragenter skal du oprette en fil (f.eks.
/etc/nginx/blockuseragents.rules
) med følgende indhold:map $http_user_agent $blockedagent { default 0; ~*malicious 1; ~*bot 1; ~*backdoor 1; ~*crawler 1; ~*bandit 1; }
Derefter placeres følgende linje før serverblokdefinitionen:
include /etc/nginx/blockuseragents.rules;
Og en if-erklæring for at returnere et 403-svar, hvis brugeragentstrengen er i den sorte liste, der er defineret ovenfor:
Genstart nginx, og alle brugeragenter, hvis streng matcher ovenstående, blokeres fra adgang til din webserver. Udskift 192.168.0.25 med din servers IP, og vælg gerne en anden streng til wget:
--user-agent
switch:# wget http://192.168.0.25/index.html # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html
TIP # 5: Deaktiver uønskede HTTP-metoder i Nginx
HTTP-metoder, også kendt som verb, angiver den ønskede handling, der skal udføres på en ressource, der betjenes af Nginx. For almindelige websteder og applikationer skal du kun tillade GET, POST og HEAD og deaktivere alle andre.
For at gøre dette skal du placere følgende linjer inde i en serverblok. Et 444 HTTP-svar betyder et tomt svar og bruges ofte i Nginx til at narre malwareangreb:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; }
For at teste skal du bruge curl til at sende en DELETE-anmodning og sammenligne output med, når du sender en regelmæssig GET:
# curl -X DELETE http://192.168.0.25/index.html # curl -X POST http://192.168.0.25/index.html
TIP # 6: Indstil bufferstørrelsesbegrænsninger i Nginx
For at forhindre bufferoverløbsangreb mod din Nginx-webserver skal du indstille følgende direktiver i en separat fil (oprette en ny fil med navnet
/etc/nginx/conf.d/buffer.conf
, for eksempel):client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k;
Ovenstående direktiver vil sikre, at anmodninger til din webserver ikke medfører bufferoverløb i dit system. Igen henvises til dokumenterne for yderligere detaljer om, hvad hver af dem gør.
Tilføj derefter et inkluderingsdirektiv i konfigurationsfilen:
include /etc/nginx/conf.d/*.conf;
TIP # 7: Begræns antallet af forbindelser efter IP i Nginx
For at begrænse forbindelserne med IP skal du bruge direktiverne
limit_conn_zone
(i en http-kontekst eller i det mindste uden for serverblokken) og limit_conn (i en http-, serverblok- eller placeringskontekst).Husk dog, at ikke alle forbindelser tælles - men kun dem, der har en anmodning behandlet af serveren, og hele anmodningens overskrift er blevet læst.
Lad os for eksempel indstille det maksimale antal forbindelser til
1
(ja, det er en overdrivelse, men det vil gøre jobbet fint i dette tilfælde) i en zone med navnet addr (du kan indstille dette til hvad som helst navn du ønsker):limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 1;
En simpel test med Apache Benchmark (Udfør Nginx Load) hvor
10
samlede forbindelser foretages med2
samtidige anmodninger hjælper os med at demonstrere vores pointe:# ab -n 10 -c 2 http://192.168.0.25/index.html
Se det næste tip for yderligere detaljer.
TIP # 8: Opsæt skærmlogfiler til Nginx
Når du har udført testen beskrevet i forrige tip, skal du kontrollere den fejllog, der er defineret til serverblokken:
Det kan være en god idé at bruge grep til at filtrere logfilerne for mislykkede anmodninger til addr-zonen defineret i TIP # 7:
# grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
På samme måde kan du filtrere adgangsloggen for at få oplysninger af interesse, såsom:
- Klient-IP
- Browser type
- HTTP-anmodningstype
- Anmodet om ressource
- Serverblok, der besvarer anmodningen (nyttigt, hvis flere virtuelle værter logger på den samme fil).
Og tag passende skridt, hvis du opdager usædvanlig eller uønsket aktivitet.
TIP # 9: Undgå hotlinking af billeder i Nginx
Billed hotlinking sker, når en person viser et billede, der hostes på dit, på et andet websted. Dette medfører en stigning i din båndbreddebrug (som du betaler for), mens den anden person med glæde viser billedet som om det var hans eller hendes ejendom. Med andre ord er det et dobbelt tab for dig.
Lad os for eksempel sige, at du har en underkatalog med navnet
img
inde i din serverblok, hvor du gemmer alle de billeder, der bruges i den virtuelle vært. For at forhindre andre websteder i at bruge dine billeder skal du indsætte følgende placeringsblok i din virtuelle værtsdefinition:location /img/ { valid_referers none blocked 192.168.0.25; if ($invalid_referer) { return 403; } }
Rediger derefter
index.html
-filen i hver virtuel vært som følger:Gennemse nu til hvert websted, og som du kan se, vises billedet korrekt i 192.168.0.25, men erstattes af et 403-svar i 192.168.0.26:
Bemærk, at dette tip afhænger af, at den eksterne browser sender Referer-feltet.
TIP # 10: Deaktiver SSL og aktiver kun TLS i Nginx
Når det er muligt, skal du gøre hvad der kræves for at undgå SSL i nogen af dens versioner og bruge TLS i stedet. Følgende
ssl_protocols
skal placeres i en server eller http-kontekst i din virtuelle værtsfil eller er en separat fil via et inkluderingsdirektiv (nogle mennesker bruger en fil med navnetssl.conf
, men det er helt op til dig):ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
For eksempel:
TIP # 11: Opret certifikater i Nginx
Først skal du generere en nøgle og et certifikat. Du er velkommen til at bruge en anden type kryptering, hvis du vil:
# openssl genrsa -aes256 -out tecmintlovesnginx.key 1024 # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr # cp tecmintlovesnginx.key tecmintlovesnginx.key.org # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt
Tilføj derefter følgende linjer inde i en separat serverblok som forberedelse til næste tip (
http -> https
omdirigering) og flyt også de SSL-relaterede direktiver til den nye blok:server { listen 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-enabled/certs/tecmintlovesnginx.crt; ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }
I det næste tip vil vi kontrollere, hvordan vores side nu bruger et selvsigneret certifikat og TLS.
TIP # 12: Omdiriger HTTP-trafik til HTTPS i Nginx
Føj følgende linje til den første serverblok:
return 301 https://$server_name$request_uri;
Ovenstående direktiv returnerer et 301-svar (flyttes permanent), der bruges til permanent URL-omdirigering, hver gang der fremsættes en anmodning til port 80 på din virtuelle vært, og omdirigerer anmodningen til den serverblok, vi tilføjede i det forrige tip.
Billedet nedenfor viser omdirigering og bekræfter, at vi bruger TLS 1.2 og AES-256 til kryptering:
Resumé
I denne artikel har vi delt et par tip til at sikre din Nginx-webserver. Vi vil meget gerne høre, hvad du synes, og hvis du har andre tip, som du gerne vil dele med resten af samfundet, er du velkommen til at give os besked ved at sende os en note ved hjælp af nedenstående kommentarformular.