Galvenais ceļvedis Nginx tīmekļa servera drošai, cietināšanai un veiktspējas uzlabošanai


Pamatojoties uz brīnišķīgajām lietām, ko esat dzirdējis par Nginx, iespējams, jūs nolēmāt izmēģināt. Jums, iespējams, tas ir tik ļoti paticis, ka pēc Apgūstot dažus šajā vietnē publicētos rakstus par tēmu apsverat savu Apache instalāciju nomaiņu ar Nginx.

Ja tā, es esmu pārliecināts, ka jūs laipni gaidīsit šo rokasgrāmatu, jo mēs aplūkosim 12 padomus, kā palielināt jūsu Nginx serveru drošību (sākot no Nginx atjaunināšanas līdz pat TLS izmantošanai un HTTP novirzīšanai uz HTTPS), un jūs ievērosiet, ka daži no tiem ir ļoti līdzīgi tam, ko jūs darītu ar Apache.

Nepalaidiet garām:

Šajā ceļvedī mēs izmantosim šādu vidi:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP adrese: 192.168.0.25 (tecmintlovesnginx.com) un 192.168.0.26 (nginxmeanspower.com), kā aprakstīts IP balstīto virtuālo resursdatoru sadaļā
    1. “Kā uz vārdu un IP balstītus virtuālos saimniekus (servera blokus) iestatīt ar Nginx

    Paturot to prātā, sāksim.

    PADOMS Nr. 1: Nginx atjauniniet

    Šīs rakstīšanas laikā jaunākās Nginx versijas CentOS (EPEL) un Debian krātuvēs ir attiecīgi 1.6.3 un 1.6.2-5.

    Lai gan programmatūras instalēšana no krātuvēm ir vienkāršāka nekā programmas sastādīšana no avota koda, šai pēdējai opcijai ir divas priekšrocības: 1) tas ļauj jums izveidot papildu moduļus Nginx (piemēram, mod_security) un 2) tas vienmēr nodrošinās jaunāku versiju nekā krātuves (1.9.9 no šodienas). Izlaiduma piezīmes vienmēr ir pieejamas Nginx vietnē.

    Nepalaidiet garām:

    PADOMS # 2: Noņemiet nevajadzīgos moduļus Nginx

    Lai skaidri noņemtu moduļus no Nginx instalēšanas laikā no avota, rīkojieties šādi:

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

    Piemēram:

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

    Kā jūs droši vien uzminēsiet, moduļu noņemšanai no iepriekšējās Nginx instalācijas no avota ir jāveic atkārtota kompilācija.

    Piesardzības vārds: konfigurācijas direktīvas nodrošina moduļi. Pārliecinieties, ka neesat atspējojis moduli, kurā ir norāde, kas jums būs nepieciešama ceļā! Pirms lēmuma pieņemšanas par moduļu atspējošanu jāpārbauda, vai nginx docs satur katrā modulī pieejamo direktīvu sarakstu.

    PADOMS Nr. 3: Atspējojiet servera_kopu direktīvu Nginx

    Direktīva server_tokens liek Nginx parādīt pašreizējo versiju kļūdu lapās. Tas nav vēlams, jo jūs nevēlaties kopīgot šo informāciju ar pasauli, lai novērstu uzbrukumus jūsu tīmekļa serverim, ko izraisa zināmas šīs specifiskās versijas ievainojamības.

    Lai atspējotu direktīvu server_tokens , servera blokā iestatiet opciju izslēgt:

    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ējiet nginx un pārbaudiet izmaiņas:

    PADOMS # 4: Noraidiet HTTP lietotāju aģentus pakalpojumā Nginx

    HTTP lietotāja aģents ir programmatūra, kas tiek izmantota satura sarunām ar tīmekļa serveri. Tas attiecas arī uz ļaunprātīgas programmatūras robotiem un rāpuļprogrammām, kas, izniekojot sistēmas resursus, var ietekmēt jūsu tīmekļa servera veiktspēju.

    Lai vieglāk uzturētu nevēlamo lietotāju aģentu sarakstu, izveidojiet failu (piemēram, /etc/nginx/blockuseragents.rules ) ar šādu saturu:

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

    Pēc tam pirms servera bloka definīcijas ievietojiet šādu rindu:

    include /etc/nginx/blockuseragents.rules;
    

    Un if paziņojums, lai atgrieztu atbildi 403, ja lietotāja aģenta virkne atrodas iepriekš definētajā melnajā sarakstā:

    Restartējiet nginx, un visiem lietotāju aģentiem, kuru virkne atbilst iepriekš minētajam, tiks bloķēta piekļuve jūsu tīmekļa serverim. Nomainiet 192.168.0.25 ar sava servera IP un nekautrējieties izvēlēties citu virkni wget slēdzim --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 
    

    PADOMS # 5: atspējojiet nevēlamās HTTP metodes pakalpojumā Nginx

    Pazīstami arī kā darbības vārdi, HTTP metodes norāda vēlamo darbību, kas jāveic ar resursu, kuru apkalpo Nginx. Parastajām vietnēm un lietojumprogrammām ir jāatļauj tikai GET, POST un HEAD un jāatspējo visas pārējās.

    Lai to izdarītu, servera blokā ievietojiet šādas rindas. HTTP atbilde 444 nozīmē tukšu atbildi, un to bieži izmanto Nginx, lai apmānītu ļaunprātīgas programmatūras uzbrukumus:

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

    Lai pārbaudītu, izmantojiet čokurošanos, lai nosūtītu DELETE pieprasījumu, un salīdziniet izvadi ar sūtot regulāru GET:

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

    PADOMS # 6: iestatiet bufera lieluma ierobežojumus Nginx

    Lai novērstu bufera pārpildes uzbrukumus jūsu Nginx tīmekļa serverim, atsevišķā failā iestatiet šādas direktīvas (piemēram, izveidojiet jaunu failu ar nosaukumu /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;
    

    Iepriekš minētās direktīvas nodrošinās, ka jūsu tīmekļa serverim iesniegtie pieprasījumi neizraisīs bufera pārpildi jūsu sistēmā. Vēlreiz skatiet dokumentus, lai iegūtu sīkāku informāciju par to, ko katrs no viņiem dara.

    Pēc tam konfigurācijas failā pievienojiet iekļaut direktīvu:

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

    7. PADOMS: Ierobežojiet savienojumu skaitu pēc IP Nginx

    Lai ierobežotu savienojumus pēc IP, izmantojiet limit_conn_zone (http kontekstā vai vismaz ārpus servera bloka) un limit_conn (http, servera bloka vai atrašanās vietas kontekstā) direktīvas.

    Tomēr ņemiet vērā, ka ne visi savienojumi tiek skaitīti, bet ir lasīti tikai tie savienojumi, kuru serveris ir apstrādājis pieprasījumu un visu tā pieprasījuma galveni.

    Piemēram, iestatīsim maksimālo savienojumu skaitu uz 1 (jā, tas ir pārspīlēts, bet šajā gadījumā tas darīs darbu lieliski) zonā ar nosaukumu addr (to var iestatīt uz jebkuru kuru vēlaties):

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

    Vienkāršs tests ar Apache Benchmark (Veikt Nginx ielādi), kur 10 kopējie savienojumi tiek veikti ar vienlaicīgiem 2 pieprasījumiem, palīdzēs mums pierādīt savu nostāju:

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

    Skatiet nākamo padomu, lai iegūtu sīkāku informāciju.

    PADOMS # 8: Nginx iestatīšanas monitora žurnāli

    Kad esat veicis iepriekšējā padomā aprakstīto pārbaudi, pārbaudiet servera blokam noteikto kļūdu žurnālu:

    Iespējams, vēlēsities izmantot grep, lai filtrētu neizdevušos pieprasījumu žurnālus, kas veikti TIP # 7 definētajā addr zonā:

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

    Tāpat jūs varat filtrēt piekļuves žurnālu, lai iegūtu interesējošu informāciju, piemēram:

    1. klienta IP
    2. Pārlūkprogrammas veids
    3. HTTP pieprasījuma veids
    4. Pieprasīts resurss
    5. Servera bloķēšana, atbildot uz pieprasījumu (noderīga, ja vienā un tajā pašā failā reģistrējas vairāki virtuālie resursdatori).

    Ja veicat kādas neparastas vai nevēlamas darbības, rīkojieties atbilstoši.

    PADOMS # 9: Novērsiet attēlu karsto sasaisti programmā Nginx

    Attēlu saite notiek, kad persona citā vietnē parāda jūsu mitinātu attēlu. Tas palielina jūsu joslas platuma izmantošanu (par ko jūs maksājat), kamēr otra persona ar prieku parāda attēlu tā, it kā tas būtu viņa īpašums. Citiem vārdiem sakot, tas ir divkāršs zaudējums jums.

    Pieņemsim, ka jūsu servera blokā ir apakšdirektorijs ar nosaukumu img , kurā jūs glabājat visus attēlus, kas izmantoti šajā virtuālajā resursdatorā. Lai neļautu citām vietnēm izmantot jūsu attēlus, virtuālās resursdatora definīcijā būs jāievieto šāds atrašanās vietas bloks:

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

    Pēc tam katrā virtuālajā resursdatorā modificējiet failu index.html šādi:

    Tagad pārlūkojiet katru vietni, un, kā redzat, attēls ir pareizi parādīts 192.168.0.25, bet tiek aizstāts ar 403 atbildi 192.168.0.26:

    Ņemiet vērā, ka šis padoms ir atkarīgs no attālās pārlūkprogrammas, kas nosūta lauku Referer.

    PADOMS # 10: atspējojiet SSL un iespējojiet TLS tikai Nginx

    Kad vien iespējams, dariet visu iespējamo, lai nevienā no tā versijām izvairītos no SSL, un tā vietā izmantojiet TLS. Šie ssl_protocols jāievieto servera vai http kontekstā jūsu virtuālajā resursdatora failā vai arī tie ir atsevišķi faili, izmantojot iekļaušanas direktīvu (daži cilvēki izmanto failu ar nosaukumu ssl.conf , bet tas pilnībā atkarīgs no jums):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Piemēram:

    PADOMS # 11: Izveidojiet sertifikātus Nginx

    Pirmkārt, ģenerējiet atslēgu un sertifikātu. Ja vēlaties, izmantojiet cita veida šifrēšanu.

    # 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
    

    Pēc tam pievienojiet šīs rindas atsevišķā servera blokā, gatavojoties nākamajam padomam ( http -> https novirzīšana), un pārvietojiet ar SSL saistītās direktīvas arī uz jauno bloku:

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

    Nākamajā padomā mēs pārbaudīsim, kā mūsu vietnē tagad tiek izmantots pašparakstīts sert un TLS.

    PADOMS # 12: Pāradresējiet HTTP trafiku uz HTTPS pakalpojumā Nginx

    Pirmajam servera blokam pievienojiet šādu rindu:

    return 301 https://$server_name$request_uri;
    

    Iepriekš minētā direktīva atgriezīs atbildi 301 (pārvietots pastāvīgi), kas tiek izmantota pastāvīgai URL novirzīšanai ikreiz, kad tiek pieprasīts jūsu virtuālā resursdatora 80. ports, un novirzīs pieprasījumu uz servera bloku, kuru pievienojām iepriekšējā padomā.

    Zemāk redzamajā attēlā parādīta novirzīšana un apstiprināts fakts, ka mēs šifrēšanai izmantojam TLS 1.2 un AES-256:

    Kopsavilkums

    Šajā rakstā mēs esam dalījušies ar dažiem padomiem, kā aizsargāt jūsu Nginx tīmekļa serveri. Mēs labprāt dzirdētu, ko jūs domājat, un, ja jums ir citi padomi, kurus vēlaties dalīties ar pārējo kopienu, nekautrējieties informēt mūs, nosūtot mums piezīmi, izmantojot zemāk esošo komentāru veidlapu.