Apache httpd: como posso negar tudo, permitir a partir da sub-rede, mas negar o IP nessa sub-rede?

26

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

Tenho habilitado mod_status na / server-status Localização. Gostaria de permitir o acesso a esse único local da seguinte maneira:

  1. Negar de todos
  2. Permitir a partir da sub-rede 192.168.16.0/24
  3. Negue de um IP 192.168.16.100, que esteja dentro da sub-rede 192.168.16.0/24.

1 e 2 são fáceis. No entanto, como eu "Permitir a partir de 192.168.16.0/24", é possível negar a partir de 192.168.16.100?

Tentei adicionar uma instrução Deny para 192.168.16.100, mas ela 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 esta página específica, conforme demonstrado nos logs 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 para mod_authz_host :

Permitem negar

Primeiro, todas as diretivas Allow são avaliadas; pelo menos um deve corresponder ou a solicitação é rejeitada. Em seguida, todas as diretivas Negar são avaliadas. Se houver correspondência, a solicitação é rejeitada

O endereço IP corresponde à diretiva Negar. Portanto, 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 a Permitir e Negar" e, portanto, a regra "Controles finais de correspondência: Negado" deve ser aplicada.

    Corresponder Permitir, Negar resultado Negar, Permitir resultado
    Correspondência Permitir apenas Solicitação permitida Solicitação permitida
    Corresponder apenas Negar Pedido negado Pedido negado
    Sem correspondência Padrão para a segunda diretiva: Negado Padrão para a segunda diretiva: Permitido
    Corresponder os dois controles de correspondência Permitir e Negar final: Negado Controles de correspondência final: Permitido
Stefan Lasiewski
fonte
Negar todos os 192.168.16.100 - Como você está usando "todos" aqui, esperaria que todos os pedidos fossem negados de qualquer endereço IP. Pense que algo mais está acontecendo aqui.
Micah
@ Michah: Eu também estou fazendo um Allow from 192.168.16.0/24. Pelo que entendi a documentação, qualquer IP solicitante na rede 192.168.16.0/24 corresponderá a esta instrução Allow, a solicitação é permitida.
Stefan Lasiewski
Seguindo a documentação colada acima. "Primeiro, todas as diretivas Allow são avaliadas; pelo menos um deve corresponder ou a solicitação é rejeitada" ==> Isso deve corresponder ao seu "Allow from 192.168.16.0/24", mas a segunda parte de "Next, all Deny diretives are are Se houver alguma correspondência, a solicitação será rejeitada "Com" Negar a todos ", todas as solicitações não corresponderão à segunda parte e, portanto, serão negadas?
Micah
Você realmente deve considerar se deseja negar que o endereço IP complete o acesso ao seu sistema ou apenas a partir do httpd. Se o primeiro continuar com sua abordagem, use as diretivas apache. Nesse último caso, isso deve ser feito no firewall.
Andrew Case
Obrigado ACase. Eu só quero negar o acesso de 192.168.16.100 a esta página em particular. Quero que o 192.168.16.100 seja capaz de acessar todas as outras páginas neste servidor da web.
Stefan Lasiewski

Respostas:

35

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 allNão é necessário. Na verdade, vai estragar tudo, porque tudo vai combinar alle, assim, negado (e acho que o Apache está tentando ser inteligente e fazer algo estúpido). Eu sempre achei Apache do Order, Allowe Denydirectivas confuso, por isso sempre visualizar as coisas em uma tabela (retirado os documentos ):

Partida | Permitir, Negar resultado | Negar, permitir resultado
-------------------------------------------------- -----
Permitir apenas | Permitido | Permitido
Negar apenas | Negado | Negado
Sem correspondência | Padrão: Negado | Padrão: permitido
Combinar ambos | Partida final: negada | Partida final: permitida

Com as configurações acima:

  • Os pedidos de 192.168.16.100 são "Corresponder aos dois" e, assim, são negados.
  • Pedidos de 192.168.16.12 são "Somente Permitidos" e, portanto, são permitidos.
  • Solicitações de 123.123.123.123 são "Sem correspondência" e, portanto, negadas.
phunehehe
fonte
1

Provavelmente, também adicionaria regras do IPTables para negar o host único na porta 80, negar a todos 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. Apenas faça nessa ordem.

Mike
fonte
Eu atualizei minha resposta. Eu incluí uma regra "Negar a partir de 192.168.16.100", mas o acesso ainda é permitido a partir de 192.168.16.100
Stefan Lasiewski
Quero permitir o acesso a todos os outros locais deste host. No entanto, quero negar locais específicos. O IPTables não me ajuda aqui.
Stefan Lasiewski
O IPTables não negará especificamente o tráfego de saída, a menos que você o solicite. No entanto, você pode negar o tráfego de entrada do mundo e um endereço específico, mas todos permitem uma sub-rede.
Mike
Acho que você não entendeu meu pedido. Desejo aplicar esse controle de acesso somente ao / server-status, não ao host inteiro. O IPtables não pode fazer isso facilmente, que eu saiba.
Stefan Lasiewski
-4

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

Exemplo:

$ negar = matriz ("111.111.111", "222.222.222", "333.333.333");

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

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

Saída();

Referência: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/

John
fonte
2
Isso teria que estar em todas as páginas hospedadas pelo servidor da web. Essa solução é impraticável e não para onde você deseja filtrar o acesso a um servidor da web.
Andrew Case