La guia definitiva per assegurar, endurir i millorar el rendiment del servidor web Nginx
A partir de les coses meravelloses que heu sentit sobre Nginx, potser heu decidit provar-ho. Potser t'ha agradat tant que estàs considerant substituir les teves instal·lacions d'Apache per Nginx després de revisar alguns dels articles sobre el tema que hem publicat en aquest lloc.
Si és així, estic segur que donareu la benvinguda a aquesta guia amb els braços oberts, ja que explicarem 12 consells per augmentar la seguretat dels vostres servidors Nginx (des de mantenir Nginx actualitzat fins a utilitzar TLS i redirigir HTTP a HTTPS), i notareu que alguns d'ells són molt semblants al que farieu amb Apache.
No et perdis:
Utilitzarem el següent entorn en aquesta guia:
- Debian GNU/Linux 8.1 (jessie).
- Adreça IP: 192.168.0.25 (tecmintlovesnginx.com) i 192.168.0.26 (nginxmeanspower.com), tal com es descriu a la secció d'amfitrions virtuals basats en IP a
- Com configurar amfitrions virtuals basats en noms i IP (blocs de servidor) amb Nginx
Tenint això en compte, comencem.
CONSELL #1: mantingueu Nginx al dia
En el moment d'escriure aquest article, les últimes versions de Nginx als repositoris CentOS (a EPEL) i Debian són 1.6.3 i 1.6.2-5, respectivament.
Tot i que instal·lar programari des dels dipòsits és més fàcil que compilar el programa des del codi font, aquesta darrera opció té dos avantatges: 1) permet crear mòduls addicionals a Nginx (com ara mod_security) i 2) sempre proporcionarà una versió més nova. que els dipòsits (1.9.9 des d'avui). Les notes de llançament sempre estan disponibles al lloc web de Nginx.
No et perdis:
CONSELL #2: elimineu els mòduls innecessaris a Nginx
Per eliminar de manera explícita mòduls de Nginx mentre instal·leu des de la font, feu el següent:
# ./configure --without-module1 --without-module2 --without-module3
Per exemple:
# ./configure --without-http_dav_module --withouthttp_spdy_module
Com probablement endevinareu, eliminar mòduls d'una instal·lació anterior de Nginx de la font requereix tornar a realitzar la compilació.
Una paraula de precaució: les directives de configuració les proporcionen els mòduls. Assegureu-vos de no desactivar un mòdul que contingui una directiva que necessitareu més endavant! Hauríeu de consultar els documents de nginx per obtenir la llista de directives disponibles a cada mòdul abans de prendre una decisió sobre la desactivació dels mòduls.
CONSELL #3: Desactiveu la directiva server_tokens a Nginx
La directiva
server_tokens
diu a Nginx que mostri la seva versió actual a les pàgines d'error. Això no és desitjable, ja que no voleu compartir aquesta informació amb el món per tal d'evitar atacs al vostre servidor web causats per vulnerabilitats conegudes en aquesta versió específica.Per desactivar la directiva
server_tokens
, configureu si està desactivada dins d'un bloc de servidor: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; }
Reinicieu nginx i verifiqueu els canvis:
CONSELL #4: denegueu els agents d'usuari HTTP a Nginx
Un agent d'usuari HTTP és un programari que s'utilitza per a la negociació de contingut contra un servidor web. Això també inclou robots i rastrejadors de programari maliciós que poden acabar afectant el rendiment del vostre servidor web malgastant els recursos del sistema.
Per tal de mantenir més fàcilment la llista d'agents d'usuari no desitjats, creeu un fitxer (
/etc/nginx/blockuseragents.rules
per exemple) amb el contingut següent:map $http_user_agent $blockedagent { default 0; ~*malicious 1; ~*bot 1; ~*backdoor 1; ~*crawler 1; ~*bandit 1; }
A continuació, col·loqueu la línia següent abans de la definició del bloc del servidor:
include /etc/nginx/blockuseragents.rules;
I una instrucció if per retornar una resposta 403 si la cadena de l'agent d'usuari es troba a la llista negra definida anteriorment:
Reinicieu nginx i es bloquejarà l'accés al vostre servidor web a tots els agents d'usuari la cadena dels quals coincideixi amb l'anterior. Substituïu 192.168.0.25 per la IP del vostre servidor i no dubteu a triar una cadena diferent per al commutador
--user-agent
de wget:# wget http://192.168.0.25/index.html # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html
CONSELL #5: desactiveu els mètodes HTTP no desitjats a Nginx
També coneguts com a verbs, els mètodes HTTP indiquen l'acció desitjada que s'ha de dur a terme en un recurs servit per Nginx. Per a llocs web i aplicacions habituals, només hauríeu de permetre GET, POST i HEAD i desactivar tots els altres.
Per fer-ho, col·loqueu les línies següents dins d'un bloc de servidor. Una resposta HTTP 444 significa una resposta buida i s'utilitza sovint a Nginx per enganyar els atacs de programari maliciós:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; }
Per provar, utilitzeu curl per enviar una sol·licitud DELETE i compareu la sortida amb quan envieu un GET normal:
# curl -X DELETE http://192.168.0.25/index.html # curl -X POST http://192.168.0.25/index.html
CONSELL núm. 6: estableixi les limitacions de la mida del buffer a Nginx
Per evitar atacs de desbordament de memòria intermèdia contra el vostre servidor web Nginx, configureu les directives següents en un fitxer separat (creeu un fitxer nou anomenat
/etc/nginx/conf.d/buffer.conf
, per exemple):client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k;
Les directrius anteriors garantiran que les sol·licituds fetes al vostre servidor web no provoquin un desbordament de memòria intermèdia al vostre sistema. Una vegada més, consulteu els documents per obtenir més detalls sobre què fa cadascun d'ells.
A continuació, afegiu una directiva d'inclusió al fitxer de configuració:
include /etc/nginx/conf.d/*.conf;
CONSELL #7: Limiteu el nombre de connexions per IP a Nginx
Per limitar les connexions per IP, utilitzeu les directives
limit_conn_zone
(en un context http o almenys fora del bloc del servidor) i limit_conn (en un http, bloc de servidor o context d'ubicació).Tanmateix, tingueu en compte que no es compten totes les connexions, sinó només aquelles que tenen una sol·licitud processada pel servidor i s'ha llegit tota la seva capçalera de sol·licitud.
Per exemple, establim el nombre màxim de connexions a
1
(sí, és una exageració, però en aquest cas farà la feina bé) en una zona anomenada addr (podeu establir-ho com sigui. nom que desitgeu):limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 1;
Una prova senzilla amb Apache Benchmark (Realitza Nginx Load) on es fan
10
connexions totals amb2
sol·licituds simultànies ens ajudarà a demostrar el nostre punt:# ab -n 10 -c 2 http://192.168.0.25/index.html
Consulteu el següent consell per obtenir més detalls.
CONSELL #8: configureu els registres del monitor per a Nginx
Un cop hàgiu realitzat la prova descrita al consell anterior, comproveu el registre d'errors definit per al bloc del servidor:
És possible que vulgueu utilitzar grep per filtrar els registres de les sol·licituds fallides fetes a la zona d'adreça definida a la TIP #7:
# grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
Així mateix, podeu filtrar el registre d'accés per informació d'interès, com ara:
- IP del client
- Tipus de navegador
- Tipus de sol·licitud HTTP
- Recurs sol·licitat
- El bloqueig del servidor respon a la sol·licitud (útil si diversos hosts virtuals estan iniciant sessió al mateix fitxer).
I preneu les mesures oportunes si detecteu alguna activitat inusual o no desitjada.
CONSELL núm. 9: eviteu l'enllaç directe d'imatges a Nginx
L'enllaç directe d'imatges es produeix quan una persona mostra en un altre lloc una imatge allotjada al vostre. Això provoca un augment de l'ús de l'ample de banda (que pagueu) mentre que l'altra persona mostra feliçment la imatge com si fos propietat seva. En altres paraules, és una doble pèrdua per a tu.
Per exemple, suposem que teniu un subdirectori anomenat
img
dins del vostre bloc de servidors on deseu totes les imatges utilitzades en aquest host virtual. Per evitar que altres llocs utilitzin les vostres imatges, haureu d'inserir el bloc d'ubicació següent dins de la vostra definició d'amfitrió virtual:location /img/ { valid_referers none blocked 192.168.0.25; if ($invalid_referer) { return 403; } }
A continuació, modifiqueu el fitxer
index.html
a cada host virtual de la manera següent:Ara navegueu per cada lloc i, com podeu veure, la imatge es mostra correctament a 192.168.0.25 però es substitueix per una resposta 403 a 192.168.0.26:
Tingueu en compte que aquest consell depèn del navegador remot que envia el camp de referència.
CONSELL #10: desactiveu SSL i només activeu TLS a Nginx
Sempre que sigui possible, feu el que sigui necessari per evitar SSL en qualsevol de les seves versions i utilitzeu TLS. Els següents
ssl_protocols
s'han de col·locar en un context de servidor o http al fitxer d'amfitrió virtual o és un fitxer separat mitjançant una directiva d'inclusió (algunes persones utilitzen un fitxer anomenatssl.conf
). , però depèn completament de tu):ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Per exemple:
CONSELL #11: creeu certificats a Nginx
En primer lloc, genereu una clau i un certificat. No dubteu a utilitzar un tipus de xifratge diferent si voleu:
# 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
A continuació, afegiu les línies següents dins d'un bloc de servidor separat per preparar el següent consell (redirecció
http --> https
) i també moveu les directives relacionades amb SSL al bloc nou: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; }
Al següent consell, comprovarem com el nostre lloc utilitza ara un certificat i un TLS autofirmats.
CONSELL #12: redirigeix el trànsit HTTP a HTTPS a Nginx
Afegiu la línia següent al primer bloc de servidor:
return 301 https://$server_name$request_uri;
La directiva anterior retornarà una resposta 301 (Mogut permanentment), que s'utilitza per a la redirecció d'URL permanent cada vegada que es fa una sol·licitud al port 80 del vostre amfitrió virtual, i redirigirà la sol·licitud al bloc del servidor que hem afegit al consell anterior.
La imatge següent mostra la redirecció i confirma el fet que estem utilitzant TLS 1.2 i AES-256 per al xifratge:
Resum
En aquest article hem compartit alguns consells per protegir el vostre servidor web Nginx. Ens encantaria saber què en penseu i, si teniu altres consells que us agradaria compartir amb la resta de la comunitat, no dubteu a fer-nos-ho saber enviant-nos una nota mitjançant el formulari de comentaris a continuació.