Den Ultimate Guide fir ze sécheren, härden a verbesseren d'Performance vum Nginx Web Server


Baséierend op déi wonnerbar Saachen déi Dir iwwer Nginx héieren hutt, hutt Dir vläicht decidéiert et ze probéieren. Dir hutt et vläicht esou gär gefall datt Dir drun erënnert Är Apache Installatiounen mat Nginx z'ersetzen nodeems Dir e puer vun den Artikelen iwwer dëst Thema duerchgaang ass, déi mir op dësem Site publizéiert hunn.

Wann jo, sinn ech sécher datt Dir dëse Guide mat oppenen Äerm begréissen well mir wäerten 12 Tipps ofdecken fir d'Sécherheet vun Ären Nginx Serveren z'erhéijen (rangéiert vum Nginx up to date ze halen bis zum Gebrauch vun TLS an d'Redirecting HTTP op HTTPS), an Dir wäert bemierken datt e puer vun hinnen ganz ähnlech sinn wéi Dir mat Apache géift maachen.

Verpasst net:

Mir wäerten déi folgend Ëmfeld an dësem Guide benotzen:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP Adress: 192.168.0.25 (tecmintlovesnginx.com) an 192.168.0.26 (nginxmeanspower.com), wéi beschriwwen an der IP-baséierter virtueller Hosts Sektioun op
    1. “Wéi konfiguréieren ech Numm-baséiert an IP-baséiert virtuell Hosten (Server Blocks) mat Nginx“

    Mat deem vergiessen, loosst eis ufänken.

    TIP #1: Halt Nginx um neiste Stand

    Zu der Zäit vun dësem Schreiwen sinn déi lescht Nginx Versiounen am CentOS (an EPEL) an Debian Repositories 1.6.3 respektiv 1.6.2-5.

    Och wann d'Installatioun vun Software aus de Repositories méi einfach ass wéi de Programm aus dem Quellcode ze kompiléieren, huet dës lescht Optioun zwee Virdeeler: 1) et erlaabt Iech extra Moduler an Nginx ze bauen (wéi mod_security), an 2) et gëtt ëmmer eng méi nei Versioun ubitt wéi d'Repositories (1.9.9 vun haut). D'Verëffentlechungsnotizen sinn ëmmer op der Nginx Websäit verfügbar.

    Verpasst net:

    TIP #2: Onnéideg Moduler an Nginx ewechhuelen

    Fir explizit Moduler aus Nginx ze läschen beim Installéiere vun der Quell, maacht:

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

    Zum Beispill:

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

    Wéi Dir wahrscheinlech wäert roden, d'Ewechhuele vu Moduler vun enger fréierer Nginx Installatioun aus der Quell erfuerdert d'Kompilatioun erëm.

    E Wuert vun virsiichteg: Configuratioun Direktiven ugeet vun Moduler. Vergewëssert Iech datt Dir e Modul net deaktivéiert deen eng Direktiv enthält, déi Dir op der Strooss braucht! Dir sollt d'nginx Dokumenter iwwerpréiwen fir d'Lëscht vun den Direktiven, déi an all Modul verfügbar sinn, ier Dir eng Entscheedung iwwer Moduler auszeschalten.

    TIP #3: Server_tokens Direktiv an Nginx auszeschalten

    D'server_tokens Direktiv seet Nginx seng aktuell Versioun op Fehlersäiten ze weisen. Dëst ass net wënschenswäert well Dir dës Informatioun net mat der Welt deele wëllt fir Attacken op Ärem Webserver ze verhënneren, déi duerch bekannte Schwachstelle an där spezifescher Versioun verursaacht ginn.

    Fir d'Direktive server_tokens auszeschalten, setze wann et an engem Serverblock ausgeschalt gëtt:

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

    Restart nginx a verifizéiert d'Ännerungen:

    TIP #4: Deny HTTP User Agents in Nginx

    En HTTP User Agent ass eng Software déi fir Inhaltsverhandlunge géint e Webserver benotzt gëtt. Dëst beinhalt och Malware Bots a Crawler, déi eventuell d'Performance vun Ärem Webserver beaflossen andeems Dir Systemressourcen verschwenden.

    Fir d'Lëscht vun ongewollte Benotzeragenten méi einfach z'erhalen, erstellt e Fichier (/etc/nginx/blockuseragents.rules zum Beispill) mat de folgenden Inhalter:

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

    Als nächst setzt déi folgend Zeil virun der Serverblockdefinitioun:

    include /etc/nginx/blockuseragents.rules;
    

    An eng If Ausso fir eng 403 Äntwert zréckzeginn wann de Benotzer Agent String an der schwaarzer Lëscht hei uewen definéiert ass:

    Restart nginx, an all Benotzer Agenten deenen hir String entsprécht der uewendriwwer gëtt gespaart fir Zougang zu Ärem Webserver. Ersetzt 192.168.0.25 mat Ärem Server IP a fillt sech fräi fir eng aner String fir den -user-agent Schalter vu wget ze wielen:

    # 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: Onerwënscht HTTP Methoden an Nginx auszeschalten

    Och bekannt als Verben, HTTP-Methoden weisen op déi gewënscht Handlung déi op enger Ressource zerwéiert gëtt vum Nginx. Fir gemeinsam Websäiten an Uwendungen, sollt Dir nëmmen GET, POST, an HEAD erlaben an all aner auszeschalten.

    Fir dat ze maachen, setzt déi folgend Linnen an engem Serverblock. Eng 444 HTTP Äntwert heescht eng eidel Äntwert a gëtt dacks an Nginx benotzt fir Malware Attacken ze narren:

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

    Fir ze testen, benotzt Curl fir eng DELETE Ufro ze schécken an d'Ausgab ze vergläichen mat wann Dir e normale GET schéckt:

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

    TIP #6: Set Buffer Gréisst Limitatiounen an Nginx

    Fir Puffer Iwwerfloss Attacke géint Ären Nginx Webserver ze vermeiden, setzt déi folgend Direktiven an enger separater Datei (erstellt eng nei Datei mam Numm /etc/nginx/conf.d/buffer.conf, zum Beispill):

    client_body_buffer_size  1k;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;
    

    D'Direktiven hei uewen suergen dofir datt Ufroe, déi op Äre Webserver gemaach ginn, kee Pufferiwwerfluss an Ärem System verursaachen. Nach eng Kéier, kuckt op d'Dokumenter fir weider Detailer iwwer wat jidderee vun hinnen mécht.

    Füügt dann eng Inklusioun Direktiv an der Konfiguratiounsdatei:

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

    TIP #7: Limitéiert d'Zuel vun de Verbindungen duerch IP am Nginx

    Fir d'Verbindungen duerch IP ze limitéieren, benotzt d'limit_conn_zone (an engem http Kontext oder op d'mannst ausserhalb vum Serverblock) a limit_conn (an engem http, Serverblock oder Standuertkontext) Direktiven.

    Denkt awer drun datt net all Verbindunge gezielt ginn - awer nëmmen déi, déi eng Ufro vum Server veraarbecht hunn a säi ganze Ufroheader gelies gouf.

    Zum Beispill, loosst eis déi maximal Unzuel u Verbindungen op 1 setzen (jo, et ass iwwerdreiwen, awer et wäert d'Aarbecht an dësem Fall gutt maachen) an enger Zone mam Numm addr (Dir kënnt dat op alles setzen Numm Dir wëllt):

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

    En einfachen Test mat Apache Benchmark (Perform Nginx Load) wou 10 Gesamtverbindunge mat 2 gläichzäiteg Ufroe gemaach ginn hëlleft eis eise Punkt ze demonstréieren:

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

    Gesinn den nächsten Tipp fir weider Detailer.

    TIP #8: Setup Monitor Logs fir Nginx

    Wann Dir den Test am virege Tipp beschriwwen hutt, kontrolléiert de Fehlerprotokoll dee fir de Serverblock definéiert ass:

    Dir wëllt grep benotze fir d'Logbicher ze filteren fir gescheitert Ufroe gemaach an d'adr Zone definéiert am TIP #7:

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

    Och Dir kënnt den Zougangsprotokoll filteren fir Informatioun vun Interesse, wéi:

    1. Client IP
    2. Browsertyp
    3. HTTP Ufro Typ
    4. Ressource gefrot
    5. Serverblock beäntwert d'Ufro (nëtzlech wann e puer virtuell Hosten op déiselwecht Datei aloggen).

    A maacht entspriechend Handlung wann Dir eng ongewéinlech oder ongewollt Aktivitéit erkennt.

    TIP #9: Verhënnert Bild Hotlinking an Nginx

    Bild Hotlinking geschitt wann eng Persoun op enger anerer Säit e Bild op Ärem gehost huet. Dëst verursaacht eng Erhéijung vun Ärer Bandbreedung (fir déi Dir bezuelt) während déi aner Persoun glécklech d'Bild weist wéi wann et säi Besëtz wier. An anere Wierder, et ass eng duebel Verloscht fir Iech.

    Zum Beispill, loosst eis soen datt Dir en Ënnerverzeechnes mam Numm img an Ärem Serverblock hutt, wou Dir all d'Biller späichert an deem virtuelle Host. Fir ze verhënneren datt aner Siten Är Biller benotzen, musst Dir de folgende Standortblock an Ärer virtueller Hostdefinitioun asetzen:

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

    Dann änneren d'index.html Datei an all virtuelle Host wéi follegt:

    Elo kuckt op all Site a wéi Dir gesitt, gëtt d'Bild korrekt an 192.168.0.25 ugewisen, awer duerch eng 403 Äntwert am 192.168.0.26 ersat:

    Notéiert datt dësen Tipp hänkt vum Fernbrowser of, deen de Refererfeld schéckt.

    TIP #10: SSL auszeschalten an nëmmen TLS an Nginx aktivéieren

    Wann ëmmer méiglech, maacht wat et brauch fir SSL an enger vu senge Versiounen ze vermeiden a benotzt TLS amplaz. Déi folgend ssl_Protokoller sollen an engem Server oder http Kontext an Ärer virtueller Hostdatei plazéiert ginn oder ass eng separat Datei iwwer eng Inkludéieren Direktiv (e puer Leit benotzen e Fichier mam Numm ssl.conf , awer et ass ganz un Iech):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Zum Beispill:

    TIP #11: Erstellt Certificaten an Nginx

    Als éischt generéiert e Schlëssel an e Certificat. Fillt gratis eng aner Zort Verschlësselung ze benotzen wann Dir wëllt:

    # 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
    

    Füügt dann déi folgend Zeilen an engem getrennten Serverblock zur Virbereedung op den nächsten Tipp (http --> https Viruleedung) a réckelt och d'SSL-bezunnen Direktiven an den neie Block:

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

    Am nächsten Tipp wäerte mir iwwerpréiwen wéi eise Site elo e selbst ënnerschriwwene Certificat an TLS benotzt.

    TIP #12: Redirect HTTP Traffic op HTTPS an Nginx

    Füügt déi folgend Zeil op den éischte Serverblock:

    return 301 https://$server_name$request_uri;
    

    Déi uewe genannte Direktiv gëtt eng 301 (dauerhaft geréckelt) Äntwert zréck, déi fir permanent URL Viruleedung benotzt gëtt wann ëmmer eng Ufro un den Port 80 vun Ärem virtuelle Host gemaach gëtt, a wäert d'Ufro un de Serverblock ëmgeleet, dee mir am virege Tipp bäigefüügt hunn.

    D'Bild hei ënnen weist d'Redirectioun a bestätegt d'Tatsaach datt mir TLS 1.2 an AES-256 fir Verschlësselung benotzen:

    Resumé

    An dësem Artikel hu mir e puer Tipps gedeelt fir Ären Nginx Webserver ze sécheren. Mir géife gären héieren wat Dir denkt an, wann Dir aner Tipps hutt, déi Dir mat dem Rescht vun der Gemeinschaft deele wëllt, loosst eis wësse loossen andeems Dir eis eng Notiz schéckt andeems Dir de Kommentarformular hei drënner benotzt.