Vrhunski vodnik za zaščito, utrjevanje in izboljšanje zmogljivosti spletnega strežnika Nginx


Glede na čudovite stvari, ki ste jih slišali o Nginxu, ste se morda odločili, da poskusite. Morda vam je bilo tako všeč, da razmišljate o tem, da bi svoje namestitve Apache zamenjali z Nginxom, potem ko ste prebrali nekaj člankov na temo, ki smo jih objavili na tej spletni strani.

V tem primeru sem prepričan, da boste ta vodnik sprejeli z odprtimi rokami, saj bomo zajeli 12 nasvetov za povečanje varnosti vaših strežnikov Nginx (od posodobitve Nginxa do uporabe TLS in preusmeritve HTTP na HTTPS) in opazili boste, da so nekateri zelo podobni tistim, ki bi jih naredili z Apachejem.

Ne zamudite:

V tem priročniku bomo uporabili naslednje okolje:

  1. Debian GNU/Linux 8.1 (jessie).
  2. Naslov IP: 192.168.0.25 (tecmintlovesnginx.com) in 192.168.0.26 (nginxmeanspower.com), kot je opisano v razdelku navideznih gostiteljev na podlagi IP na
    1. »Kako z Nginxom nastaviti virtualne gostitelje na osnovi imen in IP-jev (blokov strežnikov)«

    S tem v mislih začnimo.

    NAMIG # 1: Poskrbite, da bo Nginx posodobljen

    V času pisanja tega članka sta najnovejši različici Nginx v skladiščih CentOS (v EPEL) in Debianu 1.6.3 oziroma 1.6.2-5.

    Čeprav je namestitev programske opreme iz repozitorijev enostavnejša od sestavljanja programa iz izvorne kode, ima ta zadnja dve prednosti: 1) omogoča vgradnjo dodatnih modulov v Nginx (na primer mod_security) in 2) vedno bo ponudila novejšo različico kot skladišča (1.9.9 od danes). Opombe ob izdaji so vedno na voljo na spletnem mestu Nginx.

    Ne zamudite:

    NASVET # 2: Odstranite nepotrebne module v Nginxu

    Če želite med namestitvijo iz vira izrecno odstraniti module iz Nginxa, naredite:

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

    Na primer:

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

    Kot boste verjetno uganili, odstranitev modulov iz prejšnje namestitve Nginx iz vira zahteva ponovno izvedbo prevajanja.

    Previdno: Konfiguracijske smernice so na voljo v modulih. Pazite, da ne onemogočite modula, ki vsebuje direktivo, ki jo boste potrebovali po poti! Preden sprejmete odločitev o onemogočanju modulov, v dokumentih nginx preverite seznam direktiv, ki so na voljo v vsakem modulu.

    NASVET št. 3: Onemogočite direktivo server_tokens v Nginxu

    Direktiva server_tokens Nginxu pove, naj svojo trenutno različico prikaže na straneh z napakami. To ni zaželeno, ker teh informacij ne želite deliti s svetom, da bi preprečili napade na vaš spletni strežnik, ki jih povzročajo znane ranljivosti v tej različici.

    Če želite onemogočiti direktivo server_tokens , v bloku strežnika nastavite, če je izklopljeno:

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

    Znova zaženite nginx in preverite spremembe:

    NASVET št. 4: Zavrni uporabniške agente HTTP v Nginxu

    Uporabniški agent HTTP je programska oprema, ki se uporablja za pogajanja o vsebini s spletnim strežnikom. Sem spadajo tudi roboti in pajki z zlonamerno programsko opremo, ki lahko na koncu z zapravljanjem sistemskih virov vplivajo na delovanje vašega spletnega strežnika.

    Za lažje vzdrževanje seznama neželenih uporabniških agentov ustvarite datoteko (na primer /etc/nginx/blockuseragents.rules ) z naslednjo vsebino:

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

    Nato postavite naslednjo vrstico pred definicijo blokov strežnika:

    include /etc/nginx/blockuseragents.rules;
    

    In izjava if za vrnitev odziva 403, če je niz uporabniškega agenta na zgoraj definiranem črnem seznamu:

    Znova zaženite nginx in vsem uporabniškim agentom, katerih niz se ujema z zgornjim, bo onemogočen dostop do vašega spletnega strežnika. Zamenjajte 192.168.0.25 z IP-om vašega strežnika in vas prosimo, da izberete drug niz za stikalo --user-agent wgeta:

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

    NASVET # 5: Onemogočite neželene metode HTTP v Nginxu

    Metode HTTP, znane tudi kot glagoli, kažejo na želeno dejanje, ki ga je treba izvesti na viru, ki ga ponuja Nginx. Za običajna spletna mesta in aplikacije morate dovoliti le GET, POST in HEAD ter onemogočiti vsa druga.

    Če želite to narediti, vstavite naslednje vrstice v strežniški blok. Odziv HTTP 444 pomeni prazen odziv in se v Nginxu pogosto uporablja za zavajanje napadov zlonamerne programske opreme:

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

    Če želite preizkusiti, uporabite curl, da pošljete zahtevo DELETE in primerjate rezultate, ko pošljete običajni GET:

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

    NASVET 6: Nastavite omejitve velikosti medpomnilnika v Nginxu

    Če želite preprečiti napade prelivanja medpomnilnika na spletni strežnik Nginx, v ločeno datoteko nastavite naslednje smernice (na primer ustvarite novo datoteko z imenom /etc/nginx/conf.d/buffer.conf ):

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

    Zgornje direktive bodo zagotovile, da zahteve, poslane na vaš spletni strežnik, ne bodo povzročile prelivanja medpomnilnika v vašem sistemu. Še enkrat si oglejte dokumentacijo za nadaljnje podrobnosti o tem, kaj vsak izmed njih počne.

    Nato v konfiguracijsko datoteko dodajte direktivo include:

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

    NASVET št. 7: Omejite število povezav po naslovu IP v Nginxu

    Če želite omejiti povezave z IP-jem, uporabite direktivi limit_conn_zone (v kontekstu http ali vsaj zunaj strežniškega bloka) in limit_conn (v http, blokovnem strežniku ali kontekstu lokacije).

    Vendar ne pozabite, da se ne štejejo vse povezave - ampak le tiste, ki strežnik obdela zahtevo in prebere celotno glavo zahteve.

    Na primer, nastavimo največje število povezav na 1 (da, pretiravanje je, vendar bo v tem primeru opravilo popolnoma dobro) v območju z imenom addr (to lahko nastavite na ime, ki ga želite):

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

    Preprost test z Apache Benchmark (Perform Nginx Load), pri katerem se vzpostavi 10 skupnih povezav z 2 hkratnimi zahtevami, nam bo pomagal pokazati našo poanto:

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

    Za nadaljnje podrobnosti glejte naslednji nasvet.

    NASVET # 8: Nastavite dnevnike monitorja za Nginx

    Ko izvedete preizkus, opisan v prejšnjem nasvetu, preverite dnevnik napak, ki je definiran za strežniški blok:

    Morda boste želeli uporabiti grep za filtriranje dnevnikov za neuspele zahteve, poslane v cono addr, določeno v TIP # 7:

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

    Prav tako lahko filtrirate dnevnik dostopa za informacije, ki vas zanimajo, na primer:

    1. Odjemalski IP
    2. Vrsta brskalnika
    3. Vrsta zahteve HTTP
    4. Zahtevan vir
    5. Strežniški blok, ki odgovori na zahtevo (uporabno, če se v isto datoteko beleži več navideznih gostiteljev).

    In ustrezno ukrepajte, če zaznate kakršno koli nenavadno ali neželeno aktivnost.

    NASVET št. 9: Preprečite vročo povezavo slike v Nginxu

    Hitra povezava do slike se zgodi, ko oseba na drugem spletnem mestu prikaže sliko, ki gostuje na vašem. To povzroči povečanje vaše pasovne širine (ki jo plačate), medtem ko druga oseba z veseljem prikaže sliko, kot da je njena last. Z drugimi besedami, to je za vas dvojna izguba.

    Recimo, da imate v bloku strežnika podimenik z imenom img , v katerem shranite vse slike, uporabljene v tem navideznem gostitelju. Če želite drugim spletnim mestom preprečiti uporabo vaših slik, boste morali v definicijo navideznega gostitelja vstaviti naslednji blok lokacije:

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

    Nato spremenite datoteko index.html v vsakem navideznem gostitelju, kot sledi:

    Zdaj poiščite vsako spletno mesto in kot vidite, je slika pravilno prikazana v 192.168.0.25, vendar jo v 192.168.0.26 nadomesti odgovor 403:

    Ta nasvet je odvisen od oddaljenega brskalnika, ki pošlje polje Referer.

    NASVET # 10: Onemogočite SSL in omogočite TLS samo v Nginxu

    Če je le mogoče, storite vse, da se izognete SSL v kateri koli njegovi različici, in namesto tega uporabite TLS. Naslednje ssl_protocols je treba namestiti v kontekst strežnika ali http v vaši datoteki navideznega gostitelja ali pa je ločena datoteka z direktivo vključevanja (nekateri uporabljajo datoteko z imenom ssl.conf , vendar je povsem odvisno od vas):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Na primer:

    NAMIG # 11: Ustvarite potrdila v Nginxu

    Najprej ustvarite ključ in potrdilo. Če želite, lahko uporabite drugo vrsto šifriranja:

    # 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
    

    Nato v ločeni strežniški blok dodajte naslednje vrstice v pripravah na naslednji nasvet (preusmeritev http -> https ) in v novi blok premaknite tudi direktivi, povezani s SSL:

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

    V naslednjem nasvetu bomo preverili, kako naše spletno mesto zdaj uporablja samopodpisani cert in TLS.

    NASVET # 12: Preusmerite promet HTTP na HTTPS v Nginxu

    V prvi strežniški blok dodajte naslednjo vrstico:

    return 301 https://$server_name$request_uri;
    

    Zgornja direktiva bo vrnila odgovor 301 (premaknjeno trajno), ki se uporablja za trajno preusmeritev URL-ja, kadar koli je zahteva poslana na vrata 80 vašega navideznega gostitelja, in bo preusmerila zahtevo v strežniški blok, ki smo ga dodali v prejšnjem nasvetu.

    Spodnja slika prikazuje preusmeritev in potrjuje dejstvo, da za šifriranje uporabljamo TLS 1.2 in AES-256:

    Povzetek

    V tem članku smo delili nekaj nasvetov za zaščito spletnega strežnika Nginx. Radi bi slišali, kaj mislite, in če imate druge nasvete, ki bi jih radi delili s preostalo skupnostjo, nam to sporočite tako, da nam pošljete opombo s spodnjim obrazcem za komentar.