Proteger directorio o sitio web usando usuario y contraseña con NGinx
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?
Y si lo ponemos mal, pues ya saben, error! Fácil y rápido.
¿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 usuarioY 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:
Y si lo ponemos mal, pues ya saben, error! Fácil y rápido.