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:
- Debian GNU/Linux 8.1 (jessie).
-
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
- „Kako podesiti virtuelne hostove zasnovane na imenu i IP-u (blokove servera) sa Nginxom“
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:
- IP klijenta
- Tip pretraživača
- Vrsta HTTP zahtjeva
- Zatražen resurs
- 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.