Pagrindinis „Nginx“ tinklo serverio saugos, grūdinimo ir našumo vadovas
Remdamiesi nuostabiais dalykais, kuriuos girdėjote apie „Nginx“, galbūt nusprendėte pabandyti. Jums tai galėjo taip patikti, kad apsvarstysite galimybę pakeisti „Apache“ diegimą „Nginx“, peržiūrėję keletą straipsnių tema, kuriuos paskelbėme šioje svetainėje.
Jei taip, aš tikiu, kad šį vadovą sutiksite išskėstomis rankomis, nes pateiksime 12 patarimų, kaip padidinti jūsų „Nginx“ serverių saugumą (pradedant nuo „Nginx“ atnaujinimo iki TLS naudojimo ir HTTP nukreipimo į HTTPS), ir jūs pastebėsite, kad kai kurie iš jų yra labai panašūs į tai, ką darytumėte su „Apache“.
Nepraleiskite:
Šiame vadove naudosime šią aplinką:
- Debian GNU/Linux 8.1 (jessie).
- IP adresas: 192.168.0.25 (tecmintlovesnginx.com) ir 192.168.0.26 (nginxmeanspower.com), kaip aprašyta IP pagrįstų virtualiųjų kompiuterių skyriuje
- „Kaip nustatyti„ Nginx “vardais ir IP pagrįstus virtualius kompiuterius (serverių blokus)“
Turėdami tai omenyje, pradėkime.
1 PATARIMAS: Nginx atnaujinkite
Šio rašymo metu naujausios „Nginx“ versijos „CentOS“ (EPEL) ir „Debian“ saugyklose yra atitinkamai 1.6.3 ir 1.6.2-5.
Nors įdiegti programinę įrangą iš saugyklų yra paprasčiau nei sukompiliuoti programą iš šaltinio kodo, ši paskutinė galimybė turi du privalumus: 1) tai leidžia jums sukurti papildomus modulius į „Nginx“ (pvz., Mod_security) ir 2) visada pateiks naujesnę versiją nei saugyklos (šiandien 1.9.9). Išleidimo pastabas visada galima rasti „Nginx“ svetainėje.
Nepraleiskite:
2 PATARIMAS: pašalinkite nereikalingus „Nginx“ modulius
Norėdami aiškiai pašalinti modulius iš „Nginx“ diegdami iš šaltinio, atlikite šiuos veiksmus:
# ./configure --without-module1 --without-module2 --without-module3
Pavyzdžiui:
# ./configure --without-http_dav_module --withouthttp_spdy_module
Kaip tikriausiai atspėsite, norint pašalinti ankstesnio „Nginx“ diegimo modulius iš šaltinio reikia dar kartą atlikti kompiliavimą.
Atsargiai: konfigūracijos nurodymus pateikia moduliai. Įsitikinkite, kad neišjungėte modulio, kuriame yra direktyva, kurios jums reikės kelyje! Prieš priimdami sprendimą dėl modulių išjungimo, turėtumėte patikrinti, ar „nginx“ dokumentuose yra kiekviename modulyje galimų direktyvų sąrašas.
3 PATARIMAS: Išjunkite server_tokens direktyvą „Nginx“
server_tokens
direktyva nurodo „Nginx“ rodyti dabartinę versiją klaidų puslapiuose. Tai nėra pageidautina, nes jūs nenorite dalytis ta informacija su pasauliu, kad išvengtumėte atakų savo žiniatinklio serveryje, kurias sukelia žinomos tos konkrečios versijos spragos.Norėdami išjungti
server_tokens
direktyvą, nustatykite, ar ji išjungta serverio bloke: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; }
Iš naujo paleiskite „nginx“ ir patikrinkite pakeitimus:
4 PATARIMAS: atmesti HTTP vartotojo agentus „Nginx“
HTTP vartotojo agentas yra programinė įranga, naudojama derantis dėl turinio prieš žiniatinklio serverį. Tai taip pat apima kenkėjiškų programų robotus ir tikrintuvus, kurie gali švaistydami sistemos išteklius paveikti jūsų žiniatinklio serverio našumą.
Norėdami lengviau tvarkyti nepageidaujamų vartotojų agentų sąrašą, sukurkite failą (pvz.,
/etc/nginx/blockuseragents.rules
) su tokiu turiniu:map $http_user_agent $blockedagent { default 0; ~*malicious 1; ~*bot 1; ~*backdoor 1; ~*crawler 1; ~*bandit 1; }
Tada prieš serverio bloko apibrėžimą įdėkite šią eilutę:
include /etc/nginx/blockuseragents.rules;
Ir if sakinys grąžina atsakymą 403, jei vartotojo agento eilutė yra aukščiau apibrėžtame juodajame sąraše:
Paleiskite „nginx“ iš naujo, o visi vartotojų agentai, kurių eilutė atitinka aukščiau išvardytas eilutes, negalės pasiekti jūsų žiniatinklio serverio. Pakeiskite 192.168.0.25 serverio IP ir nedvejodami pasirinkite kitą eilutę wget jungikliui
--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
5 PATARIMAS: Išjunkite nepageidaujamus HTTP metodus „Nginx“
Taip pat žinomi kaip veiksmažodžiai, HTTP metodai nurodo norimą veiksmą, kurį reikia atlikti su „Nginx“ aptarnaujamu šaltiniu. Paprastose svetainėse ir programose turėtumėte leisti tik GET, POST ir HEAD bei išjungti visas kitas.
Norėdami tai padaryti, įdėkite šias eilutes į serverio bloką. 444 HTTP atsakymas reiškia tuščią atsakymą ir dažnai naudojamas „Nginx“, norint apgaudinėti kenkėjiškas programas
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; }
Norėdami išbandyti, naudokite „curl“, norėdami išsiųsti užklausą „DELETE“ ir palyginkite išvestį, kai siunčiate įprastą GET:
# curl -X DELETE http://192.168.0.25/index.html # curl -X POST http://192.168.0.25/index.html
6 PATARIMAS: nustatykite buferio dydžio apribojimus „Nginx“
Norėdami išvengti buferio perpildymo atakų prieš jūsų „Nginx“ žiniatinklio serverį, atskirame faile nustatykite šias direktyvas (pavyzdžiui, sukurkite naują failą pavadinimu
/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;
Aukščiau pateiktos direktyvos užtikrins, kad jūsų žiniatinklio serveriui pateiktos užklausos nesukeltų buferio perpildymo jūsų sistemoje. Dar kartą ieškokite dokumentuose, kad gautumėte daugiau informacijos apie tai, ką jie daro.
Tada pridėkite įtraukimo direktyvą į konfigūracijos failą:
include /etc/nginx/conf.d/*.conf;
7 PATARIMAS: Apribokite „IP“ jungčių skaičių „Nginx“
Norėdami apriboti ryšius pagal IP, naudokite
limit_conn_zone
(http kontekste arba bent jau už serverio bloko ribų) ir limit_conn (http, serverio bloko ar vietos kontekste) direktyvas.Tačiau nepamirškite, kad ne visi ryšiai yra skaičiuojami, bet buvo perskaityti tik tie, kurie turi serverio apdorotą užklausą ir visą jos užklausos antraštę.
Pvz., Nustatykime maksimalų jungčių skaičių į
1
(taip, tai yra perdėjimas, bet šiuo atveju jis puikiai atliks darbą) zonoje, pavadintoje addr (galite nustatyti bet ką norimas vardas):limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 1;
Paprastas bandymas su „Apache Benchmark“ („Atlikite Nginx įkrovą“), kai
10
bendras ryšys užmegztas kartu su2
užklausomis, padės mums parodyti savo mintį:# ab -n 10 -c 2 http://192.168.0.25/index.html
Daugiau informacijos rasite kitame patarime.
PATARIMAS # 8: „Nginx“ sąrankos stebėjimo žurnalų sąranka
Atlikę bandymą, aprašytą ankstesniame patarime, patikrinkite klaidų žurnalą, apibrėžtą serverio blokui:
Galite naudoti „grep“, jei norite filtruoti nepavykusių užklausų, pateiktų į ADR zoną, apibrėžtą TIP # 7, žurnalus:
# grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
Taip pat galite filtruoti prieigos žurnalą, kad rastumėte dominančios informacijos, tokios kaip:
- kliento IP
- Naršyklės tipas
- HTTP užklausos tipas
- Prašoma išteklių
- Serverio blokas atsakant į užklausą (naudinga, jei keli virtualūs pagrindiniai kompiuteriai prisijungia prie to paties failo).
Atlikite atitinkamus veiksmus, jei aptiksite neįprastą ar nepageidaujamą veiklą.
PATARIMAS Nr. 9: Užkirsti kelią „Hot Hotlinking“ sistemoje „Nginx“
Vaizdo susiejimas įvyksta, kai asmuo kitoje svetainėje rodo jūsų priglobtą vaizdą. Dėl to padidėja pralaidumo naudojimas (už kurį mokate), o kitas žmogus su džiaugsmu rodo vaizdą taip, lyg tai būtų jo nuosavybė. Kitaip tariant, jums tai yra dviguba netektis.
Tarkime, kad serverio bloke turite pakatalogį pavadinimu
img
, kuriame saugote visus vaizdus, naudojamus tame virtualiame priegloboje. Norėdami neleisti kitoms svetainėms naudoti jūsų atvaizdų, turėsite įterpti šį vietos bloką į savo virtualiosios prieglobos apibrėžimą:location /img/ { valid_referers none blocked 192.168.0.25; if ($invalid_referer) { return 403; } }
Tada pakeiskite failą
index.html
kiekviename virtualiame pagrindiniame kompiuteryje taip:Dabar naršykite po kiekvieną svetainę ir, kaip matote, vaizdas teisingai rodomas 192.168.0.25, bet pakeistas 403 atsakymu 192.168.0.26:
Atminkite, kad šis patarimas priklauso nuo nuotolinės naršyklės, siunčiančios lauką „Referer“.
PATARIMAS Nr. 10: Išjunkite SSL ir įgalinkite TLS tik „Nginx“
Kai tik įmanoma, darykite viską, ko reikia, kad išvengtumėte SSL bet kurioje savo versijoje, ir naudokite TLS. Šie
ssl_protocols
turėtų būti dedami į serverio ar http kontekstą jūsų virtualaus pagrindinio failo faile arba yra atskiras failas pagal direktyvą „įtraukti“ (kai kurie žmonės naudoja failą pavadinimussl.conf
, bet tai priklauso tik nuo jūsų):ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Pavyzdžiui:
PATARIMAS Nr. 11: sukurkite sertifikatus „Nginx“
Pirmiausia sugeneruokite raktą ir sertifikatą. Jei norite, nedvejodami naudokite kito tipo šifravimą:
# 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
Tada įdėkite šias eilutes į atskirą serverio bloką, ruošdamiesi kitam patarimui (
http -> https
nukreipimas) ir perkelkite su SSL susijusias direktyvas į naują 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; }
Kitame patarime mes patikrinsime, kaip mūsų svetainė dabar naudoja savarankiškai pasirašytą sertifikatą ir TLS.
PATARIMAS Nr. 12: nukreipkite HTTP srautą į „HTTPS“ sistemoje „Nginx“
Prie pirmojo serverio bloko pridėkite šią eilutę:
return 301 https://$server_name$request_uri;
Pirmiau nurodyta direktyva grąžins atsakymą 301 (perkeltas visam laikui), kuris naudojamas nuolatiniam URL peradresavimui, kai tik pateikiama užklausa jūsų virtualaus pagrindinio kompiuterio 80 prievadui, ir peradresuos užklausą į serverio bloką, kurį pridėjome ankstesniame patarime.
Žemiau pateiktame paveikslėlyje parodytas peradresavimas ir patvirtinama, kad šifravimui naudojame TLS 1.2 ir AES-256:
Santrauka
Šiame straipsnyje mes pasidalijome keliais patarimais, kaip apsaugoti jūsų „Nginx“ žiniatinklio serverį. Mes norėtume išgirsti, ką jūs galvojate, ir, jei turite kitų patarimų, kuriais norėtumėte pasidalinti su likusia bendruomene, nedvejodami praneškite mums, atsiųsdami mums pastabą naudodami toliau pateiktą komentaro formą.