Vrhunski vodič za osiguranje, jačanje i poboljšanje performansi Nginx web poslužitelja


Na temelju divnih stvari koje ste čuli o Nginxu, možda ste ga odlučili isprobati. Možda vam se toliko svidio da razmišljate o zamjeni svojih Apache instalacija s Nginxom nakon što ste prošli kroz neke od članaka na tu temu koje smo objavili na ovoj stranici.

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

Ne propustite:

13 Savjeti za sigurnost i jačanje web poslužitelja Apache

25 Apache Htaccess trikova za sigurnost Apache web poslužitelja

Okruženje za testiranje Nginxa

U ovom ćemo vodiču 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 virtualnom IP-u odjeljak za domaćine na

    1. “Kako postaviti virtualne hostove temeljene na imenu i IP-u (blokove poslužitelja) s Nginxom”
  3. Verzija Nginx-a: 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žuriranim

U vrijeme pisanja ovog teksta, najnovije verzije Nginxa u repozitoriju CentOS (u EPEL) i Debianu su 1.6.3 i 1.6.2-5 jak>, odnosno.

Ne propustite: Instalirajte najnoviju stabilnu verziju Nginxa iz spremišta i izvora

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

Ne propustite:

Zaštitite Apache od Brute Force i DDoS napada koristeći Mod_Security i Mod_Evasive

SAVJET #2: Uklonite nepotrebne module u Nginxu

Za eksplicitno uklanjanje modula iz Nginxa tijekom instalacije iz izvora, učinite:

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

Na primjer:

./configure  --without-http_dav_module --withouthttp_spdy_module 

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

Riječ opreza: upute za konfiguraciju daju moduli. Pazite da ne onemogućite modul koji sadrži direktivu koja će vam trebati na putu! Trebali biste provjeriti nginx dokumente za popis direktiva dostupnih u svakom modulu prije donošenja odluke o onemogućavanju modula.

SAVJET #3: Onemogućite direktivu server_tokens u Nginxu

Direktiva server_tokens govori Nginxu da prikaže svoju trenutnu verziju na stranicama s pogreškama. Ovo nije poželjno jer ne želite dijeliti te informacije sa svijetom kako biste spriječili napade na vaš web poslužitelj uzrokovane poznatim propustima u toj specifičnoj verziji.

Da biste onemogućili direktivu server_tokens, postavite if na isključeno unutar bloka poslužitelja:

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

Ponovno 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 s web poslužiteljem. Ovo također uključuje zlonamjerne robote i alate za indeksiranje koji mogu na kraju utjecati na performanse vašeg web poslužitelja trošenjem resursa sustava.

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

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

Zatim postavite sljedeći red ispred definicije bloka poslužitelja:

include /etc/nginx/blockuseragents.rules;

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

Ponovno pokrenite nginx i svim korisničkim agentima čiji niz odgovara gore navedenom bit će blokiran pristup vašem web poslužitelju. Zamijenite 192.168.0.25 s IP-om vašeg poslužitelja i slobodno odaberite drugi niz za prekidač --user-agent za 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

Poznate i kao glagoli, HTTP metode ukazuju na željenu akciju koju treba poduzeti na resursu koji poslužuje Nginx. Za uobičajene web stranice i aplikacije trebali biste dopustiti samo GET, POST i HEAD i onemogućiti sve ostale.

Da biste to učinili, postavite sljedeće retke unutar bloka poslužitelja. HTTP odgovor 444 znači prazan odgovor i često se koristi u Nginxu za prevaru napada zlonamjernog softvera:

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

Za testiranje, upotrijebite curl za slanje zahtjeva DELETE i usporedite rezultat sa slanjem običnog 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 međuspremnika u Nginxu

Kako biste spriječili napade prekoračenja međuspremnika na vaš Nginx web poslužitelj, postavite sljedeće direktive u zasebnoj datoteci (stvorite novu datoteku pod nazivom /etc/nginx/conf.d/buffer.conf, na primjer):

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

Gore navedene upute će osigurati da zahtjevi upućeni vašem web poslužitelju neće izazvati prekoračenje međuspremnika u vašem sustavu. Još jednom pogledajte dokumente za dodatne pojedinosti o tome što svaki od njih radi.

Zatim dodajte direktivu uključivanja u konfiguracijsku datoteku:

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

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

Kako biste ograničili veze prema IP-u, upotrijebite direktive limit_conn_zone (u http kontekstu ili barem izvan bloka poslužitelja) i limit_conn (u http, bloku poslužitelja ili kontekstu lokacije).

Međutim, imajte na umu da se ne broje sve veze – već samo one koje imaju zahtjev koji je obradio poslužitelj i čije je cijelo zaglavlje zahtjeva pročitano.

Na primjer, postavimo maksimalan broj veza na 1 (da, to je pretjerivanje, ali će u ovom slučaju dobro obaviti posao) u zoni pod nazivom addr (ovo možete postaviti na bilo koju ime po želji):

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

Jednostavan test s Apache Benchmarkom (Izvrši Nginx učitavanje) gdje se 10 ukupnih veza uspostavlja s 2 istovremena zahtjeva pomoći će nam da pokažemo našu točku:

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

Pogledajte sljedeći savjet za dodatne pojedinosti.

SAVJET #8: Postavite zapisnike monitora za Nginx

Nakon što ste izvršili test opisan u prethodnom savjetu, provjerite zapisnik grešaka koji je definiran za blok poslužitelja:

Možda ćete htjeti koristiti grep za filtriranje zapisa 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. Vrsta preglednika
  3. Vrsta HTTP zahtjeva
  4. Zatraženi resursi
  5. Blok poslužitelja koji odgovara na zahtjev (korisno ako se nekoliko virtualnih računala prijavljuje na istu datoteku).

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

SAVJET #9: Spriječite hotlinking slike u Nginxu

Hotlinking slika događa se kada osoba na drugom mjestu prikaže sliku koja se nalazi na vašem. To uzrokuje povećanje vaše upotrebe propusnosti (koju plaćate), dok druga osoba radosno prikazuje sliku kao da je njezino vlasništvo. Drugim riječima, to je dvostruki gubitak za vas.

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

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

Zatim izmijenite datoteku index.html u svakom virtualnom 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 pregledajte 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 jak>:

Imajte na umu da ovaj savjet ovisi o udaljenom pregledniku koji šalje polje Referer.

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

Kad god je to moguće, učinite sve što je potrebno da biste izbjegli SSL u bilo kojoj od njegovih verzija i umjesto toga koristite TLS. Sljedeći ssl_protocols trebali bi biti postavljeni u poslužiteljski ili http kontekst u vašoj datoteci virtualnog hosta ili su to zasebne datoteke putem direktive uključivanja (neki ljudi koriste datoteku pod nazivom ssl.conf , ali to u potpunosti ovisi o vama):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Na primjer:

SAVJET #11: Izradite certifikate u Nginxu

Najprije generirajte ključ i certifikat. Slobodno upotrijebite 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 retke unutar zasebnog bloka poslužitelja kao pripremu za sljedeći savjet (http --> https preusmjeravanje) i također premjestite direktive koje se odnose na SSL 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 ćemo savjetu 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 poslužitelja:

return 301 https://$server_name$request_uri;

Gornja direktiva vratit će odgovor 301 (Trajno premješteno), koji se koristi za trajno preusmjeravanje URL-a kad god se podnese zahtjev na priključak 80 vašeg virtualnog hosta, te će preusmjeriti zahtjev na blok poslužitelja koji dodano u prethodnom savjetu.

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

Sažetak

U ovom smo članku podijelili nekoliko savjeta za zaštitu vašeg Nginx web poslužitelja. Voljeli bismo čuti što mislite i, ako imate druge savjete koje biste željeli podijeliti s ostatkom zajednice, slobodno nam to javite tako što ćete nam poslati poruku koristeći obrazac za komentare u nastavku.