Apache httpd: Como posso Negar de tudo, Permitir da sub-rede, mas Negar do IP dentro dessa sub-rede?

24

Estou executando o CentOS 5.5 com o Apache httpd-2.2.3.

Eu ativei mod_status na localização / status do servidor. Gostaria de permitir o acesso a este único local da seguinte forma:

  1. Negar de todos
  2. Permitir da sub-rede 192.168.16.0/24
  3. Negar de um IP 192.168.16.100, que está dentro da sub-rede 192.168.16.0/24.

1 & 2 são fáceis. No entanto, desde que eu "Permitir de 192.168.16.0/24", é possível negar de 192.168.16.100?

Eu tentei adicionar uma instrução Deny para 192.168.16.100, mas não funciona. Aqui está a configuração relevante:

<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>

No entanto, isso não impede o acesso a essa página específica, conforme demonstrado nos registros do Access:

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

De acordo com o manual do mod_authz_host :

Allow,Deny

First, all Allow directives are evaluated; at least one must match, or the request is rejected. Next, all Deny directives are evaluated. If any matches, the request is rejected

O endereço IP corresponde à diretiva Negar, então a solicitação não deve ser rejeitada?

De acordo com a tabela na página mod_authz_host, esse endereço IP deve "Corresponder ambos Permitir e negar" e, portanto, a regra "Controle final de correspondência: negado" deve ser aplicada.

    Match                       Allow,Deny result                   Deny,Allow result
    Match Allow only            Request allowed                     Request allowed
    Match Deny only             Request denied                      Request denied
    No match                    Default to second directive: Denied Default to second directive: Allowed
    Match both Allow & Deny     Final match controls: Denied        Final match controls: Allowed
    
por Stefan Lasiewski 11.03.2011 / 02:24

3 respostas

33

Eu não testei, mas acho que você está quase lá.

<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ão é necessário. Na verdade, ele vai estragar tudo porque vai corresponder a all , e assim negado (e acho que o Apache está tentando ser inteligente e fazer algo estúpido). Eu sempre achei as diretivas Order , Allow e Deny do Apache confusas, então sempre visualize as coisas em uma tabela (tirada de os documentos ):

Match      | Allow,Deny result   | Deny,Allow result
-------------------------------------------------------
Allow only | Allowed             | Allowed
Deny only  | Denied              | Denied
No match   | Default: Denied     | Default: Allowed
Match both | Final match: Denied | Final match: Allowed

Com as configurações acima:

  • Solicitações de 192.168.16.100 recebem "Corresponder ambos" e, portanto, são negadas.
  • Solicitações de 192.168.16.12 recebem "Permitir apenas" e, portanto, são permitidas.
  • Solicitações de 123.123.123.123 "Não correspondem" e, portanto, negadas.
por 07.10.2011 / 19:08
1

Eu provavelmente verificaria também a adição de regras do IPTables para negar o único host na porta 80, negar tudo e permitir a sub-rede.

Você não deve ter problemas para configurar uma regra de negação a partir de um endereço específico depois de permitir a sub-rede. Basta fazer isso nessa ordem.

    
por 11.03.2011 / 02:50
-4

Você pode usar o php? Se assim for, adicione uma instrução php para sair / redirecionar para esse endereço IP específico

Exemplo:

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

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

{    cabeçalho ("localização: link ");

exit ();

Referência: link

    
por 06.04.2011 / 22:51