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:

  1. Debian GNU/Linux 8.1 (jessie).
  2. 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å
    1. “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 med 2 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:

    1. Klient-IP
    2. Browser type
    3. HTTP-anmodningstype
    4. Anmodet om ressource
    5. 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 navnet ssl.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.