Ülim juhend Nginxi veebiserveri turvalisuse, karastamise ja jõudluse parandamiseks


Nginxi kohta kuuldud imeliste asjade põhjal otsustasite ehk proovida. Võib-olla on see teile nii meeldinud, et kaalute oma Apache installide asendamist Nginxiga pärast seda, kui olete läbinud mõned artiklid teemal, mille oleme sellel saidil avaldanud.

Kui jah, siis olen kindel, et tervitate seda juhendit avasüli, sest me käsitleme 12 nõuannet teie Nginxi serverite turvalisuse suurendamiseks (alates Nginxi ajakohasest hoidmisest kuni TLS-i kasutamiseni ja HTTP ümbersuunamiseni aadressile HTTPS) ja märkate, et mõned neist on väga sarnased sellega, mida teete Apache'iga.

Ära jäta:

Selles juhendis kasutame järgmist keskkonda:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP-aadress: 192.168.0.25 (tecmintlovesnginx.com) ja 192.168.0.26 (nginxmeanspower.com), nagu on kirjeldatud jaotises IP-põhised virtuaalsed hostid aadressil
    1. "Nime- ja IP-põhiste virtuaalsete hostide (serveriblokkide) seadistamine Nginxiga"

    Alustame seda silmas pidades.

    NÕUANNE 1: Hoidke Nginxit ajakohasena

    Selle kirjutamise ajal on CentOSi (EPEL-is) ja Debiani hoidlates uusimad Nginxi versioonid vastavalt 1.6.3 ja 1.6.2-5.

    Ehkki tarkvara installimine hoidlatest on lihtsam kui programmi koostamine lähtekoodist, on sellel viimasel võimalusel kaks eelist: 1) see võimaldab teil Nginxi sisse ehitada lisamooduleid (näiteks mod_security) ja 2) see pakub alati uuemat versiooni kui hoidlad (tänase seisuga 1.9.9). Väljalaskemärkmed on alati saadaval Nginxi veebisaidil.

    Ära jäta:

    NÕUANNE 2: Eemaldage Nginxist mittevajalikud moodulid

    Moodulite selgesõnaliseks eemaldamiseks Nginxist allikast installimise ajal tehke järgmist.

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

    Näiteks:

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

    Nagu arvate tõenäoliselt, nõuab eelmisest Nginxi installist moodulite allikast eemaldamine kompileerimise uuesti sooritamist.

    Ettevaatust: konfigureerimisjuhised pakuvad moodulid. Veenduge, et te ei keelaks moodulit, mis sisaldab teel vajaminevat direktiivi! Enne moodulite keelamise otsuse tegemist peaksite kontrollima nginx docs igas moodulis saadaolevate direktiivide loendit.

    NÕUANNE 3: Keela server_tokensi direktiiv Nginxis

    Direktiiv server_tokens käsib Nginxil kuvada vealehtedel oma praegust versiooni. See pole soovitav, kuna te ei soovi seda teavet maailmaga jagada, et vältida rünnakuid veebiserveris, mis on põhjustatud selle konkreetse versiooni teadaolevatest haavatavustest.

    Direktiivi server_tokens keelamiseks seadistage serveriplokis see välja:

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

    Taaskäivitage nginx ja kontrollige muudatusi:

    NÕUANNE 4: Keela HTTP-kasutajaagendid Nginxis

    HTTP kasutajaagent on tarkvara, mida kasutatakse veebiserveri sisuläbirääkimisteks. See hõlmab ka pahavara roboteid ja indeksoijaid, mis võivad süsteemi ressursside raiskamisega mõjutada teie veebiserveri jõudlust.

    Soovimatute kasutajaagentide loendi hõlpsamaks säilitamiseks looge järgmise sisuga fail (näiteks /etc/nginx/blockuseragents.rules ):

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

    Järgmisena asetage järgmine rida enne serveriploki määratlust:

    include /etc/nginx/blockuseragents.rules;
    

    Ja if-lause 403-vastuse tagastamiseks, kui kasutajaagendi string on eespool määratletud mustas loendis:

    Taaskäivitage nginx ja kõigil kasutajaagentidel, kelle string vastab ülaltoodule, on juurdepääs teie veebiserverile blokeeritud. Asendage 192.168.0.25 oma serveri IP-ga ja valige julgelt mõni teine string wgeti lülitile --user-agent :

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

    NÕUANNE 5: Keelake soovimatud HTTP-meetodid Nginxis

    Tuntud ka kui tegusõnad, näitavad HTTP-meetodid Nginxi teenindatava ressursi soovitavat toimingut. Tavaliste veebisaitide ja rakenduste puhul peaksite lubama ainult GET, POST ja HEAD ning keelama kõik teised.

    Selleks asetage järgmised read serveriploki sisse. 444 HTTP vastus tähendab tühja vastust ja seda kasutatakse Nginxis sageli pahavararünnakute petmiseks:

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

    Testimiseks kasutage curl-i DELETE-päringu saatmiseks ja võrrelge väljundit tavalise GET-i saatmisel:

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

    NÕUANNE 6: määrake puhvri suuruse piirangud Nginxis

    Nginxi veebiserveri vastu suunatud puhvri ülevoolurünnakute vältimiseks seadistage järgmised failid eraldi faili (looge näiteks uus fail nimega /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;
    

    Eespool toodud direktiivid tagavad, et teie veebiserverisse tehtud taotlused ei põhjustaks teie süsteemis puhvri ületäitumist. Veelkord vaadake dokumentidest lisateavet selle kohta, mida igaüks neist teeb.

    Seejärel lisage konfiguratsioonifaili kaasamisdirektiiv:

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

    NÕUANNE 7: Piirake Nginxis IP-ühenduste arvu

    Ühenduste piiramiseks IP-ga kasutage direktiive limit_conn_zone (http-kontekstis või vähemalt väljaspool serveriplokki) ja limit_conn (http-i, serveriploki või asukoha kontekstis).

    Pidage siiski meeles, et kõiki ühendusi ei loeta - loetud on ainult need ühendused, mille server on töödelnud ja kogu päringu päis.

    Näiteks määrame ühenduste maksimaalseks arvuks 1 (jah, see on liialdus, kuid sel juhul saab see töö suurepäraselt hakkama) tsoonis nimega addr (saate selle määrata mis iganes soovitud nimi):

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

    Lihtne test Apache Benchmarkiga (Perform Nginx Load), kus 10 koguühendus tehakse samaaegsete päringutega 2 , aitab meil oma seisukohta näidata:

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

    Lisateabe saamiseks vaadake järgmist nõuannet.

    NÕUANNE 8: Monitori logide seadistamine Nginxile

    Kui olete eelmises näpunäites kirjeldatud testi teinud, kontrollige serveriploki jaoks määratletud tõrkelogi:

    Võite kasutada grep-i, et filtreerida TIP-is # 7 määratletud addr-tsooni tehtud ebaõnnestunud taotluste logid:

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

    Samuti saate juurdepääsulogi filtreerida huvipakkuva teabe jaoks, näiteks:

    1. kliendi IP
    2. brauseri tüüp
    3. HTTP päringu tüüp
    4. Taotletud ressurss
    5. Server blokeerib päringule vastamise (kasulik, kui mitu virtuaalset hostit logivad samasse faili).

    Ja kui märkate ebatavalist või soovimatut tegevust, võtke asjakohased meetmed.

    NÕUANNE 9: Vältige pildi kiirlinkimist Nginxis

    Kujutiste linkimine toimub siis, kui inimene kuvab teisel saidil teie hostitud pilti. See suurendab teie ribalaiuse kasutamist (mille eest te maksate), samal ajal kui teine inimene kuvab pilti rõõmsalt, nagu oleks see tema omand. Teisisõnu, see on teie jaoks topeltkaotus.

    Oletame näiteks, et teie serveriplokis on alamkataloog nimega img , kuhu salvestate kõik selles virtuaalses hostis kasutatud pildid. Et teised saidid ei saaks teie pilte kasutada, peate oma virtuaalse hosti definitsiooni lisama järgmise asukohaploki:

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

    Seejärel muutke faili index.html igas virtuaalses hostis järgmiselt:

    Nüüd sirvige igale saidile ja nagu näete, kuvatakse 192.168.0.25-s õigesti pilt, kuid asendatakse 192.168.0.26-ga vastusega 403:

    Pange tähele, et see näpunäide sõltub kaugbrauserist, mis saadab välja Referer.

    NÕUANNE 10: Keela SSL ja Luba TLS ainult Nginxis

    Võimaluse korral tehke kõik, et SSL-i selle mis tahes versioonis vältida, ja kasutage selle asemel TLS-i. Järgmised ssl_protocols tuleks paigutada virtuaalse hostifaili serveri või http-konteksti või on see eraldi fail kaasamisdirektiivi kaudu (mõned inimesed kasutavad faili nimega ssl.conf , kuid see sõltub täielikult sinust):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Näiteks:

    NÕUANNE 11: Looge Nginxis sertifikaadid

    Esmalt genereerige võti ja sertifikaat. Kui soovite, kasutage julgelt teist tüüpi krüptimist.

    # 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
    

    Seejärel lisage järgmise näpunäite ettevalmistamiseks ( http -> https ümbersuunamiseks) eraldi serveriplokki järgmised read ja teisaldage SSL-ga seotud direktiivid ka uude plokki:

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

    Järgmises näpunäites kontrollime, kuidas meie sait kasutab nüüd ise allkirjastatud sertifikaati ja TLS-i.

    NÕUANNE 12: Suunake HTTP-liiklus Nginxis HTTPS-i

    Esimesele serveriplokile lisage järgmine rida:

    return 301 https://$server_name$request_uri;
    

    Ülaltoodud direktiiv tagastab vastuse 301 (Püsivalt teisaldatud), mida kasutatakse URL-i püsivaks ümbersuunamiseks alati, kui teie virtuaalse masina 80. pordile taotletakse, ja suunab päringu eelmises näpunäites lisatud serveriplokki.

    Allpool olev pilt näitab ümbersuunamist ja kinnitab asjaolu, et krüptimiseks kasutame TLS 1.2 ja AES-256:

    Kokkuvõte

    Selles artiklis oleme jaganud mõningaid näpunäiteid teie Nginxi veebiserveri turvamiseks. Sooviksime hea meelega kuulda teie arvamust ja kui teil on muid näpunäiteid, mida soovite ülejäänud kogukonnaga jagada, andke meile sellest teada, saates meile märkuse, kasutades allolevat kommentaarivormi.