Vyhledávání na webu

Dokonalý průvodce zabezpečením, zpevněním a zlepšením výkonu webového serveru Nginx


Na základě úžasných věcí, které jste o Nginx slyšeli, jste se možná rozhodli to zkusit. Možná se vám to líbilo natolik, že uvažujete o nahrazení vašich instalací Apache za Nginx poté, co jste si prošli některé články na toto téma, které jsme publikovali na tomto webu.

Pokud ano, jsem si jistý, že tuto příručku přivítáte s otevřenou náručí, protože se chystáme pokrýt 12 tipů pro zvýšení zabezpečení vašich serverů Nginx (od udržování aktuálního stavu Nginx až po pomocí TLS a přesměrování HTTP na HTTPS) a všimnete si, že některé z nich jsou velmi podobné tomu, co byste dělali s Apache.

Nepřehlédněte:

13 Tipy pro zabezpečení a posílení webového serveru Apache

25 triků Apache Htaccess pro zabezpečení webového serveru Apache

Testovací prostředí Nginx

V této příručce budeme používat následující prostředí:

  1. Debian GNU/Linux 8.1 (jessie).
  2. IP adresa: 192.168.0.25 (tecmintlovesnginx.com) a 192.168.0.26 (nginxmeanspower.com), jak je popsáno ve virtuálním sekce hostitelů na

    1. „Jak nastavit virtuální hostitele založené na názvech a IP (bloky serveru) pomocí Nginx“
  3. Verze Nginx: nginx/1.6.2.
  4. Pro vaše pohodlí je zde konečný konfigurační soubor (odkaz Pastebin).

S tímto vědomím začněme.

TIP #1: Udržujte Nginx aktuální

V době psaní tohoto článku jsou nejnovější verze Nginx v repozitářích CentOS (v EPEL) a Debianu 1.6.3 a 1.6.2-5 silný>, resp.

Nepřehlédněte: Nainstalujte nejnovější stabilní verzi Nginx z úložišť a zdroje

Ačkoli je instalace softwaru z repozitářů jednodušší než kompilace programu ze zdrojového kódu, tato poslední možnost má dvě výhody: 1) umožňuje zabudovat do Nginx další moduly (jako je mod_security) a 2) vždy poskytne novější verzi. než úložiště (1.9.9 k dnešnímu dni). Poznámky k vydání jsou vždy k dispozici na webu Nginx.

Nepřehlédněte:

Chraňte Apache před hrubou silou a útoky DDoS pomocí Mod_Security a Mod_Evasive

TIP #2: Odstraňte nepotřebné moduly v Nginx

Chcete-li explicitně odebrat moduly z Nginx při instalaci ze zdroje, postupujte takto:

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

Například:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Jak pravděpodobně uhodnete, odstranění modulů z předchozí instalace Nginx ze zdroje vyžaduje provedení kompilace znovu.

Upozornění: Konfigurační příkazy poskytují moduly. Ujistěte se, že nevypínáte modul, který obsahuje směrnici, kterou budete dále potřebovat! Než učiníte rozhodnutí o deaktivaci modulů, měli byste zkontrolovat dokumenty nginx pro seznam direktiv dostupných v každém modulu.

TIP #3: Zakažte směrnici server_tokens v Nginx

Direktiva server_tokens říká Nginxu, aby zobrazil svou aktuální verzi na chybových stránkách. To není žádoucí, protože tyto informace nechcete sdílet se světem, abyste zabránili útokům na váš webový server způsobeným známými zranitelnostmi v této konkrétní verzi.

Chcete-li zakázat direktivu server_tokens, nastavte, zda je v bloku serveru vypnuto:

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

Restartujte nginx a ověřte změny:

TIP #4: Odmítněte uživatelské agenty HTTP v Nginx

HTTP user agent je software, který se používá pro vyjednávání obsahu proti webovému serveru. Patří sem také malwarové roboty a prohledávače, které mohou mít dopad na výkon vašeho webového serveru plýtváním systémových prostředků.

Chcete-li snadněji udržovat seznam nežádoucích uživatelských agentů, vytvořte soubor (například /etc/nginx/blockuseragents.rules) s následujícím obsahem:

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

Dále umístěte následující řádek před definici bloku serveru:

include /etc/nginx/blockuseragents.rules;

A příkaz if, který vrátí odpověď 403, pokud je řetězec uživatelského agenta na černé listině definované výše:

Restartujte nginx a všem uživatelským agentům, jejichž řetězec odpovídá výše uvedenému, bude zablokován přístup k vašemu webovému serveru. Nahraďte 192.168.0.25 IP adresou svého serveru a pro přepínač --user-agent v wget si můžete vybrat jiný řetězec:

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

TIP #5: Zakažte nežádoucí metody HTTP v Nginx

Metody HTTP, známé také jako slovesa, označují požadovanou akci, která má být provedena se zdrojem obsluhovaným Nginxem. U běžných webových stránek a aplikací byste měli povolit pouze GET, POST a HEAD a všechny ostatní zakázat.

Chcete-li tak učinit, umístěte následující řádky do bloku serveru. Odpověď HTTP 444 znamená prázdnou odpověď a v Nginx se často používá k oklamání malwarových útoků:

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

Chcete-li otestovat, použijte curl k odeslání požadavku DELETE a porovnejte výstup s odesláním běžného GET:

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

TIP #6: Nastavte omezení velikosti vyrovnávací paměti v Nginx

Chcete-li zabránit útokům přetečení vyrovnávací paměti proti vašemu webovému serveru Nginx, nastavte následující direktivy v samostatném souboru (vytvořte například nový soubor s názvem /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;

Výše uvedené směrnice zajistí, že požadavky na váš webový server nezpůsobí přetečení vyrovnávací paměti ve vašem systému. Další podrobnosti o tom, co každý z nich dělá, naleznete v dokumentaci.

Poté přidejte direktivu include do konfiguračního souboru:

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

TIP #7: Omezte počet připojení podle IP v Nginx

Chcete-li omezit připojení pomocí IP, použijte direktivy limit_conn_zone (v kontextu http nebo alespoň mimo blok serveru) a limit_conn (v kontextu http, serverového bloku nebo umístění).

Mějte však na paměti, že se nezapočítávají všechna připojení – ale pouze ta, která mají požadavek zpracovaný serverem a byla načtena celá jeho hlavička požadavku.

Například nastavme maximální počet připojení na 1 (ano, je to přehnané, ale v tomto případě to bude fungovat v pohodě) v zóně s názvem addr (můžete to nastavit na cokoliv jméno jaké si přeješ):

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

Jednoduchý test s Apache Benchmark (Perform Nginx Load), kde se vytvoří celkem 10 spojení s 2 simultánními požadavky, nám pomůže demonstrovat náš názor:

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

Další podrobnosti najdete v dalším tipu.

TIP #8: Nastavte protokoly monitoru pro Nginx

Po provedení testu popsaného v předchozím tipu zkontrolujte protokol chyb definovaný pro blok serveru:

Možná budete chtít použít grep k filtrování protokolů pro neúspěšné požadavky odeslané do zóny addr definované v TIP #7:

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

Podobně můžete filtrovat přístupový protokol pro informace, které vás zajímají, jako například:

  1. IP klienta
  2. Typ prohlížeče
  3. Typ požadavku HTTP
  4. Požadovaný zdroj
  5. Server blokuje odpověď na požadavek (užitečné, pokud se několik virtuálních hostitelů přihlašuje ke stejnému souboru).

A podnikněte příslušná opatření, pokud zjistíte jakoukoli neobvyklou nebo nežádoucí aktivitu.

TIP #9: Zabraňte rychlému propojení obrázků v Nginx

Hotlinking obrázků nastane, když osoba zobrazí na jiném webu obrázek hostovaný na vašem webu. To způsobí zvýšení využití vaší šířky pásma (za které platíte), zatímco druhá osoba šťastně zobrazuje obrázek, jako by to byl její majetek. Jinými slovy, je to pro vás dvojnásobná ztráta.

Řekněme například, že máte v bloku serveru podadresář s názvem img, kam ukládáte všechny obrázky používané v tomto virtuálním hostiteli. Chcete-li jiným webům zabránit v používání vašich obrázků, budete muset do definice virtuálního hostitele vložit následující blok umístění:

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

Poté upravte soubor index.html v každém virtuálním hostiteli následovně:

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>

Nyní přejděte na každý web a jak vidíte, obrázek se správně zobrazuje v 192.168.0.25, ale je nahrazen odpovědí 403 v 192.168.0.26 silný>:

Upozorňujeme, že tento tip závisí na vzdáleném prohlížeči, který odešle pole Referer.

TIP #10: Vypněte SSL a povolte pouze TLS v Nginx

Kdykoli je to možné, udělejte vše pro to, abyste se vyhnuli SSL v jakékoli z jeho verzí a místo toho používejte TLS. Následující ssl_protocols by měly být umístěny v kontextu serveru nebo http ve vašem souboru virtuálního hostitele nebo se jedná o samostatný soubor prostřednictvím direktivy include (někteří lidé používají soubor s názvem ssl.conf , ale je to čistě na vás):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Například:

TIP #11: Vytvořte certifikáty v Nginx

Nejprve vygenerujte klíč a certifikát. Pokud chcete, můžete použít jiný typ šifrování:

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

Poté přidejte následující řádky do samostatného bloku serveru jako přípravu na další tip (přesměrování http --> https) a přesuňte také direktivy související s SSL do nového bloku:

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

V dalším tipu si ověříme, jak náš web nyní používá vlastnoručně podepsaný certifikát a TLS.

TIP #12: Přesměrujte provoz HTTP na HTTPS v Nginx

Přidejte následující řádek do prvního bloku serveru:

return 301 https://$server_name$request_uri;

Výše uvedená direktiva vrátí odpověď 301 (Trvale přesunuta), která se používá pro trvalé přesměrování adresy URL vždy, když je požadavek na port 80 vašeho virtuálního hostitele, a přesměruje požadavek na blok serveru, který přidáno v předchozím tipu.

Obrázek níže ukazuje přesměrování a potvrzuje skutečnost, že pro šifrování používáme TLS 1.2 a AES-256:

souhrn

V tomto článku jsme sdíleli několik tipů, jak zabezpečit váš webový server Nginx. Rádi bychom slyšeli, co si myslíte, a pokud máte další tipy, o které byste se chtěli podělit se zbytkem komunity, neváhejte nám dát vědět zasláním poznámky pomocí formuláře pro komentáře níže.