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:

  1. Debian GNU/Linux 8.1 (jessie).
  2. 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
    1. 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 amb 2 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:

    1. IP del client
    2. Tipus de navegador
    3. Tipus de sol·licitud HTTP
    4. Recurs sol·licitat
    5. 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 anomenat ssl.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ó.