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?

26

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 de 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 Deny 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
    Match Refuser uniquement Demande refusée Demande refusée
    Aucune correspondance Par défaut à la deuxième directive: refusée Par défaut à la deuxième directive: autorisée
    Correspond à la fois Autoriser et Refuser Contrôles de correspondance finale: Refusé Contrôles de correspondance finale: Autorisés
Stefan Lasiewski
la source
Refuser de tous 192.168.16.100 - Puisque vous utilisez "tous" ici, je m'attendrais à ce que toutes les demandes soient refusées à partir de n'importe quelle adresse IP. Pensez que quelque chose d'autre se passe ici.
micah
@Michah: Je fais aussi un Allow from 192.168.16.0/24. Si je comprends bien la documentation, toute adresse IP demandeur du réseau 192.168.16.0/24 correspondra à cette instruction Allow, la demande est autorisée.
Stefan Lasiewski
Suite à la documentation collée ci-dessus. "Tout d'abord, toutes les directives Allow sont évaluées; au moins une doit correspondre, ou la demande est rejetée" ==> Cela devrait correspondre à votre "Allow from 192.168.16.0/24", mais la deuxième partie de "Next, all Deny directives are En cas de correspondance, la demande est rejetée "Avec" Refuser de tout ", chaque demande ne correspondra-t-elle pas à cette deuxième partie et sera-t-elle donc refusée?
micah
Vous devriez vraiment considérer si vous voulez refuser à cette adresse IP un accès complet à votre système ou uniquement à partir de httpd. Si les premiers poursuivent votre approche de l'utilisation des directives Apache. Si ce dernier doit être fait dans le pare-feu.
Andrew Case
Merci ACase. Je veux seulement refuser l'accès de 192.168.16.100 à cette page particulière. Je veux que 192.168.16.100 puisse accéder à toutes les autres pages de ce serveur Web.
Stefan Lasiewski

Réponses:

35

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 alln'est pas nécessaire. En fait, ça va bousiller parce que tout va correspondre all, et donc nié (et je pense qu'Apache essaie d'être intelligent et de faire quelque chose de stupide). Je l' ai toujours trouvé Apache Order, Allowet Denyconfondant les directives, visualiser donc toujours les choses dans une table (extrait de la documentation ):

Match | Autoriser, refuser le résultat | Refuser, autoriser le résultat
-------------------------------------------------- -----
Autoriser uniquement | Autorisé | Permis
Refuser uniquement | Refusé | Refusée
Pas de match | Par défaut: refusé | Par défaut: autorisé
Faire correspondre les 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.
phunehehe
la source
1

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.

Mike
la source
J'ai mis à jour ma réponse. J'ai inclus une règle "Refuser de 192.168.16.100", mais l'accès est toujours autorisé à partir de 192.168.16.100
Stefan Lasiewski
Je souhaite autoriser l'accès à tous les autres emplacements à partir de cet hôte. Cependant, je souhaite refuser des emplacements spécifiques. IPTables ne m'aide pas ici.
Stefan Lasiewski
IPTables ne refusera pas spécifiquement le trafic sortant sauf si vous le lui dites. Vous pouvez cependant refuser le trafic entrant du monde et une adresse spécifique, mais tous autorisent un sous-réseau.
Mike
Je pense que vous comprenez mal ma demande. Je souhaite appliquer ce contrôle d'accès à / server-status uniquement, pas à l'hôte entier. IPtables ne peut pas faire cela facilement, à ma connaissance.
Stefan Lasiewski
-4

Pouvez-vous utiliser php? Si c'est le cas, ajoutez une instruction php pour quitter / rediriger pour cette adresse IP spécifique

Exemple:

$ deny = array ("111.111.111", "222.222.222", "333.333.333");

if (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))

{header ("location: http://www.google.com/ ");

sortie();

Référence: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/

John
la source
2
Cela devrait être dans chaque page hébergée par le serveur Web. Cette solution n'est pas pratique et ne permet pas de filtrer l'accès à un serveur Web.
Andrew Case