Seguridad Nginx · 7 min read · Jan 24, 2026

Consejos y trucos para asegurar tu servidor web Nginx

Nginx es un servidor web de código abierto, ligero y de alto rendimiento, el que más rápido está creciendo en todo el mundo. Nginx funciona en sistemas operativos Linux, Windows, Mac OS y Solaris. NGINX sigue aumentando en popularidad, lo que significa que cada vez más implementaciones de NGINX necesitan ser aseguradas.

En este tutorial, explicaremos algunos consejos y trucos populares de seguridad para el servidor Nginx.

Requisitos

  • Un servidor que ejecute Ubuntu 18.04 o Debian 9.
  • Una contraseña de root configurada en tu servidor.

Instalar Nginx

Primero, necesitarás instalar Nginx en tu sistema. Puedes instalarlo ejecutando el siguiente comando:

apt-get install nginx -y

Una vez que Nginx haya sido instalado, puedes verificar el estado de Nginx con el siguiente comando:

systemctl status nginx

Deberías ver la siguiente salida:

? nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2019-03-10 02:43:14 UTC; 4min 40s ago
     Docs: man:nginx(8)
  Process: 2271 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 2281 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 2274 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 2285 (nginx)
    Tasks: 2 (limit: 1111)
   CGroup: /system.slice/nginx.service
           ??2285 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ??2290 nginx: worker process

Mar 10 02:43:14 ubuntu1804 systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 10 02:43:14 ubuntu1804 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Mar 10 02:43:14 ubuntu1804 systemd[1]: Started A high performance web server and a reverse proxy server.

Actualizar Nginx

Necesitarás actualizar tu servidor web Nginx ya que se están añadiendo muchas mejoras de rendimiento, nuevas características y correcciones de seguridad. La mayoría de las distribuciones modernas de Linux no vendrán con la última versión de nginx en sus listas de paquetes predeterminadas. Así que necesitarás actualizar a la última versión de nginx a través de un gestor de paquetes. Puedes actualizar tu servidor web Nginx con el siguiente comando:

apt-get update -y  
apt-get install nginx --reinstall -y

Prevenir la divulgación de información

Primero, necesitarás evitar que Nginx divulgue su información de versión.

Por defecto, Nginx muestra su nombre y versión en los encabezados HTTP.

Puedes comprobarlo con el siguiente comando:

curl -I http://localhost

Deberías ver la siguiente salida:

HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 09 Mar 2019 15:28:01 GMT
Content-Type: text/html
Content-Length: 10918
Last-Modified: Fri, 01 Feb 2019 16:05:17 GMT
Connection: keep-alive
ETag: "5c546e3d-2aa6"
Accept-Ranges: bytes

En la salida anterior, deberías ver la versión de Nginx y del sistema operativo.

Puedes ocultar esta información editando el archivo /etc/nginx/nginx.conf:

nano /etc/nginx/nginx.conf

Agrega la línea server_tokens off dentro de la parte de configuración http:

http {

        ##
        # Basic Settings
        ##
        server_tokens off;

Guarda y cierra el archivo cuando hayas terminado. Luego, reinicia el servidor web Nginx para aplicar los cambios:

systemctl restart nginx

Ahora, ejecuta el comando curl nuevamente:

curl -I http://localhost

Deberías ver la siguiente salida:

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 09 Mar 2019 15:33:31 GMT
Content-Type: text/html
Content-Length: 10918
Last-Modified: Fri, 01 Feb 2019 16:05:17 GMT
Connection: keep-alive
ETag: "5c546e3d-2aa6"
Accept-Ranges: bytes

Restringir las IPs del acceso

Nginx viene con un módulo simple llamado ngx_http_access_module para permitir o denegar una dirección IP específica.

Si deseas permitir Nginx desde 172.16.0.0/16 y denegar desde otras subredes. Entonces, abre el archivo /etc/nginx/sites-enabled/default:

nano /etc/nginx/sites-enabled/default

Realiza los siguientes cambios dentro del bloque del servidor:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

    allow 172.16.0.0/16;
    deny  all;

Guarda y cierra el archivo cuando hayas terminado. Luego, reinicia Nginx para aplicar estos cambios:

systemctl restart nginx

Ahora, intenta acceder a tu servidor Nginx desde otro rango de dirección IP como 192.168.0.102.

A continuación, verifica el registro de Nginx con el siguiente comando:

tail -f /var/log/nginx/error.log

Deberías obtener acceso prohibido en la siguiente salida:

2019/03/09 16:13:01 [error] 11589#11589: *1 access forbidden by rule, client: 192.168.0.102, server: _, request: "GET /test/ HTTP/1.1", host: "172.16.0.122"

Asegurar Nginx con TLS

TLS (Transport Layer Security) es el sucesor de SSL (Secure Socket Layer). Proporciona HTTPS más fuerte y eficiente y contiene más mejoras como la Secreto Perfecto, compatibilidad con suites de cifrado modernas de OpenSSL y HSTS. Este tutorial muestra cómo habilitar un certificado SSL autofirmado en Nginx. Si deseas usar un certificado de Let’s Encrypt en su lugar, consulta aquí: https://www.howtoforge.com/tutorial/nginx-with-letsencrypt-ciphersuite/

Primero, crea un directorio para SSL con el siguiente comando:

mkdir /etc/nginx/ssl/

A continuación, genera una clave y un certificado con el siguiente comando:

cd /etc/nginx/ssl/

Primero, genera la clave con el siguiente comando:

openssl genrsa -aes256 -out nginx.key 1024

Deberías ver la siguiente salida:

Generating RSA private key, 1024 bit long modulus
...++++++
.............................++++++
e is 65537 (0x010001)
Enter pass phrase for nginx.key:
Verifying - Enter pass phrase for nginx.key:

A continuación, genera el csr con el siguiente comando:

openssl req -new -key nginx.key -out nginx.csr

Proporciona toda la información como se muestra a continuación:

Generating RSA private key, 1024 bit long modulus
...++++++
.............................++++++
e is 65537 (0x010001)
Enter pass phrase for nginx.key:
Verifying - Enter pass phrase for nginx.key:
root@ubuntu1804:~# openssl req -new -key nginx.key -out nginx.csr
Enter pass phrase for nginx.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IN
State or Province Name (full name) [Some-State]:Gujarat
Locality Name (eg, city) []:Junagadh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IT
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:HITESH
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:admin
An optional company name []:IT

A continuación, firma el certificado con el siguiente comando:

openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt

Deberías ver la siguiente salida:

Signature ok
subject=C = IN, ST = Gujarat, L = Junagadh, O = IT, OU = IT, CN = HITESH, emailAddress = [email protected]
Getting Private key
Enter pass phrase for nginx.key:

A continuación, abre el archivo de host virtual predeterminado de Nginx y define el certificado:

nano /etc/nginx/sites-enabled/default

Realiza los siguientes cambios:

server {
        listen 192.168.0.100:443 ssl;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name _;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Guarda y cierra el archivo cuando hayas terminado. Luego, reinicia el servidor Nginx para aplicar estos cambios:

systemctl restart nginx

Proteger el directorio con contraseña

Al configurar un servidor web Nginx, también puedes proteger un directorio específico con una contraseña. Puedes hacerlo utilizando el archivo .htpasswd.

Para hacerlo, crea el archivo passwd y agrega el usuario con el siguiente comando:

mkdir /etc/nginx/.htpasswd  
htpasswd -c /etc/nginx/.htpasswd/passwd admin

Deberías ver la siguiente salida:

New password: 
Re-type new password: 
Adding password for user admin

A continuación, crea un directorio de prueba dentro de la raíz web de Nginx con el siguiente comando:

mkdir /var/www/html/test

A continuación, da la propiedad al usuario www-data con el siguiente comando:

chown -R www-data:www-data /var/www/html/test

A continuación, abre el archivo de host virtual predeterminado de Nginx con el siguiente comando:

nano /etc/nginx/sites-enabled/default

A continuación, protege el directorio de prueba como se muestra a continuación:

        location /test {

    auth_basic  "Restricted";
    auth_basic_user_file   /etc/nginx/.htpasswd/passwd;

Guarda y cierra el archivo cuando hayas terminado. Luego, reinicia el servicio Nginx para aplicar estos cambios:

systemctl restart nginx

A continuación, abre tu navegador web y escribe la URL http://your-server-ip/test. Se te pedirá que ingreses un nombre de usuario y una contraseña para acceder al directorio de prueba como se muestra en la siguiente página:

Nginx con autenticación básica http

¡Felicidades! Has asegurado con éxito tu servidor Nginx en el servidor Ubuntu 18.04. Espero que esto te ayude a proteger tu aplicación alojada en el servidor web Nginx. No dudes en preguntarme si tienes alguna pregunta. Para más información, puedes consultar el documento de seguridad de Nginx.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.