GNU/Linux >> Tutoriales Linux >  >> Linux

Consejos y trucos para asegurar su servidor web Nginx

Nginx es un servidor web de código abierto, liviano y de alto rendimiento que tiene el crecimiento más rápido en todo el mundo. Nginx se ejecuta en los sistemas operativos Linux, Windows, Mac OS y Solaris. NGINX continúa aumentando en popularidad, lo que significa que cada vez más implementaciones de NGINX deben protegerse.

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

Requisitos

  • Un servidor con Ubuntu 18.04 o Debian 9.
  • Se configura una contraseña raíz en su servidor.

Instalar Nginx

Primero, deberá instalar Nginx en su sistema. Puede instalarlo ejecutando el siguiente comando:

apt-get install nginx -y

Una vez que se haya instalado Nginx, puede verificar el estado de Nginx con el siguiente comando:

systemctl status nginx

Debería ver el siguiente resultado:

? 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

Deberá actualizar su servidor web Nginx, ya que se están agregando muchas mejoras de rendimiento, nuevas funciones y correcciones de seguridad. La mayoría de las distribuciones modernas de Linux no incluirán la última versión de nginx en sus listas de paquetes predeterminadas. Por lo tanto, deberá actualizar la última versión de nginx a través de un administrador de paquetes. Puede actualizar su servidor web Nginx con el siguiente comando:

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

Evitar la divulgación de información

Primero, deberá evitar que Nginx revele su información de versión.

De forma predeterminada, Nginx muestra su nombre y versión en los encabezados HTTP.

Puedes comprobarlo con el siguiente comando:

curl -I http://localhost

Debería ver el siguiente resultado:

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 el resultado anterior, debería ver la versión de Nginx y del sistema operativo.

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

nano /etc/nginx/nginx.conf

Agregue server_tokens fuera de línea dentro de la parte de configuración http:

http {

        ##
        # Basic Settings
        ##
        server_tokens off;

Guarde y cierre el archivo cuando haya terminado. Luego, reinicie el servidor web Nginx para aplicar los cambios:

systemctl restart nginx

Ahora, ejecuta el comando curl de nuevo:

curl -I http://localhost

Debería ver el siguiente resultado:

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 desea permitir el formulario Nginx 172.16.0.0/16 y denegar desde otras subredes. Luego, abra el archivo /etc/nginx/sites-enabled/default:

nano /etc/nginx/sites-enabled/default

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

Guarde y cierre el archivo cuando haya terminado. Luego, reinicie Nginx para aplicar estos cambios:

systemctl restart nginx

Ahora, intente acceder a su servidor Nginx desde otro rango de direcciones IP como 192.168.0.102.

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

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

Debería tener acceso prohibido en el siguiente resultado:

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 más eficiente y contiene más mejoras como Forward Secrecy, compatibilidad con conjuntos de cifrado OpenSSL modernos y HSTS. Este tutorial muestra cómo habilitar un certificado SSL autofirmado en Nginx. Si desea utilizar un certificado de let's Encrypt, eche un vistazo aquí: https://www.howtoforge.com/tutorial/nginx-with-letsencrypt-ciphersuite/

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

mkdir /etc/nginx/ssl/

A continuación, genere 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ía ver el siguiente resultado:

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:

Luego, genera csr con el siguiente comando:

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

Proporcione 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:
[email protected]:~# 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, firme el certificado con el siguiente comando:

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

Debería ver el siguiente resultado:

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, abra el archivo de host virtual predeterminado de Nginx y defina el certificado:

nano /etc/nginx/sites-enabled/default

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

Guarde y cierre el archivo cuando haya terminado. Luego, reinicie el servidor Nginx para aplicar estos cambios:

systemctl restart nginx

Proteger el directorio con contraseña

Al configurar un servidor web Nginx, también puede proteger un directorio específico con una contraseña. Puede hacer esto usando el archivo .htpasswd.

Para hacerlo, cree el archivo passwd y agregue el usuario con el siguiente comando:

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

Debería ver el siguiente resultado:

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

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

mkdir /var/www/html/test

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

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

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

nano /etc/nginx/sites-enabled/default

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

        location /test {

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

Guarde y cierre el archivo cuando haya terminado. Luego, reinicie el servicio Nginx para aplicar estos cambios:

systemctl restart nginx

A continuación, abra su navegador web y escriba la URL http://your-server-ip/test. Se le pedirá que ingrese el nombre de usuario y la contraseña para acceder al directorio de prueba como se muestra en la siguiente página:

¡Felicidades! Ha asegurado con éxito su servidor Nginx en el servidor Ubuntu 18.04. Espero que esto lo ayude a proteger su aplicación alojada en el servidor web Nginx. No dude en preguntarme si tiene alguna pregunta. Para obtener más información, puede consultar el documento de seguridad de Nginx.


Linux
  1. ¿Qué es un servidor web y cómo funciona un servidor web?

  2. Cómo instalar el servidor web Nginx en Linux

  3. LAMP vs. LEMP:consejos para elegir Apache o nginx para su servidor web

  4. 10 consejos para proteger su servidor web Apache en UNIX/Linux

  5. Consejos y trucos de rsync favoritos

Proteja su servidor web Apache Mejores prácticas

10 consejos prácticos de fortalecimiento de SSH para proteger su servidor Linux

Cómo agregar compatibilidad con PHP-FPM en el servidor web Apache y Nginx en Ubuntu 18.04

Instale y configure Varnish Cache con Nginx Web Server en Ubuntu 18.04

Cómo ocultar la versión de su servidor NGINX.

Descubra CyberPanel e instálelo para controlar su servidor web