Ultimativni vodič za osiguranje, ojačanje i poboljšanje performansi Nginx web servera


Na osnovu divnih stvari koje ste čuli o Nginxu, možda ste odlučili da ga isprobate. Možda vam se toliko svidio da razmišljate o zamjeni vaših Apache instalacija sa Nginxom nakon što ste prošli kroz neke od članaka na ovu temu koje smo objavili na ovoj stranici.

Ako je tako, siguran sam da ćete dočekati ovaj vodič raširenih ruku jer ćemo pokriti 12 savjeta za povećanje sigurnosti vaših Nginx servera (u rasponu od ažuriranja Nginxa pa sve do koristeći TLS i preusmjeravanje HTTP-a na HTTPS), a primijetit ćete da su neki od njih vrlo slični onome što biste radili s Apacheom.

Ne propustite:

13 Savjeti za sigurnost i jačanje Apache web servera

25 Apache Htaccess trikova za osiguranje Apache web servera

Nginx okruženje za testiranje

U ovom vodiču ćemo koristiti sljedeće okruženje:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP adresa: 192.168.0.25 (tecmintlovesnginx.com) i 192.168.0.26 (nginxmeanspower.com), kao što je opisano u virtuelnom baziranom na IP-u hosts section at

    1. „Kako podesiti virtuelne hostove zasnovane na imenu i IP-u (blokove servera) sa Nginxom“
  3. Nginx verzija: nginx/1.6.2.
  4. Radi vaše udobnosti, ovdje je konačna konfiguracijska datoteka (veza Pastebin).

Imajući to na umu, počnimo.

SAVJET #1: Održavajte Nginx ažurnim

U vrijeme pisanja ovog teksta, najnovije verzije Nginxa u CentOS-u (u EPEL) i Debian spremištima su 1.6.3 i 1.6.2-5, respektivno.

Ne propustite: Instalirajte najnoviju stabilnu verziju Nginx-a iz spremišta i izvora

Iako je instaliranje softvera iz spremišta lakše nego kompajliranje programa iz izvornog koda, ova posljednja opcija ima dvije prednosti: 1) omogućava vam da ugradite dodatne module u Nginx (kao što je mod_security) i 2) uvijek će pružiti noviju verziju nego repozitorijumi (1.9.9 od danas). Napomene o izdanju su uvijek dostupne na Nginx web stranici.

Ne propustite:

Zaštitite Apache od brutalne sile i DDoS napada koristeći Mod_Security i Mod_Evasive

SAVJET #2: Uklonite nepotrebne module u Nginxu

Da biste eksplicitno uklonili module iz Nginxa dok instalirate iz izvora, učinite:

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

Na primjer:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Kao što ćete vjerovatno pogoditi, uklanjanje modula iz prethodne instalacije Nginxa iz izvora zahtijeva ponovno izvođenje kompilacije.

Upozorenje: Konfiguracijske direktive daju moduli. Pazite da ne onemogućite modul koji sadrži direktivu koja će vam biti potrebna u nastavku! Trebali biste provjeriti nginx dokumente za listu direktiva dostupnih u svakom modulu prije nego što donesete odluku o onemogućavanju modula.

SAVJET #3: Onemogućite server_tokens direktivu u Nginxu

server_tokens direktiva govori Nginxu da prikaže svoju trenutnu verziju na stranicama s greškama. Ovo nije poželjno jer ne želite da dijelite te informacije sa svijetom kako biste spriječili napade na vaš web server uzrokovane poznatim ranjivostima u toj specifičnoj verziji.

Da onemogućite server_tokens direktivu, postavite if na isključeno unutar bloka servera:

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

Ponovo pokrenite nginx i provjerite promjene:

SAVJET #4: Zabranite HTTP korisničke agente u Nginxu

HTTP korisnički agent je softver koji se koristi za pregovaranje sadržaja na web serveru. Ovo također uključuje malver botove i pretraživače koji na kraju mogu utjecati na performanse vašeg web servera trošenjem sistemskih resursa.

Kako biste lakše održavali listu neželjenih korisničkih agenata, kreirajte datoteku (/etc/nginx/blockuseragents.rules na primjer) sa sljedećim sadržajem:

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

Zatim stavite sljedeći red ispred definicije bloka servera:

include /etc/nginx/blockuseragents.rules;

I if izjava za vraćanje 403 odgovora ako je niz korisničkog agenta na crnoj listi definiranoj gore:

Ponovo pokrenite nginx i svim korisničkim agentima čiji string odgovara gore navedenom bit će blokiran pristup vašem web serveru. Zamijenite 192.168.0.25 IP-om vašeg servera i slobodno odaberite drugi niz za --user-agent prekidač wget:

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

SAVJET #5: Onemogućite neželjene HTTP metode u Nginxu

Takođe poznate kao glagoli, HTTP metode ukazuju na željenu radnju koju treba preduzeti na resursu koji opslužuje Nginx. Za uobičajene web stranice i aplikacije trebali biste dozvoliti samo GET, POST i HEAD i onemogućiti sve ostale.

Da biste to učinili, postavite sljedeće redove unutar bloka servera. HTTP odgovor 444 znači prazan odgovor i često se koristi u Nginx-u za prevaru napada zlonamjernog softvera:

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

Za testiranje, koristite curl da pošaljete zahtjev za DELETE i uporedite izlaz s onim kada pošaljete običan GET:

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

SAVJET #6: Postavite ograničenja veličine bafera u Nginxu

Da biste spriječili napade prekoračenja bafera na vaš Nginx web server, postavite sljedeće direktive u zasebnu datoteku (na primjer kreirajte novu datoteku pod nazivom /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;

Gore navedene direktive će osigurati da zahtjevi upućeni vašem web serveru neće uzrokovati prelijevanje bafera u vašem sistemu. Još jednom, pogledajte dokumente za dodatne detalje o tome šta svaki od njih radi.

Zatim dodajte direktivu uključivanja u konfiguracijski fajl:

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

SAVJET #7: Ograničite broj veza prema IP-u u Nginxu

Da biste ograničili veze putem IP-a, koristite limit_conn_zone (u http kontekstu ili barem izvan serverskog bloka) i limit_conn (u http, serverskom bloku ili kontekstu lokacije) direktive.

Međutim, imajte na umu da se ne računaju sve veze – već samo one koje imaju zahtjev koji je server obradio i čitavo zaglavlje zahtjeva je pročitano.

Na primjer, postavimo maksimalni broj konekcija na 1 (da, to je pretjerano, ali će u ovom slučaju dobro obaviti posao) u zoni pod nazivom addr (ovo možete postaviti na bilo koji ime koje zelite):

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

Jednostavan test sa Apache Benchmark-om (izvrši Nginx učitavanje) gdje je ukupno 10 veza napravljeno sa 2 istovremenih zahtjeva pomoći će nam da demonstriramo našu poentu:

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

Pogledajte sljedeći savjet za više detalja.

SAVJET #8: Podešavanje evidencije monitora za Nginx

Nakon što ste izvršili test opisan u prethodnom savjetu, provjerite dnevnik grešaka koji je definiran za blok servera:

Možda ćete htjeti koristiti grep za filtriranje dnevnika za neuspjele zahtjeve upućene addr zoni definiranoj u SAVJETU #7:

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

Isto tako, možete filtrirati dnevnik pristupa za informacije od interesa, kao što su:

  1. IP klijenta
  2. Tip pretraživača
  3. Vrsta HTTP zahtjeva
  4. Zatražen resurs
  5. Blok servera koji odgovara na zahtjev (korisno ako se nekoliko virtuelnih hostova prijavljuje na istu datoteku).

I poduzmite odgovarajuće mjere ako otkrijete bilo kakvu neuobičajenu ili neželjenu aktivnost.

SAVJET #9: Spriječite hotlinking slika u Nginxu

Hotlinking slika se dešava kada osoba na drugom sajtu prikaže sliku koja se nalazi na vašoj. Ovo uzrokuje povećanje vaše upotrebe propusnog opsega (koju plaćate) dok druga osoba rado prikazuje sliku kao da je njegovo ili njeno vlasništvo. Drugim riječima, to je dvostruki gubitak za vas.

Na primjer, recimo da imate poddirektorij pod imenom img unutar vašeg serverskog bloka gdje pohranjujete sve slike koje se koriste u tom virtuelnom hostu. Kako biste spriječili druge stranice da koriste vaše slike, morat ćete umetnuti sljedeći blok lokacije unutar definicije vašeg virtualnog hosta:

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

Zatim modificirajte datoteku index.html u svakom virtuelnom hostu na sljedeći način:

192.168.0.26 192.168.0.25
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Tecmint loves Nginx</title>
</head>
<body>
<h1>Tecmint loves Nginx!</h1>
<img src=”img/nginx.png” />
</body>
</html>

Sada pretražite svaku stranicu i kao što vidite, slika je ispravno prikazana u 192.168.0.25, ali je zamijenjena odgovorom 403 u 192.168.0.26 jako>:

Imajte na umu da ovaj savjet zavisi od udaljenog pretraživača koji šalje polje Referer.

SAVJET #10: Onemogućite SSL i omogućite samo TLS u Nginxu

Kad god je moguće, učinite sve što je potrebno da izbjegnete SSL u bilo kojoj od njegovih verzija i umjesto toga koristite TLS. Sljedeći ssl_protocols bi trebao biti smješten u server ili http kontekst u vašem virtuelnom host fajlu ili je zasebna datoteka putem direktive uključivanja (neki ljudi koriste datoteku pod nazivom ssl.conf , ali to je u potpunosti na vama):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Na primjer:

SAVJET #11: Kreirajte certifikate u Nginxu

Prvo, generirajte ključ i certifikat. Slobodno koristite drugu vrstu enkripcije ako želite:

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

Zatim dodajte sljedeće linije unutar zasebnog bloka servera u pripremi za sljedeći savjet (http --> https preusmjeravanje) i premjestite direktive povezane sa SSL-om u novi 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;
}

U sljedećem savjetu ćemo provjeriti kako naša stranica sada koristi samopotpisani certifikat i TLS.

SAVJET #12: Preusmjerite HTTP promet na HTTPS u Nginxu

Dodajte sljedeći red u prvi blok servera:

return 301 https://$server_name$request_uri;

Gornja direktiva će vratiti 301 (Trajno premješten) odgovor, koji se koristi za trajno preusmjeravanje URL-a kad god se uputi zahtjev na port 80 vašeg virtuelnog hosta, i preusmjerit će zahtjev na blok servera koji dodano u prethodnom savjetu.

Slika ispod prikazuje preusmjeravanje i potvrđuje činjenicu da koristimo TLS 1.2 i AES-256 za enkripciju:

Sažetak

U ovom članku podijelili smo nekoliko savjeta za osiguranje vašeg Nginx web servera. Voljeli bismo čuti što mislite i, ako imate druge savjete koje biste željeli podijeliti sa ostatkom zajednice, slobodno nam to javite tako što ćete nam poslati bilješku koristeći formular za komentare ispod.