9 votes

Définissez nginx.conf pour refuser toutes les connexions sauf à certains fichiers ou répertoires

Je suis en train de configurer Nginx de sorte que toutes les connexions à mon adresse IP numérique soient refusées, à l'exception de quelques répertoires et fichiers arbitraires. Ainsi, si quelqu'un se rend sur mon IP, il est autorisé à accéder au fichier index.php, et au répertoire phpmyadmin par exemple, mais s'ils essaient d'accéder à d'autres répertoires, ils se verront refuser l'accès.

Voici mon bloc serveur dans nginx.conf:

server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm index.php;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME /srv/http/nginx/$fastcgi_script_name;
            include        fastcgi_params;
        }
}

Comment dois-je procéder ? Merci beaucoup !

14voto

kolbyjack Points 7644

Le chemin le plus simple serait de commencer par refuser tout accès, puis d'accorder l'accès uniquement à ces répertoires que vous souhaitez. Comme l'a souligné ring0, vous pouvez utiliser le drapeau par défaut (default_server en 0.8) sur la directive listen. Cependant, si vous avez déjà un serveur que vous souhaitez utiliser par défaut pour les accès nommés inconnus à votre hôte, vous pouvez également capturer les demandes sans en-tête d'hôte ou avec l'adresse IP de votre serveur avec quelque chose comme ceci (remplaçant 1.2.3.4 par l'adresse IP de votre serveur) :

upstream _php {
  server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
  server_name "" 1.2.3.4;

  root /chemin/vers/racine;
  index index.php;

  include fastcgi_params;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  # refuser tout ce qui ne correspond pas à une autre localisation
  location / { deny all; }

  # autoriser le chargement de /index.php
  location = / { } # doit autoriser GET / pour rediriger de manière interne vers /index.php
  location = /index.php { fastcgi_pass _php; }

  # autoriser l'accès à phpmyadmin
  location /phpmyadmin/ { } # Autoriser l'accès aux fichiers statiques dans /phpmyadmin/
  location ~ ^/phpmyadmin/.*\.php$ { fastcgi_pass _php; } # fichiers php phpmyadmin
}

les fastcgi_params seront hérités par les deux localisations qui utilisent fastcgi_pass, et seuls /index.php et /phpmyadmin/ sont autorisés. J'ai également ajouté un bloc upstream pour php, ce qui facilite les ajouts ou les modifications éventuels à l'avenir.

0 votes

Merci pour la réponse géniale kolbyjack, ça a très bien fonctionné. Désolé d'avoir mis autant de temps pour te mettre comme correct, j'ai dû trouver le temps de travailler à nouveau sur cela.

5voto

Utilisation créative des règles de localisation et de refus en negated dans regex, quelque chose comme :

    location / {
        root   html;
        index  index.html index.htm index.php;
    }

    location ~* !^/(index.(php|html|htm)$)|(phpmyadmin/) {
        deny all;
    }

    location ~ \.php$ {
        root           html;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /srv/http/nginx/$fastcgi_script_name;
        include        fastcgi_params;
    }

C'est non testé mais vous avez compris l'idée.

http://wiki.nginx.org/HttpAccessModule

http://wiki.nginx.org/HttpCoreModule#location

Aussi, cela peut vous aider à l'écrire :

http://www.regextester.com/

2voto

Déjà vu Points 5368

Il est plus facile de déclarer des serveurs qui sont appelés avec un nom de domaine, et de déclarer un serveur par défaut qui inclura les accès directs par IP.

Par exemple, votre configuration de domaine pourrait être utilisée pour, disons, mondomaine.com

serveur {
        écoutez      80;
        nom_serveur  mondomaine.com *.mondomaine.com;
        racine /var/www/html/mondomaine.com
        ...

Avoir vos fichiers réguliers dans le répertoire /var/www/html/mondomaine.com.

Et l'entrée par défaut ne permettrait l'accès qu'à certains fichiers spécifiques dans un emplacement différent.
Remarquez le mot-clé par défaut après écoutez 80.

serveur {
        écoutez      80 par défaut;
        nom_serveur  _ *;
        racine /var/www/html/restreint
        ...

Et vous mettez les fichiers par défaut dans /var/www/html/restreint, qui seront servis pour localhost et les adresses IP brutes.

0voto

Vous pouvez configurer directement tous les chemins vers le fichier index.php et configurer uniquement sur ce fichier fastcgi php7 pour nginx

    //rediriger tout vers index.php
    location / {
        autoindex off;
        set $redirect_url $uri;
        try_files $uri $uri/ /index.php$is_args$query_string;
    }

    location = /index.php {
        include fastcgi.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;

        //Paramètres supplémentaires pour le script PHP
        fastcgi_param PATH_INFO $redirect_url;
        fastcgi_param HTTP_HOST $server_name;
    }

1 votes

S'il vous plaît ajouter des commentaires, il est complètement vague de comprendre ce que cela fait

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X