Mwongozo wa Mwisho wa Kulinda, Kuimarisha na Kuboresha Utendaji wa Seva ya Wavuti ya Nginx


Kulingana na mambo mazuri ambayo umesikia kuhusu Nginx, labda uliamua kujaribu. Huenda umeipenda sana kwamba unazingatia kubadilisha usakinishaji wako wa Apache na Nginx baada ya kupitia baadhi ya vifungu kwenye mada ambayo tumechapisha kwenye tovuti hii.

Ikiwa ndivyo, nina hakika utakaribisha mwongozo huu kwa mikono miwili kwani tutashughulikia vidokezo 12 ili kuongeza usalama wa seva zako za Nginx (kuanzia kusasisha Nginx hadi kutumia TLS na kuelekeza HTTP hadi HTTPS), na utagundua kuwa baadhi yao ni sawa na kile ungefanya na Apache.

Usikose:

Tutatumia mazingira yafuatayo katika mwongozo huu:

  1. Debian GNU/Linux 8.1 (jessie).
  2. Anwani ya IP: 192.168.0.25 (tecmintlovesnginx.com) na 192.168.0.26 (nginxmeanspower.com), kama ilivyofafanuliwa katika sehemu ya wapangishi pepe wa msingi wa IP katika
    1. “Jinsi ya Kuweka Wapangishi Pekee kulingana na Jina na IP (Vizuizi vya Seva) kwa kutumia Nginx“

    Kwa kuzingatia hilo, wacha tuanze.

    KIDOKEZO #1: Sasisha Nginx

    Wakati wa uandishi huu, matoleo ya hivi karibuni ya Nginx katika CentOS (katika EPEL) na hazina za Debian ni 1.6.3 na 1.6.2-5, mtawalia.

    Ingawa kusanikisha programu kutoka kwa hazina ni rahisi kuliko kuunda programu kutoka kwa nambari ya chanzo, chaguo hili la mwisho lina faida mbili: 1) hukuruhusu kuunda moduli za ziada kwenye Nginx (kama vile mod_security), na 2) itatoa toleo jipya kila wakati. kuliko hazina (1.9.9 kama ilivyo leo). Vidokezo vya kutolewa vinapatikana kila wakati kwenye wavuti ya Nginx.

    Usikose:

    Kidokezo #2: Ondoa Moduli Zisizohitajika katika Nginx

    Kuondoa kwa uwazi moduli kutoka kwa Nginx wakati wa kusakinisha kutoka kwa chanzo, fanya:

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

    Kwa mfano:

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

    Kama unavyoweza kukisia, kuondoa moduli kutoka kwa usakinishaji wa Nginx uliopita kutoka kwa chanzo kunahitaji kufanya mkusanyiko tena.

    Tahadhari: Maagizo ya usanidi hutolewa na moduli. Hakikisha hauzimi moduli ambayo ina maagizo ambayo utahitaji barabarani! Unapaswa kuangalia hati za nginx kwa orodha ya maagizo yanayopatikana katika kila moduli kabla ya kuchukua uamuzi juu ya kulemaza moduli.

    KIDOKEZO #3: Lemaza Maagizo ya ishara_za seva katika Nginx

    Maagizo ya server_tokens huiambia Nginx kuonyesha toleo lake la sasa kwenye kurasa za makosa. Hili halifai kwa kuwa hutaki kushiriki maelezo hayo na ulimwengu ili kuzuia mashambulizi kwenye seva yako ya wavuti yanayosababishwa na udhaifu unaojulikana katika toleo hilo mahususi.

    Ili kuzima maagizo ya server_tokens, weka kama itazima ndani ya kizuizi cha seva:

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

    Anzisha tena nginx na uthibitishe mabadiliko:

    Kidokezo #4: Kataa Mawakala wa Watumiaji wa HTTP katika Nginx

    Wakala wa mtumiaji wa HTTP ni programu ambayo hutumiwa kwa mazungumzo ya maudhui dhidi ya seva ya wavuti. Hii pia inajumuisha roboti na programu hasidi ambazo zinaweza kuathiri utendaji wa seva yako ya wavuti kwa kupoteza rasilimali za mfumo.

    Ili kudumisha kwa urahisi orodha ya mawakala wa watumiaji wasiotakikana, tengeneza faili (/etc/nginx/blockuseragents.rules kwa mfano) iliyo na maudhui yafuatayo:

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

    Ifuatayo, weka mstari ufuatao kabla ya ufafanuzi wa kuzuia seva:

    include /etc/nginx/blockuseragents.rules;
    

    Na ikiwa taarifa ya kurudisha jibu 403 ikiwa kamba ya wakala wa mtumiaji iko kwenye orodha nyeusi iliyofafanuliwa hapo juu:

    Anzisha tena nginx, na mawakala wote wa watumiaji ambao kamba yao inalingana na hapo juu watazuiwa kufikia seva yako ya wavuti. Badilisha 192.168.0.25 na IP ya seva yako na ujisikie huru kuchagua mfuatano tofauti wa swichi ya --wakala wa mtumiaji ya wget:

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

    KIDOKEZO #5: Zima Mbinu za HTTP Zisizotakikana katika Nginx

    Pia hujulikana kama vitenzi, mbinu za HTTP zinaonyesha hatua inayotakiwa kuchukuliwa kwenye rasilimali inayotolewa na Nginx. Kwa tovuti na programu za kawaida, unapaswa kuruhusu GET, POST, na HEAD pekee na uzime vingine vyote.

    Ili kufanya hivyo, weka mistari ifuatayo ndani ya kizuizi cha seva. Jibu la 444 HTTP linamaanisha jibu tupu na mara nyingi hutumiwa katika Nginx kupumbaza mashambulizi ya programu hasidi:

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

    Ili kujaribu, tumia curl kutuma ombi la DELETE na kulinganisha matokeo na unapotuma GET ya kawaida:

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

    KIDOKEZO #6: Weka Mapungufu ya Saizi ya Buffer katika Nginx

    Ili kuzuia mashambulizi ya kufurika kwa bafa dhidi ya seva yako ya wavuti ya Nginx, weka maagizo yafuatayo katika faili tofauti (kwa mfano, unda faili mpya inayoitwa /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;
    

    Maagizo hapo juu yatahakikisha kuwa maombi yanayotumwa kwa seva yako ya wavuti hayatasababisha kufurika kwa bafa kwenye mfumo wako. Kwa mara nyingine tena, rejelea hati kwa maelezo zaidi juu ya kile ambacho kila mmoja wao hufanya.

    Kisha ongeza ni pamoja na maagizo katika faili ya usanidi:

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

    KIDOKEZO #7: Weka Kikomo Idadi ya Viunganisho na IP katika Nginx

    Ili kupunguza miunganisho kwa kutumia IP, tumia maagizo ya limit_conn_zone (katika muktadha wa http au angalau nje ya kizuizi cha seva) na limit_conn (katika http, kizuizi cha seva, au eneo).

    Hata hivyo, kumbuka kwamba sio viunganisho vyote vinavyohesabiwa - lakini ni wale tu ambao wana ombi lililochakatwa na seva na kichwa chake cha ombi kilisomwa.

    Kwa mfano, wacha tuweke idadi ya juu zaidi ya miunganisho kuwa 1 (ndio, ni chumvi, lakini itafanya kazi vizuri katika kesi hii) katika eneo linaloitwa addr (unaweza kuweka hii kwa chochote. jina unalotaka):

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

    Jaribio rahisi la Apache Benchmark (Tekeleza Mzigo wa Nginx) ambapo 10 miunganisho ya jumla inafanywa kwa 2 maombi ya wakati mmoja itatusaidia kuonyesha hoja yetu:

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

    Tazama kidokezo kifuatacho kwa maelezo zaidi.

    KIDOKEZO #8: Sanidi Kumbukumbu za Kufuatilia kwa Nginx

    Mara tu umefanya jaribio lililoelezewa kwenye kidokezo kilichotangulia, angalia logi ya makosa ambayo imefafanuliwa kwa kizuizi cha seva:

    Unaweza kutaka kutumia grep kuchuja magogo kwa maombi yaliyoshindwa kufanywa kwa eneo la kuongeza lililofafanuliwa katika TIP #7:

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

    Vivyo hivyo, unaweza kuchuja logi ya ufikiaji kwa habari ya kupendeza, kama vile:

    1. IP ya Mteja
    2. Aina ya kivinjari
    3. Aina ya ombi la HTTP
    4. Nyenzo iliyoombwa
    5. Uzuiaji wa seva kujibu ombi (inafaa ikiwa wapangishaji kadhaa pepe wanaingia kwenye faili moja).

    Na chukua hatua ifaayo ukigundua shughuli yoyote isiyo ya kawaida au isiyotakikana.

    Kidokezo #9: Zuia Kuunganisha Picha kwenye Nginx

    Uunganishaji wa picha hutokea wakati mtu anaonyesha kwenye tovuti nyingine picha iliyopangishwa kwenye yako. Hii husababisha ongezeko la matumizi yako ya kipimo data (unacholipia) huku mtu mwingine akionyesha picha hiyo kwa furaha kana kwamba ni mali yake. Kwa maneno mengine, ni hasara mara mbili kwako.

    Kwa mfano, tuseme una saraka ndogo inayoitwa img ndani ya kizuizi cha seva yako ambapo unahifadhi picha zote zinazotumiwa kwenye seva pangishi pepe. Ili kuzuia tovuti zingine kutumia picha zako, utahitaji kuingiza eneo lifuatalo ndani ya ufafanuzi wako wa seva pangishi:

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

    Kisha rekebisha faili ya index.html katika kila seva pangishi pepe kama ifuatavyo:

    Sasa vinjari kwa kila tovuti na kama unavyoona, picha inaonyeshwa kwa usahihi katika 192.168.0.25 lakini inabadilishwa na jibu la 403 katika 192.168.0.26:

    Kumbuka kuwa kidokezo hiki kinategemea kivinjari cha mbali kinachotuma uga wa Kirejelea.

    KIDOKEZO #10: Zima SSL na Wezesha TLS katika Nginx pekee

    Inapowezekana, fanya chochote kinachohitajika ili kuepuka SSL katika matoleo yake yoyote na badala yake utumie TLS. ssl_protocols zifuatazo zinapaswa kuwekwa katika seva au muktadha wa http katika faili yako ya seva pangishi au ni faili tofauti kupitia maagizo yanayojumuisha (baadhi ya watu hutumia faili iitwayo ssl.conf , lakini ni juu yako kabisa):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Kwa mfano:

    KIDOKEZO #11: Unda Vyeti katika Nginx

    Kwanza, toa ufunguo na cheti. Jisikie huru kutumia aina tofauti ya usimbaji fiche ukitaka:

    # 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
    

    Kisha ongeza mistari ifuatayo ndani ya kizuizi tofauti cha seva ili kutayarisha kidokezo kifuatacho (http --> https uelekezaji upya) na usogeze maagizo yanayohusiana na SSL kwenye kizuizi kipya pia:

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

    Katika kidokezo kifuatacho tutathibitisha jinsi tovuti yetu inavyotumia cheti cha kujiandikisha na TLS.

    KIDOKEZO #12: Elekeza upya trafiki ya HTTP kwa HTTPS katika Nginx

    Ongeza safu ifuatayo kwenye kizuizi cha kwanza cha seva:

    return 301 https://$server_name$request_uri;
    

    Maagizo yaliyo hapo juu yatarejesha jibu la 301 (Limehamishwa kabisa), ambalo linatumika kwa uelekezaji upya wa URL wa kudumu wakati wowote ombi linapotolewa la kuhamisha 80 ya seva pangishi pepe yako, na litaelekeza ombi kwenye kizuizi cha seva tulichoongeza kwenye kidokezo kilichotangulia.

    Picha iliyo hapa chini inaonyesha uelekezaji upya na inathibitisha ukweli kwamba tunatumia TLS 1.2 na AES-256 kwa usimbaji fiche:

    Muhtasari

    Katika nakala hii tumeshiriki vidokezo vichache vya kupata seva yako ya wavuti ya Nginx. Tungependa kusikia unachofikiria na, ikiwa una vidokezo vingine ambavyo ungependa kushiriki na jumuiya nyingine, jisikie huru kutufahamisha kwa kututumia dokezo ukitumia fomu ya maoni iliyo hapa chini.