Autoriser uniquement les utilisateurs locaux dans nginx

22

Je souhaite restreindre l'accès à certains VHosts afin que seul 127.0.0.1 puisse y accéder. J'ai toujours utilisé quelque chose comme ça pour lier le VHost à l'hôte local et non à l'IP externe:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        ....
    }
}

Mais j'ai remarqué que certains didacticiels incluent également des allowdirectives explicites pour le localhost et refusent expressément tous les autres:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        allow 127.0.0.1;
        deny all;
        ...
    }
}

Ces directives allow/ sont-elles denyvraiment nécessaires lorsque j'écoute déjà uniquement à la 127.0.0.1?

Biggie
la source
Essayez de changer la ligne d'autorisation pour:allow 127.0.0.1/32;
Itai Ganot
Ma question est de savoir si j'en ai besoin allowparce que je me suis mis listenà 127.0.0.1.
Biggie

Réponses:

15

La listendirective indique au système d'exploitation sur quelle interface le serveur Web se lie. Ainsi, lorsque vous regardez netstat -aaprès le démarrage de nginx, vous verrez que nginx écoute uniquement sur le port IP 127.0.0.1 80, ce qui signifie que le serveur nginx ne peut être atteint via aucune autre interface.

La liaison à une adresse IP spécifique fonctionne à un niveau inférieur dans la pile réseau réelle par rapport aux directives allow/ denydans la configuration nginx.

Cela signifie que vous n'avez pas besoin de directives allow/ séparées denydans votre configuration avec votre cas d'utilisation, car les connexions sont limitées plus bas dans la pile réseau.

Si vous spécifiez listen 80;uniquement et utilisez les directives allow/ deny, nginx enverra un code d'erreur HTTP au client, indiquant que l'accès est refusé.

Dans ce listen 127.0.0.1;cas, le navigateur ne peut pas du tout se connecter au serveur, car il n'y a pas de port TCP ouvert pour que le navigateur puisse se connecter.

Tero Kilkanen
la source
1
D'accord, j'ai oublié de mentionner que j'ai encore plus de VHosts et certains d'entre eux ne sont pas uniquement liés à localhost. Tous (locaux uniquement et non locaux) s'exécutent sur la même instance nginx. Affiche ainsi netstatune adresse locale de 0.0.0.0:80(toutes les interfaces). Puis-je alors omettre deny/ allowsur les serveurs locaux uniquement?
Biggie
Dans ce cas, nginx affichera le contenu de l'hôte virtuel qui a été défini avec la listen 80 default_server;directive lorsqu'un client demande un vhost lié à 127.0.0.1:80. Si vous n'avez pas default_serverdéfini, alors il affichera un serveur qui a listen 80;défini.
Tero Kilkanen du
OK, il n'y a donc aucune possibilité que des utilisateurs non locaux puissent accéder à des listen 127.0.0.1serveurs et je n'en ai même pas besoin allow/denysur ces serveurs?
Biggie
Oui, il n'y a aucune possibilité pour cela.
Tero Kilkanen
Cela répond à la question, contrairement à la première réponse actuelle. Pourquoi n'est-ce pas top?
Jortstek
16

Supposons que votre ID réseau soit 192.168.1.0, modifiez votre fichier conf comme ceci:

location / {
  # block one workstation
  deny    192.168.1.1;
  # allow anyone in 192.168.1.0/24
  allow   192.168.1.0/24;
  # drop rest of the world
  deny    all;
}

Veuillez me faire savoir comment cela fonctionne pour vous.

Édition n ° 1:

Oui, la directive allow est un must selon le wiki officiel de Nginx . Leur exemple est:

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}
Itai Ganot
la source
1
Je veux vraiment limiter l'accès à 127.0.0.1;) Ma question est de savoir si je dois que allowdu tout parce que je l' ai déjà mis listenà 127.0.0.1.
Biggie
Veuillez cocher Edit # 1.
Itai Ganot
Sry, je ne pense pas que vous compreniez ma question;) Ce que vous avez posté est (plus ou moins) déjà ce que j'ai écrit dans ma question ci-dessus. Mais ce n'est pas une réponse à ma question.
Biggie
1
@Biggie Vous n'avez pas à limiter l'accès à 127.0.0.1, il n'est disponible que sur la machine locale.
user9517 prend en charge GoFundMonica
Vraisemblablement, cela est vrai, mais cela ne répond pas spécifiquement à la question d'OP! La réponse acceptée le fait.
Jortstek
4

Je voulais obtenir la même fonctionnalité (autoriser uniquement les utilisateurs locaux dans nginx) et j'ai compris que je pouvais faire quelque chose de simple comme ceci:

server {
    listen 127.0.0.1:80;

    index index.html index.htm index.nginx-debian.html;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /path/to/folder;
    }       

    location / {
        include proxy_params;
    }
}

Ce fichier de configuration fonctionne très bien pour moi, je n'utilise aucune allowdirective, mais seulement 127.0.0.1:80, et avec cela je suis en mesure de restreindre l'accès nginx aux utilisateurs locaux uniquement!

pebox11
la source
grande et simple réponse pour limiter aux utilisateurs locaux.
new2cpp