7.2.2.2.4. Control de accesos

Los servidor web permiten la restricción del acceso a los recursos del servidor por dos vías:

7.2.2.2.4.1. Según origen de la petición

Para ello, en principio, se analiza cuál es la dirección de origen de la conexión y se restringe o permite el acceso mediante las directivas allow, deny e internal.

La última de ellas, internal, impide el acceso al recurso si la petición no es interna, esto es, generada por el propio servidor, como por ejemplo cuando se devuelve una página de error:

error_page  403  /403.html

location = /403.html {
   internal;
}

De este modo, la página sólo será enviada al servidor cuando se intente acceder a un recurso prohibido. Si el cliente intenta obtenerla directamente con http://www.example.net/403.html obtendrá un error 404.

allow y deny sirven respectivamente para permitir o denegar el acceso y se evalúan en el orden en que aparecen. Por ejemplo:

location /docs/ {
   deny  192.168.255.10;
   allow 192.168.255.0/24;
   deny all;
   autoindex on;
}

niega el acceso de los recursos bajo tal localización a la máquina 192.168.255.10, se lo permite al resto de máquinas de esa red y, por último, se lo niega al resto.

Nota

Cuando las reglas son largas y complicadas, es mejor recurrir al módulo ngx_http_geo_module

Advertencia

Cuando intermedia en la comunicación entre cliente y servidor algún proxy no transparente, la IP de origen será la del proxy y no la del cliente. Para solventarlo, más adelante se explica cómo indicarle a nginx cuál es la IP original.

7.2.2.2.4.2. Autenticación

La autenticación del cliente puede ser realizada de distintos modos:

La regla general es que el usuario logra acceso cuando satisface todas las condiciones de acceso (esto incluye la restricción por origen), pero puede modificarse este comportamiento a través de la directiva satisfy.

Es posible utilizar PAM para la autenticación gracias al módulo ngx_http_auth_pam[1], pero aquí trataremos la autenticación básica usando un fichero de contraseñas. Para proteger con este mecanismo un recurso podemos hacer lo siguiente:

location /privado/ {

   satisfy any;

   # El acceso interno es libre
   allow 192.168.0.0/16;
   allow 172.16.0.0/12;
   deny all;

   # Como el acceso interno es libre debemos impedir el cacheo del contenido.
   expires -1s;  # Valor negativo crea la cabecera Cache-Control: no-cache

   # Si se accede desde internet, es necesaria contraseña
   auth_basic             "Zona privada";
   auth_basic_user_file   htpasswd;
}

Nota

auth_basic puede contener cualquier cadena y si vale off, se deshabilita la autenticación.

En el fichero de contraseñas cada línea contiene un nombre de usuario y una contraseña ofuscada:

# echo privilegiado:$(openssl passwd -apr1 "contraseña") >> /etc/nginx/htpasswd
# chmod 600 /etc/nginx/htpasswd
# chown www-data /etc/nginx/htpasswd

Notas al pie