web-dev-qa-db-fra.com

Apache httpd: Comment puis-je refuser à tous, autoriser à partir du sous-réseau, mais refuser à partir de l'IP au sein de ce sous-réseau?

J'utilise CentOS 5.5 avec le stock Apache httpd-2.2.3.

J'ai activé mod_status à l'emplacement/état du serveur. Je voudrais autoriser l'accès à cet emplacement unique de la manière suivante:

  1. Refuser de tout
  2. Autoriser à partir du sous-réseau 192.168.16.0/24
  3. Refuser à partir de l'IP 192.168.16.100, qui se trouve dans le sous-réseau 192.168.16.0/24.

1 & 2 sont faciles. Cependant, puisque je "Autorise à partir de 192.168.16.0/24", est-il possible de refuser à partir de 192.168.16.100?

J'ai essayé d'ajouter une instruction Deny pour 192.168.16.100 mais cela ne fonctionne pas. Voici la configuration appropriée:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Ou:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Cependant, cela n'empêche pas l'accès à cette page particulière, comme le montrent les journaux d'accès:

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

Selon le manuel pour mod_authz_Host :

Autoriser, refuser

Tout d'abord, toutes les directives Allow sont évaluées; au moins un doit correspondre, sinon la demande est rejetée. Ensuite, toutes les directives Refuser sont évaluées. En cas de correspondance, la demande est rejetée

L'adresse IP correspond à la directive Deny, donc la demande ne devrait-elle pas être rejetée?

Selon le tableau de la page mod_authz_Host, cette adresse IP doit "Correspondre à la fois Autoriser et Refuser", et donc la règle "Contrôles de correspondance finale: Refusé" doit s'appliquer.

 Correspondance Autoriser, Refuser le résultat Refuser, Autoriser le résultat 
 Correspondance Autoriser uniquement Demande autorisée Demande autorisée 
 Correspondance Refuser uniquement Demande refusée Demande refusée 
 Aucune correspondance Par défaut à la deuxième directive: Refusé Par défaut à la deuxième directive: Autorisé 
 Correspond à la fois à Autoriser et Refuser Contrôles de correspondance finale: Refusé Contrôles de correspondance finale: Autorisé 
26
Stefan Lasiewski

Je n'ai pas testé, mais je pense que vous y êtes presque.

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from all n'est pas nécessaire. En fait, ça va bousiller parce que tout va correspondre à all, et donc refusé (et je pense qu'Apache essaie d'être intelligent et de faire quelque chose de stupide). J'ai toujours trouvé les directives d'Apache Order, Allow et Deny déroutantes, alors visualisez toujours les choses dans un tableau (tiré de la documentation ):

 Correspondance | Autoriser, refuser le résultat | Refuser, autoriser le résultat 
 ----------------------------------------- -------------- 
 Autoriser uniquement | Autorisé | Autorisé 
 Refuser uniquement | Refusé | Refusé 
 Pas de correspondance | Par défaut: refusé | Par défaut: Autorisé 
 Correspond aux deux | Match final: refusé | Match final: autorisé 

Avec les paramètres ci-dessus:

  • Les demandes provenant de 192.168.16.100 obtiennent "Match both" et sont donc refusées.
  • Les requêtes de 192.168.16.12 obtiennent "Autoriser uniquement" et sont donc autorisées.
  • Les demandes de 123.123.123.123 obtiennent "Aucune correspondance" et sont donc refusées.
35
phunehehe

Je chercherais probablement à ajouter également des règles IPTables pour cela pour refuser l'hôte unique sur le port 80, refuser de tous et autoriser le sous-réseau.

Vous ne devriez avoir aucun problème à configurer une règle de refus à partir d'une adresse spécifique après avoir autorisé le sous-réseau. Faites-le simplement dans cet ordre.

1
Mike