Den ultimate guiden for å sikre, herde og forbedre ytelsen til Nginx Web Server


Basert på de fantastiske tingene du har hørt om Nginx, bestemte du deg kanskje for å prøve det. Du har kanskje likt det så godt at du vurderer å erstatte Apache-installasjonene dine med Nginx etter å ha gått gjennom noen av artiklene om emnet som vi har publisert på denne siden.

I så fall er jeg sikker på at du vil ta imot denne guiden med åpne armer siden vi skal dekke 12 tips for å øke sikkerheten til dine Nginx-servere (alt fra å holde Nginx oppdatert hele veien til å bruke TLS og omdirigere HTTP til HTTPS), og du vil merke at noen av dem ligner veldig på det du ville gjort med Apache.

Ikke gå glipp av:

Vi vil bruke følgende miljø i denne veiledningen:

  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 delen IP-baserte virtuelle verter på
    1. Hvordan konfigurerer du navnebaserte og IP-baserte virtuelle verter (serverblokker) med Nginx

    Med det i tankene, la oss begynne.

    TIPS #1: Hold Nginx oppdatert

    Når dette skrives, er de siste Nginx-versjonene i CentOS (i EPEL) og Debian-repositoriene henholdsvis 1.6.3 og 1.6.2-5.

    Selv om det er enklere å installere programvare fra depotene enn å kompilere programmet fra kildekoden, har dette siste alternativet to fordeler: 1) det lar deg bygge ekstra moduler inn i Nginx (som mod_security), og 2) det vil alltid gi en nyere versjon enn depotene (1.9.9 per i dag). Utgivelsesnotatene er alltid tilgjengelige på Nginx-nettstedet.

    Ikke gå glipp av:

    TIPS #2: Fjern unødvendige moduler i Nginx

    For å eksplisitt fjerne moduler fra Nginx mens du installerer fra kilden, gjør du:

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

    For eksempel:

    # ./configure  --without-http_dav_module --withouthttp_spdy_module 
    

    Som du sikkert vil gjette, krever å fjerne moduler fra en tidligere Nginx-installasjon fra kilden å utføre kompileringen på nytt.

    Et ord til forsiktighet: Konfigurasjonsdirektiver leveres av moduler. Pass på at du ikke deaktiverer en modul som inneholder et direktiv du trenger på veien! Du bør sjekke nginx-dokumentene for listen over tilgjengelige direktiver i hver modul før du tar en beslutning om å deaktivere moduler.

    TIPS #3: Deaktiver server_tokens-direktivet i Nginx

    server_tokens-direktivet forteller Nginx å vise sin gjeldende versjon på feilsider. Dette er ikke ønskelig siden du ikke ønsker å dele denne informasjonen med verden for å forhindre angrep på webserveren din forårsaket av kjente sårbarheter i den spesifikke versjonen.

    For å deaktivere server_tokens-direktivet, sett om til av inne i en serverblokk:

    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;
    }
    

    Start nginx på nytt og bekreft endringene:

    TIPS #4: Nekt HTTP-brukeragenter i Nginx

    En HTTP-brukeragent er en programvare som brukes til innholdsforhandling mot en webserver. Dette inkluderer også malware-roboter og robotsøkeprogrammer som kan ende opp med å påvirke nettserverens ytelse ved å kaste bort systemressurser.

    For å lettere vedlikeholde listen over uønskede brukeragenter, lag en fil (for eksempel /etc/nginx/blockuseragents.rules) med følgende innhold:

    map $http_user_agent $blockedagent {
            default         0;
            ~*malicious     1;
            ~*bot           1;
            ~*backdoor      1;
            ~*crawler       1;
            ~*bandit        1;
    }
    

    Plasser deretter følgende linje før serverblokkdefinisjonen:

    include /etc/nginx/blockuseragents.rules;
    

    Og en if-setning for å returnere et 403-svar hvis brukeragentstrengen er i svartelisten definert ovenfor:

    Start nginx på nytt, og alle brukeragenter hvis streng samsvarer med ovenstående vil bli blokkert fra å få tilgang til webserveren din. Erstatt 192.168.0.25 med serverens IP og velg gjerne en annen streng for --user-agent-bryteren til wget:

    # wget http://192.168.0.25/index.html
    # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 
    

    TIPS #5: Deaktiver uønskede HTTP-metoder i Nginx

    Også kjent som verb, HTTP-metoder indikerer ønsket handling som skal utføres på en ressurs som betjenes av Nginx. For vanlige nettsteder og applikasjoner bør du bare tillate GET, POST og HEAD og deaktivere alle andre.

    For å gjøre det, plasser følgende linjer inne i en serverblokk. Et 444 HTTP-svar betyr et tomt svar og brukes ofte i Nginx for å lure angrep mot skadelig programvare:

    if ($request_method !~ ^(GET|HEAD|POST)$) {
       return 444;
    }
    

    For å teste, bruk curl for å sende en DELETE-forespørsel og sammenligne utdataene med når du sender en vanlig GET:

    # curl -X DELETE http://192.168.0.25/index.html
    # curl -X POST http://192.168.0.25/index.html 
    

    TIPS #6: Angi begrensninger for bufferstørrelse i Nginx

    For å forhindre bufferoverløpsangrep mot din Nginx-nettserver, sett følgende direktiver i en separat fil (opprett en ny fil kalt /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;
    

    Direktivene ovenfor vil sikre at forespørsler til webserveren din ikke vil forårsake bufferoverflyt i systemet ditt. Igjen, se dokumentene for ytterligere detaljer om hva hver av dem gjør.

    Legg deretter til et inkluderingsdirektiv i konfigurasjonsfilen:

    include /etc/nginx/conf.d/*.conf;
    

    TIPS #7: Begrens antall tilkoblinger med IP i Nginx

    For å begrense tilkoblingene med IP, bruk limit_conn_zone (i en http-kontekst eller i det minste utenfor serverblokken) og limit_conn (i en http-, serverblokk- eller plasseringskontekst).

    Vær imidlertid oppmerksom på at ikke alle tilkoblinger telles – men bare de som har en forespørsel behandlet av serveren og hele forespørselsoverskriften er lest.

    La oss for eksempel sette maksimalt antall tilkoblinger til 1 (ja, det er en overdrivelse, men det vil gjøre jobben helt fint i dette tilfellet) i en sone som heter adr (du kan sette dette til hva som helst navn du ønsker):

    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 1;
    

    En enkel test med Apache Benchmark (Utfør Nginx Load) hvor 10 totale tilkoblinger er laget med 2 samtidige forespørsler vil hjelpe oss med å demonstrere poenget vårt:

    # ab -n 10 -c 2 http://192.168.0.25/index.html
    

    Se neste tips for flere detaljer.

    TIPS #8: Sett opp monitorlogger for Nginx

    Når du har utført testen beskrevet i forrige tips, sjekk feilloggen som er definert for serverblokken:

    Det kan være lurt å bruke grep for å filtrere loggene for mislykkede forespørsler til adressesonen definert i TIPS #7:

    # grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
    

    På samme måte kan du filtrere tilgangsloggen for informasjon av interesse, for eksempel:

    1. Klient-IP
    2. Nettlesertype
    3. HTTP-forespørselstype
    4. Ressurs forespurt
    5. Serverblokk som svarer på forespørselen (nyttig hvis flere virtuelle verter logger på samme fil).

    Og ta passende tiltak hvis du oppdager uvanlig eller uønsket aktivitet.

    TIPS #9: Forhindr bildehotlinking i Nginx

    Hotlinking skjer når en person viser et bilde på ditt nettsted på et annet nettsted. Dette fører til en økning i båndbreddebruken din (som du betaler for) mens den andre personen med glede viser bildet som om det var hans eller hennes eiendom. Med andre ord, det er et dobbelt tap for deg.

    La oss for eksempel si at du har en underkatalog kalt img inne i serverblokken din, hvor du lagrer alle bildene som brukes i den virtuelle verten. For å forhindre at andre nettsteder bruker bildene dine, må du sette inn følgende plasseringsblokk i den virtuelle vertsdefinisjonen:

    location /img/ {
      valid_referers none blocked 192.168.0.25;
       if ($invalid_referer) {
         return   403;
       }
    }
    

    Deretter endrer du index.html-filen i hver virtuelle vert som følger:

    Bla nå til hvert nettsted, og som du kan se, vises bildet riktig i 192.168.0.25, men er erstattet av et 403-svar i 192.168.0.26:

    Merk at dette tipset avhenger av den eksterne nettleseren som sender Referer-feltet.

    TIPS #10: Deaktiver SSL og aktiver bare TLS i Nginx

    Når det er mulig, gjør hva som helst for å unngå SSL i noen av versjonene og bruk TLS i stedet. Følgende ssl_protocols bør plasseres i en server- eller http-kontekst i den virtuelle vertsfilen din eller er en separat fil via et include-direktiv (noen bruker en fil som heter ssl.conf , men det er helt opp til deg):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    For eksempel:

    TIPS #11: Lag sertifikater i Nginx

    Først genererer du en nøkkel og et sertifikat. Bruk gjerne en annen type kryptering hvis du ønsker:

    # 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
    

    Legg deretter til følgende linjer inne i en separat serverblokk som forberedelse til neste tips (http --> https omdirigering) og flytt også de SSL-relaterte direktivene til den nye blokken:

    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 neste tipset vil vi bekrefte hvordan nettstedet vårt nå bruker et selvsignert sertifikat og TLS.

    TIPS #12: Omdiriger HTTP-trafikk til HTTPS i Nginx

    Legg til følgende linje i den første serverblokken:

    return 301 https://$server_name$request_uri;
    

    Direktivet ovenfor vil returnere et 301 (flyttet permanent)-svar, som brukes til permanent URL-omdirigering når det sendes en forespørsel til port 80 til den virtuelle verten din, og vil omdirigere forespørselen til serverblokken vi la til i forrige tips.

    Bildet nedenfor viser omdirigeringen og bekrefter det faktum at vi bruker TLS 1.2 og AES-256 for kryptering:

    Sammendrag

    I denne artikkelen har vi delt noen tips for å sikre din Nginx-webserver. Vi vil gjerne høre hva du synes, og hvis du har andre tips som du vil dele med resten av fellesskapet, gi oss gjerne beskjed ved å sende oss et notat ved å bruke kommentarskjemaet nedenfor.