Restriction d’accès par IP ou password avec Nginx

Cet article vous montre comment configurer la restriction d’accès à votre serveur web Nginx à une ou plusieurs adresses IP de votre choix.

Configuration de la restriction d’accès

La configuration du site par défaut se trouve dans /etc/nginx/sites-available/default

La section qui nous intéresse est le location

location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
 }

Il faut ajouter les règles d’accès. Ici on autorise une adresse IP et on exclut tout le reste.

location / {
    # bureau
    allow 2a01:xxxx:51e:xxxx:14d:xxxx:9146:xxxx;
    # Deny the rest of the world
    deny all;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
 }

Test de la configuration Nginx

Avant d’activer une nouvelle configuration, il est toujours utile de bien s’assurer que la configuration est correcte et qu’il n’y a pas d’erreur de syntaxe dans le fichier.

Pour effectuer ce test, il faut utiliser le paramètre configtest avec le script de démarrage :

$ /etc/init.d/nginx configtest
* Testing nginx configuration
...done.

Si vous avez une erreur dans votre fichier de configuration, comme par exemple un ‘;’ oublié, le test va vous l’indiquer de la façon suivante :

$ /etc/init.d/nginx configtest
 * Testing nginx configuration
   ...fail!

Vérifiez les logs pour obtenir un message plus explicite :

$ tail /var/log/nginx/error.log
 [...]
 2016/11/22 10:39:05 [emerg] 14733#14733: invalid number of arguments in "allow" directive in /etc/nginx/sites-enabled/default:47

 

Recharger la configuration Nginx :

$ /etc/init.d/nginx reload

Vous pouvez aussi recharger la configuration avec le binaire Nginx :

$ nginx -s reload

Vous pouvez vérifier dans les logs Nginx que la configuration a bien été rechargée :

$ tail /var/log/nginx/error.log
[...]
2016/11/22 10:32:32 [notice] 14665#14665: signal process started

Test de la restriction d’accès

On peut tester la configuration depuis une IP externe :

$ curl -I http://vm.domain.com/
HTTP/1.1 403 Forbidden
Server: nginx/1.10.0 (Ubuntu)
Date: Tue, 22 Nov 2016 09:12:41 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive

Restriction d’accès par mot de passe

Pour créer un fichier de mot passe au format utilisé par Apache, vous pouvez utiliser la commande openssl :

$ printf "USER:$(openssl passwd -crypt)\n" >> .htpasswd

La fonction -crypt limite les mots de passe à 8 caractères

Pour des mots de passe plus long, utilisez la fonction -apr1

$ printf "USER:$(openssl passwd -apr1)\n" >> .htpasswd

Les 2 commandes précédentes vont vous demander le mot de passe de manière interactive dans le terminal.
Pour scripter cette commande, vous pouvez indiquer directement le mot de passe :

$ printf "USER:$(openssl passwd -apr1 PASSWORD)\n" >> .htpasswd

Attention, en utilisant cette dernière commande, vous pouvez faire apparaitre votre mot de passe dans l’historique du shell.

Configuration de Nginx pour l’accès par mot de passe

Il faut modifier votre section « location » pour indiquer à Nginx d’utiliser un fichier d’authentification:

location / {
    satisfy any;
    deny all;

    auth_basic "private";
    auth_basic_user_file /var/www/.htpasswd;

    try_files $uri $uri/ =404;
}

Configurer Nginx pour restreindre l’accès par IP ou par mot de passe

Dans cette configuration vous pouvez whitelister une ou plusieurs adresses IP et quand même laisser la possibilité de se connecter via un mot de passe si vous n’avez pas d’IP fixe.

location / {
    satisfy any;
    allow 111.222.333.444;
    deny all;

    auth_basic "private";
    auth_basic_user_file /var/www/.htpasswd;

    try_files $uri $uri/ =404;
}