Nginx: proteger directorios o rutas con password

La forma de proteger un directorio o ruta de nuestro sitio web con contraseña en Nginx es similar a la de Apache, aunque con ciertas diferencias, en cualquier caso, sigue siendo muy sencillo y de gran utilidad para dotar de una capa extra de seguridad ciertas secciones de un sitio web.

En apache usamos la combinación htpasswd/htaccess y la directiva AuthType. En el caso de nginx, es prácticamente igual aunque prescindiendo del fichero .htaccess, que en Nginx no existe.

¿Cómo lo hacemos entonces? Muy fácil, hacemos uso de las directivas de autenticación auth_basic y auth_basic_user_file dentro de un bloque de localización «location» que especifica la ruta a proteger:

location /foobar {
    auth_basic "Acceso restringido";
    auth_basic_user_file /var/www/foo/.htpasswd;
}

Recordad hacer un reload de la configuración de Nginx tras aplicar estos cambios.

#systemctl reload nginx

Como véis, la directiva auth_basic es meramente informativa, pues muestra el mensaje que aparecerá en el título de la ventana emergente que solicitará la autenticación. La otra directiva, auth_basic_user_file, especifica la ruta donde se encuentra el archivo .htpasswd, que contiene el listado de usuarios permitidos. Ejemplo de .htpasswd:

foo:$apr1$..9rpNqE$.BG6C6tQcrel1XliLrIPT1
bar:$apr1$..9rpNqE$.Va336tacreV3bxiLaIP34

Este archivo almacena los usuarios y contraseñas para la autenticación básica HTTP que vamos a utilizar. Los usuarios «foo» y «bar» tendrían acceso permitido con contraseña a la ruta /foobar. Recordad que podéis generar estos archivos tanto online como desde línea de comandos:

# htpasswd -cb .htpasswd foo mipassword
# cat .htpasswd
foo:$apr1$..9rpNqE$.BG6C6tQcrel1XliLrIPT1

Recordad ubicar este archivo fuera de la ruta pública del sitio web, o sino, bloquearlo adecuadamente para que no sea accesible desde Internet.