Nginx web serweriniň howpsuzlygyny üpjün etmek, berkitmek we öndürijiligini gowulandyrmak üçin iň soňky gollanma


Nginx hakda eşiden ajaýyp zatlaryňyza esaslanyp, belki synap görmek kararyna geldiňiz. Bu sahypada çap eden mowzugymyzdaky käbir makalalary öwreneniňizden soň, Apache gurnamalaryňyzy Nginx bilen çalyşmagy göz öňünde tutýan gaty gowy gören bolmagyňyz mümkin.

Şeýle bolsa, bu gollanmany aç-açan garşy aljakdygyňyza ynanýaryn, sebäbi Nginx serwerleriňiziň howpsuzlygyny ýokarlandyrmak üçin 12 maslahaty (Nginx-i tä tä tä TLS-den peýdalanmakdan başlap, HTTP-e gönükdirmekden başlap 12 maslahat) açarys. HTTPS), we olaryň käbiri Apache bilen etjek işleriňize gaty meňzeýändigini bellärsiňiz.

Missitirmäň:

Bu gollanmada aşakdaky gurşawy ulanarys:

  1. Debian GNU/Linux 8.1 (jessi).
  2. IP salgysy: IP esasly wirtual hostlar bölüminde görkezilişi ýaly 192.168.0.25 (tecmintlovesnginx.com) we 192.168.0.26 (nginxmeanspower.com)
    1. “Ady esasly we IP esasly wirtual hostlary (serwer bloklary) Nginx bilen nädip sazlamaly“

    Şuny göz öňünde tutup, başlalyň.

    Maslahat # 1: Nginx-i täzeläň

    Bu ýazylanda CentOS-da (EPEL-de) we Debian ammarlarynda iň soňky Nginx wersiýalary degişlilikde 1,6.3 we 1.6.2-5.

    Ammarlardan programma üpjünçiligini gurnamak programmany deslapky koddan düzmekden has aňsat bolsa-da, bu soňky wariantyň iki artykmaçlygy bar: 1) Nginx-de goşmaça modullary gurmaga mümkinçilik berýär (mod_security ýaly) we 2) elmydama täze wersiýa üpjün eder ammarlaryndan has köp (şu günki güne görä 1,9.9). Çykyş bellikleri Nginx web sahypasynda elmydama elýeterlidir.

    Missitirmäň:

    Maslahat 22: Nginx-de gereksiz modullary aýyryň

    Çeşmeden gurnanyňyzda Nginx-den modullary aç-açan aýyrmak üçin:

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

    Mysal üçin:

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

    Probablyhtimal, çak edişiňiz ýaly, öňki Nginx gurnamasyndan modullary çeşmeden aýyrmak, ýene bir gezek düzmegi talap edýär.

    Üns beriň: Sazlama görkezmeleri modullar bilen üpjün edilýär. Roadolda zerur görkezmäni öz içine alýan moduly öçürmeýändigiňize göz ýetiriň! Modullary öçürmek barada karar kabul etmezden ozal her modulda bar bolan görkezmeleriň sanawy üçin nginx resminamalaryny barlamaly.

    Maslahat # 3: Nginx-de server_tokens Direktiwasyny öçüriň

    server_tokens direktiwasy Nginx-a häzirki wersiýasyny säwlik sahypalarynda görkezmegi tabşyrýar. Bu islenmeýär, sebäbi belli bir wersiýadaky belli gowşaklyklar sebäpli web serweriňize hüjümleriň öňüni almak üçin bu maglumatlary dünýä bilen paýlaşmak islemeýärsiňiz.

    server_tokens direktiwasyny öçürmek üçin serwer blokynyň içinde ýapyljakdygyny belläň:

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

    Nginx-i täzeden açyň we üýtgeşmeleri barlaň:

    Maslahat # 4: Nginx-de HTTP ulanyjy agentlerini ret ediň

    HTTP ulanyjy agenti, web serwerine garşy mazmun gepleşikleri üçin ulanylýan programma üpjünçiligi. Mundan başga-da, ulgam çeşmelerini ýitirip, web serweriňiziň işine täsir edip biljek zyýanly programma üpjünçiligi botlary we gözlegçiler hem bar.

    Islenilmeýän ulanyjy agentleriniň sanawyny has aňsat saklamak üçin aşakdaky mazmunly bir faýl dörediň ( /etc/nginx/blockuseragents.rules ).

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

    Ondan soň, serwer blok kesgitlemesinden öň aşakdaky setiri ýerleşdiriň:

    include /etc/nginx/blockuseragents.rules;
    

    Ulanyjy agentiniň setiri ýokarda kesgitlenen gara sanawda bolsa, 403 jogap gaýtarmak üçin jümle:

    Nginx-i täzeden açyň we setiri ýokardakylara gabat gelýän ähli ulanyjy agentleri web serweriňize girip bilmez. 192.168.0.25-i serweriňiziň IP-si bilen çalyşyň we wgetiň --user-agent wyklýuçateli üçin başga bir setir saýlap bilersiňiz:

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

    Maslahat # 5: Nginx-de islenmeýän HTTP usullaryny öçüriň

    Işlikler diýlip hem atlandyrylýan HTTP usullary, Nginx tarapyndan hödürlenýän çeşmede edilmeli çäreleri görkezýär. Umumy web sahypalary we amaly programmalar üçin diňe GET, POST we HEAD rugsat bermeli we beýlekileriň hemmesini öçürmeli.

    Munuň üçin aşakdaky setirleri serwer blokynyň içinde goýuň. 444 HTTP jogaby boş jogaby aňladýar we köplenç zyýanly programma hüjümlerini aldamak üçin Nginx-de ulanylýar:

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

    Synag üçin, DELETE haýyşyny ibermek üçin egri ulanyň we çykyşy adaty GET ibereniňizde deňeşdiriň:

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

    Maslahat # 6: Nginx-de bufer ölçeg çäklendirmelerini düzüň

    Nginx web serweriňize garşy bufer akymynyň öňüni almak üçin aşakdaky görkezmeleri aýratyn faýlda düzüň (mysal üçin /etc/nginx/conf.d/buffer.conf atly täze faýl dörediň):

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

    Aboveokardaky görkezmeler web serweriňize edilen haýyşlaryň ulgamyňyzda bufer akymyna sebäp bolmazlygyny üpjün eder. Olaryň hersiniň näme edýändigi barada has giňişleýin maglumat üçin resminamalara ýüz tutuň.

    Soňra konfigurasiýa faýlyna goşmaça görkezme goşuň:

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

    Maslahat # 7: Nginx-de IP arkaly birikmeleriň sanyny çäklendiriň

    IP arkaly baglanyşyklary çäklendirmek üçin limit_conn_zone (http kontekstinde ýa-da iň bolmanda serwer blokynyň daşynda) we limit_conn (http, serwer blokunda ýa-da ýerleşiş kontekstinde) görkezmelerini ulanyň.

    Şeýle-de bolsa, ähli birikmeleriň sanalmaýandygyny ýadyňyzdan çykarmaň - diňe serwer tarapyndan işlenip düzülen haýyş we ähli haýyş sözbaşysy okaldy.

    Mysal üçin, iň köp sanly birikmäni 1 belläliň (hawa, bu ulaltmak, ýöne bu ýagdaýda bu işi gowy ýerine ýetirer) addr atly zonada (muny islän zadyňyza düzüp bilersiňiz) isleýän adyňyz):

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

    Apache Benchmark (Nginx Load-y ýerine ýetiriň) bilen ýönekeý synag, şol bir wagtyň özünde 2 bilen birleşdirilen 10 umumy baglanyşyklar biziň pikirimizi görkezmäge kömek eder:

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

    Has giňişleýin maglumat üçin indiki maslahata serediň.

    Maslahat # 8: Nginx üçin gurnama monitor ýazgylary

    Öňki maslahatda beýan edilen synagy ýerine ýetireniňizden soň, serwer bloky üçin kesgitlenen säwlik gündeligini barlaň:

    Grep ulanyp, 7-nji Maslahatda kesgitlenen addr zonasyna edilen şowsuz haýyşlar üçin surnallary süzmek üçin ulanyp bilersiňiz:

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

    Şonuň ýaly-da, gyzyklanma maglumatlary üçin giriş gündeligini süzüp bilersiňiz:

    1. Müşderi IP
    2. Brauzer görnüşi
    3. HTTP haýyş görnüşi
    4. Resurs talap edildi
    5. Haýyşa jogap berýän serwer bloky (birnäçe wirtual host şol bir faýla girýän bolsa peýdaly).

    Haýsydyr bir üýtgeşik ýa-da islenmeýän çäräni ýüze çykarsaňyz, degişli çäreleri görüň.

    Maslahat # 9: Nginx-de suratlaryň baglanyşygynyň öňüni alyň

    Surat gyzgyn baglanyşygy, bir adam başga bir sahypada özüňizde ýerleşdirilen suraty görkezende bolýar. Bu, geçirijilik giňligiňiziň ulanylmagyna sebäp bolýar (töleýärsiňiz), beýleki adam bolsa suraty edil öz emlägi ýaly görkezýär. Başgaça aýdylanda, bu siziň üçin goşa ýitgi.

    Mysal üçin, serwer blokuňyzyň içinde şol wirtual hostda ulanylýan ähli suratlary saklaýan img atly bukjanyňyzyň bardygyny aýdalyň. Beýleki sahypalaryň suratlaryňyzy ulanmagynyň öňüni almak üçin, wirtual host kesgitlemäňize aşakdaky ýerleşiş blokyny girizmeli bolarsyňyz:

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

    Soňra her wirtual hostdaky index.html faýlyny aşakdaky ýaly üýtgediň:

    Indi her sahypa göz aýlaň we görşüňiz ýaly surat 192.168.0.25-de dogry görkezilýär, ýöne 192.168.0.26-da 403 jogap bilen çalşylýar:

    Bu maslahatyň “Referer” meýdançasyny iberýän uzakdaky brauzere baglydygyny unutmaň.

    Maslahat # 10: SSL-i öçüriň we diňe Nginx-de TLS-i işlediň

    Mümkin boldugyça islendik wersiýasynda SSL-den gaça durmak üçin zerur zatlary ediň we ýerine TLS ulanyň. Aşakdaky ssl_protocols wirtual host faýlyňyzda serwerde ýa-da http kontekstinde ýerleşdirilmelidir ýa-da öz içine alýan görkezme arkaly aýratyn faýl bolmaly (käbir adamlar ssl.conf atly faýly ulanýarlar) , ýöne bu size doly bagly):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Mysal üçin:

    Maslahat # 11: Nginx-de şahadatnamalar dörediň

    Ilki bilen açar we şahadatnama dörediň. Isleseňiz, başga bir şifrlemek görnüşini ulanyp bilersiňiz:

    # 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
    

    Soňra indiki maslahata ( http -> https gönükdirme) taýýarlyk görmek üçin aýratyn serwer blokynyň içine aşakdaky setirleri goşuň we SSL bilen baglanyşykly görkezmeleri täze blokda hem geçiriň:

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

    Indiki maslahatda, sahypamyzyň indi öz-özüne gol çekilen şahadatnamany we TLS-ni nähili ulanýandygyny barlarys.

    Maslahat # 12: HTTP traffigini Nginx-de HTTPS-e gönükdiriň

    Ilkinji serwer blokyna aşakdaky setiri goşuň:

    return 301 https://$server_name$request_uri;
    

    Aboveokardaky görkezme, wirtual öý eýesiniň 80-nji portuna haýyş edilende hemişelik URL gönükdirmek üçin ulanylýan 301 (hemişelik göçürildi) jogabyny yzyna getirer we haýyşy öňki maslahatda goşan serwer blokyna ugrukdyrar.

    Aşakdaky surat gönükdirmäni görkezýär we şifrlemek üçin TLS 1.2 we AES-256 ulanýandygymyzy tassyklaýar:

    Gysgaça mazmun

    Bu makalada Nginx web serweriňizi goramak üçin birnäçe maslahatlary paýlaşdyk. Pikirleriňizi eşitmek isleýäris we beýleki jemgyýetler bilen paýlaşmak isleýän beýleki maslahatlaryňyz bar bolsa, aşakdaky düşündiriş formuny ulanyp bellik iberip bize habar beriň.