Proteger directorio o sitio web usando usuario y contraseña con NGinx

Escrito por systeminside en y tuvo 0 comentarios
Nginx Password

Supongamos que en nuestro servidor tenemos dos sitios web, uno el que está de cara al público, y una copia exacta para probar nuevas funcionalidades o simplemente como entorno de desarrollo. Supongamos que no queremos que nadie acceda a esa subdominio (si descubrieran cual es la url completa).. ¿Cómo hacemos para proteger dicho directorio si estamos usando NGinx?

¿Cómo establecer contraseñas para un directorio en NGinx?

Para ello nos vamos a servir de una utilidad de Apache. Abrimos el terminal y escribimos:

$ sudo apt-get install apache2-utils

Esto lo instalamos para usar el comando htpasswd, lo cual nos permitirá añadir usuarios y contraseñas encriptados de la siguiente forma:

$ sudo htpasswd -c /etc/nginx/.htpasswd usuario

Al ejecutar ese comando no pide la contraseña un par de veces:

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

Y si vamos al fichero /etc/nginx/.htpasswd, nos encontraremos algo como esto:

usuario:$apr1$vLNYdMUq$dRxqhRCfMbkX0l1jvSEb8/

Ahora bien, digamos que este es el fichero de configuración de NGinx que tenemos para el sitio de pruebas:

server {
        #listen 80 default_server;
        #listen [::]:80 default_server ipv6only=off;

        root /usr/share/nginx/html/dev;
        index index.html index.htm;

        server_name dev.systeminside.net;

        access_log /var/log/nginx/dev_access.log;
        error_log /var/log/nginx/dev_error.log;

        location / {
                try_files $uri $uri/ =404;
        }

        # Denegar el acceso a archivos como .htaccess, .htpasswd, .DS_Store (Mac).
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }
        
}

Lo que tenemos que modificar es el location de la raíz, dejándolo de esta forma:

    location / {
                try_files $uri $uri/ =404;
                auth_basic "Restricted";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }

Nuestro fichero de configuración nos quedaría entonces de esta forma:

server {
        #listen 80 default_server;
        #listen [::]:80 default_server ipv6only=off;

        root /usr/share/nginx/html/dev;
        index index.html index.htm;

        server_name dev.systeminside.net;

        access_log /var/log/nginx/dev_access.log;
        error_log /var/log/nginx/dev_error.log;

        location / {
                try_files $uri $uri/ =404;
                auth_basic "Restricted";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }

        # Denegar el acceso a archivos como .htaccess, .htpasswd, .DS_Store (Mac).
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }
        
}

Ahora cuando intentemos acceder a nuestro sitio de pruebas nos saldrá algo como esto:

Nginx Password

Y si lo ponemos mal, pues ya saben, error! Fácil y rápido.

systeminside

systeminside

Blogger, Melómano, Administrador de Sistemas, Diseñador Web.

¿Ideas? ¿Comentarios?

¿...?