Pagrindinis „Nginx“ tinklo serverio saugos, grūdinimo ir našumo vadovas


Remdamiesi nuostabiais dalykais, kuriuos girdėjote apie „Nginx“, galbūt nusprendėte pabandyti. Jums tai galėjo taip patikti, kad apsvarstysite galimybę pakeisti „Apache“ diegimą „Nginx“, peržiūrėję keletą straipsnių tema, kuriuos paskelbėme šioje svetainėje.

Jei taip, aš tikiu, kad šį vadovą sutiksite išskėstomis rankomis, nes pateiksime 12 patarimų, kaip padidinti jūsų „Nginx“ serverių saugumą (pradedant nuo „Nginx“ atnaujinimo iki TLS naudojimo ir HTTP nukreipimo į HTTPS), ir jūs pastebėsite, kad kai kurie iš jų yra labai panašūs į tai, ką darytumėte su „Apache“.

Nepraleiskite:

Šiame vadove naudosime šią aplinką:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP adresas: 192.168.0.25 (tecmintlovesnginx.com) ir 192.168.0.26 (nginxmeanspower.com), kaip aprašyta IP pagrįstų virtualiųjų kompiuterių skyriuje
    1. „Kaip nustatyti„ Nginx “vardais ir IP pagrįstus virtualius kompiuterius (serverių blokus)“

    Turėdami tai omenyje, pradėkime.

    1 PATARIMAS: Nginx atnaujinkite

    Šio rašymo metu naujausios „Nginx“ versijos „CentOS“ (EPEL) ir „Debian“ saugyklose yra atitinkamai 1.6.3 ir 1.6.2-5.

    Nors įdiegti programinę įrangą iš saugyklų yra paprasčiau nei sukompiliuoti programą iš šaltinio kodo, ši paskutinė galimybė turi du privalumus: 1) tai leidžia jums sukurti papildomus modulius į „Nginx“ (pvz., Mod_security) ir 2) visada pateiks naujesnę versiją nei saugyklos (šiandien 1.9.9). Išleidimo pastabas visada galima rasti „Nginx“ svetainėje.

    Nepraleiskite:

    2 PATARIMAS: pašalinkite nereikalingus „Nginx“ modulius

    Norėdami aiškiai pašalinti modulius iš „Nginx“ diegdami iš šaltinio, atlikite šiuos veiksmus:

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

    Pavyzdžiui:

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

    Kaip tikriausiai atspėsite, norint pašalinti ankstesnio „Nginx“ diegimo modulius iš šaltinio reikia dar kartą atlikti kompiliavimą.

    Atsargiai: konfigūracijos nurodymus pateikia moduliai. Įsitikinkite, kad neišjungėte modulio, kuriame yra direktyva, kurios jums reikės kelyje! Prieš priimdami sprendimą dėl modulių išjungimo, turėtumėte patikrinti, ar „nginx“ dokumentuose yra kiekviename modulyje galimų direktyvų sąrašas.

    3 PATARIMAS: Išjunkite server_tokens direktyvą „Nginx“

    server_tokens direktyva nurodo „Nginx“ rodyti dabartinę versiją klaidų puslapiuose. Tai nėra pageidautina, nes jūs nenorite dalytis ta informacija su pasauliu, kad išvengtumėte atakų savo žiniatinklio serveryje, kurias sukelia žinomos tos konkrečios versijos spragos.

    Norėdami išjungti server_tokens direktyvą, nustatykite, ar ji išjungta serverio bloke:

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

    Iš naujo paleiskite „nginx“ ir patikrinkite pakeitimus:

    4 PATARIMAS: atmesti HTTP vartotojo agentus „Nginx“

    HTTP vartotojo agentas yra programinė įranga, naudojama derantis dėl turinio prieš žiniatinklio serverį. Tai taip pat apima kenkėjiškų programų robotus ir tikrintuvus, kurie gali švaistydami sistemos išteklius paveikti jūsų žiniatinklio serverio našumą.

    Norėdami lengviau tvarkyti nepageidaujamų vartotojų agentų sąrašą, sukurkite failą (pvz., /etc/nginx/blockuseragents.rules ) su tokiu turiniu:

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

    Tada prieš serverio bloko apibrėžimą įdėkite šią eilutę:

    include /etc/nginx/blockuseragents.rules;
    

    Ir if sakinys grąžina atsakymą 403, jei vartotojo agento eilutė yra aukščiau apibrėžtame juodajame sąraše:

    Paleiskite „nginx“ iš naujo, o visi vartotojų agentai, kurių eilutė atitinka aukščiau išvardytas eilutes, negalės pasiekti jūsų žiniatinklio serverio. Pakeiskite 192.168.0.25 serverio IP ir nedvejodami pasirinkite kitą eilutę wget jungikliui --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 
    

    5 PATARIMAS: Išjunkite nepageidaujamus HTTP metodus „Nginx“

    Taip pat žinomi kaip veiksmažodžiai, HTTP metodai nurodo norimą veiksmą, kurį reikia atlikti su „Nginx“ aptarnaujamu šaltiniu. Paprastose svetainėse ir programose turėtumėte leisti tik GET, POST ir HEAD bei išjungti visas kitas.

    Norėdami tai padaryti, įdėkite šias eilutes į serverio bloką. 444 HTTP atsakymas reiškia tuščią atsakymą ir dažnai naudojamas „Nginx“, norint apgaudinėti kenkėjiškas programas

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

    Norėdami išbandyti, naudokite „curl“, norėdami išsiųsti užklausą „DELETE“ ir palyginkite išvestį, kai siunčiate įprastą GET:

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

    6 PATARIMAS: nustatykite buferio dydžio apribojimus „Nginx“

    Norėdami išvengti buferio perpildymo atakų prieš jūsų „Nginx“ žiniatinklio serverį, atskirame faile nustatykite šias direktyvas (pavyzdžiui, sukurkite naują failą pavadinimu /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;
    

    Aukščiau pateiktos direktyvos užtikrins, kad jūsų žiniatinklio serveriui pateiktos užklausos nesukeltų buferio perpildymo jūsų sistemoje. Dar kartą ieškokite dokumentuose, kad gautumėte daugiau informacijos apie tai, ką jie daro.

    Tada pridėkite įtraukimo direktyvą į konfigūracijos failą:

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

    7 PATARIMAS: Apribokite „IP“ jungčių skaičių „Nginx“

    Norėdami apriboti ryšius pagal IP, naudokite limit_conn_zone (http kontekste arba bent jau už serverio bloko ribų) ir limit_conn (http, serverio bloko ar vietos kontekste) direktyvas.

    Tačiau nepamirškite, kad ne visi ryšiai yra skaičiuojami, bet buvo perskaityti tik tie, kurie turi serverio apdorotą užklausą ir visą jos užklausos antraštę.

    Pvz., Nustatykime maksimalų jungčių skaičių į 1 (taip, tai yra perdėjimas, bet šiuo atveju jis puikiai atliks darbą) zonoje, pavadintoje addr (galite nustatyti bet ką norimas vardas):

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

    Paprastas bandymas su „Apache Benchmark“ („Atlikite Nginx įkrovą“), kai 10 bendras ryšys užmegztas kartu su 2 užklausomis, padės mums parodyti savo mintį:

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

    Daugiau informacijos rasite kitame patarime.

    PATARIMAS # 8: „Nginx“ sąrankos stebėjimo žurnalų sąranka

    Atlikę bandymą, aprašytą ankstesniame patarime, patikrinkite klaidų žurnalą, apibrėžtą serverio blokui:

    Galite naudoti „grep“, jei norite filtruoti nepavykusių užklausų, pateiktų į ADR zoną, apibrėžtą TIP # 7, žurnalus:

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

    Taip pat galite filtruoti prieigos žurnalą, kad rastumėte dominančios informacijos, tokios kaip:

    1. kliento IP
    2. Naršyklės tipas
    3. HTTP užklausos tipas
    4. Prašoma išteklių
    5. Serverio blokas atsakant į užklausą (naudinga, jei keli virtualūs pagrindiniai kompiuteriai prisijungia prie to paties failo).

    Atlikite atitinkamus veiksmus, jei aptiksite neįprastą ar nepageidaujamą veiklą.

    PATARIMAS Nr. 9: Užkirsti kelią „Hot Hotlinking“ sistemoje „Nginx“

    Vaizdo susiejimas įvyksta, kai asmuo kitoje svetainėje rodo jūsų priglobtą vaizdą. Dėl to padidėja pralaidumo naudojimas (už kurį mokate), o kitas žmogus su džiaugsmu rodo vaizdą taip, lyg tai būtų jo nuosavybė. Kitaip tariant, jums tai yra dviguba netektis.

    Tarkime, kad serverio bloke turite pakatalogį pavadinimu img , kuriame saugote visus vaizdus, naudojamus tame virtualiame priegloboje. Norėdami neleisti kitoms svetainėms naudoti jūsų atvaizdų, turėsite įterpti šį vietos bloką į savo virtualiosios prieglobos apibrėžimą:

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

    Tada pakeiskite failą index.html kiekviename virtualiame pagrindiniame kompiuteryje taip:

    Dabar naršykite po kiekvieną svetainę ir, kaip matote, vaizdas teisingai rodomas 192.168.0.25, bet pakeistas 403 atsakymu 192.168.0.26:

    Atminkite, kad šis patarimas priklauso nuo nuotolinės naršyklės, siunčiančios lauką „Referer“.

    PATARIMAS Nr. 10: Išjunkite SSL ir įgalinkite TLS tik „Nginx“

    Kai tik įmanoma, darykite viską, ko reikia, kad išvengtumėte SSL bet kurioje savo versijoje, ir naudokite TLS. Šie ssl_protocols turėtų būti dedami į serverio ar http kontekstą jūsų virtualaus pagrindinio failo faile arba yra atskiras failas pagal direktyvą „įtraukti“ (kai kurie žmonės naudoja failą pavadinimu ssl.conf , bet tai priklauso tik nuo jūsų):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Pavyzdžiui:

    PATARIMAS Nr. 11: sukurkite sertifikatus „Nginx“

    Pirmiausia sugeneruokite raktą ir sertifikatą. Jei norite, nedvejodami naudokite kito tipo šifravimą:

    # 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
    

    Tada įdėkite šias eilutes į atskirą serverio bloką, ruošdamiesi kitam patarimui ( http -> https nukreipimas) ir perkelkite su SSL susijusias direktyvas į naują 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;
    }
    

    Kitame patarime mes patikrinsime, kaip mūsų svetainė dabar naudoja savarankiškai pasirašytą sertifikatą ir TLS.

    PATARIMAS Nr. 12: nukreipkite HTTP srautą į „HTTPS“ sistemoje „Nginx“

    Prie pirmojo serverio bloko pridėkite šią eilutę:

    return 301 https://$server_name$request_uri;
    

    Pirmiau nurodyta direktyva grąžins atsakymą 301 (perkeltas visam laikui), kuris naudojamas nuolatiniam URL peradresavimui, kai tik pateikiama užklausa jūsų virtualaus pagrindinio kompiuterio 80 prievadui, ir peradresuos užklausą į serverio bloką, kurį pridėjome ankstesniame patarime.

    Žemiau pateiktame paveikslėlyje parodytas peradresavimas ir patvirtinama, kad šifravimui naudojame TLS 1.2 ir AES-256:

    Santrauka

    Šiame straipsnyje mes pasidalijome keliais patarimais, kaip apsaugoti jūsų „Nginx“ žiniatinklio serverį. Mes norėtume išgirsti, ką jūs galvojate, ir, jei turite kitų patarimų, kuriais norėtumėte pasidalinti su likusia bendruomene, nedvejodami praneškite mums, atsiųsdami mums pastabą naudodami toliau pateiktą komentaro formą.