Apache httpd: ¿Cómo puedo Denegar de todo, Permitir desde subred, pero Denegar desde IP dentro de esa subred?


26

Estoy ejecutando CentOS 5.5 con el stock Apache httpd-2.2.3.

He habilitado mod_status en Location / server-status. Me gustaría permitir el acceso a esta ubicación única de la siguiente manera:

  1. Negar todo
  2. Permitir desde la subred 192.168.16.0/24
  3. Negar desde un IP 192.168.16.100, que está dentro de la subred 192.168.16.0/24.

1 y 2 son fáciles. Sin embargo, dado que "Permitir desde 192.168.16.0/24", ¿es posible Denegar desde 192.168.16.100?

Intenté agregar una declaración de denegación para 192.168.16.100 pero no funciona. Aquí está la configuración 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>

O:

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

Sin embargo, esto no impide el acceso a esta página en particular, como se demuestra en los registros de acceso:

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

De acuerdo con el manual de mod_authz_host :

Permiten negar

Primero, se evalúan todas las directivas Permitir; al menos uno debe coincidir, o la solicitud es rechazada. A continuación, se evalúan todas las directivas de denegación. Si alguno coincide, la solicitud es rechazada

La dirección IP coincide con la directiva Denegar, ¿no debería rechazarse la solicitud?

De acuerdo con la tabla en la página mod_authz_host, esta dirección IP debería "coincidir con Permitir y Denegar" y, por lo tanto, debería aplicarse la regla "Controles de coincidencia final: Denegado".

    Coincidir Permitir, Negar resultado Negar, Permitir resultado
    Coincidencia Permitir solo Solicitud permitida Solicitud permitida
    Solo denegar coincidencia Solicitud denegada Solicitud denegada
    Sin coincidencia Predeterminado a segunda directiva: denegado Predeterminado a segunda directiva: permitido
    Coincide con Permitir y denegar Controles de coincidencia final: denegados Controles de coincidencia final: permitidos

Denegar de todos 192.168.16.100 - Dado que está utilizando "todos" aquí, esperaría que todas las solicitudes sean denegadas desde cualquier dirección IP. Piensa que algo más está sucediendo aquí.
micah

@Michah: También estoy haciendo a Allow from 192.168.16.0/24. Según tengo entendido la documentación, cualquier IP solicitante en la red 192.168.16.0/24 coincidirá con esta declaración Permitir, la solicitud está permitida.
Stefan Lasiewski

Siguiendo la documentación pegada arriba. "Primero, se evalúan todas las directivas Permitir; al menos una debe coincidir o la solicitud se rechaza" ==> Esto debe coincidir con su "Permitir desde 192.168.16.0/24", pero la segunda parte de "Siguiente, todas las directivas de Denegar son evaluado. Si hay coincidencias, la solicitud se rechaza "Con" Denegar de todos ", ¿no coincidirá cada solicitud con esa segunda parte y, por lo tanto, se denegará?
micah

Realmente debería considerar si desea negarle a esa dirección IP el acceso completo a su sistema o solo desde httpd. Si el primero continúa con tu enfoque de usar las directivas de apache. Si esto último se debe hacer en el firewall.
Andrew Case

Gracias ACase Solo quiero denegar el acceso desde 192.168.16.100 a esta página en particular. Quiero que 192.168.16.100 pueda acceder a todas las demás páginas de este servidor web.
Stefan Lasiewski

Respuestas:


35

No lo he probado, pero creo que ya casi estás allí.

<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 allno es necesario. De hecho, se arruinará porque todo coincidirá ally, por lo tanto , se lo negará (y creo que Apache está tratando de ser inteligente y hacer algo estúpido). Siempre he encontrado Apache Order, Allowy Denydirectrices complicadas, por lo que siempre visualizar las cosas en una tabla (tomado de los documentos ):

Partido | Permitir, denegar resultado | Negar, permitir resultado
-------------------------------------------------- -----
Permitir solo | Permitido | Permitido
Solo negar | Negado | Negado
Sin partido | Predeterminado: Denegado | Predeterminado: Permitido
Emparejar ambos | Partido final: denegado | Partido final: permitido

Con la configuración anterior:

  • Las solicitudes de 192.168.16.100 obtienen "Emparejar ambas" y, por lo tanto, denegadas.
  • Las solicitudes de 192.168.16.12 obtienen "Permitir solo" y, por lo tanto, están permitidas.
  • Las solicitudes de 123.123.123.123 obtienen "No match" y, por lo tanto, denegadas.

1

Probablemente también miraría agregar reglas de IPTables para que esto denegue el host único en el puerto 80, lo niegue de todos y permita la subred.

No debería tener problemas para configurar una regla de denegación desde una dirección específica después de haber permitido la subred. Solo hazlo en ese orden.


He actualizado mi respuesta.
Incluí una

Quiero permitir el acceso a todas las demás ubicaciones desde este host. Sin embargo, quiero negar ubicaciones específicas. IPTables no me ayuda aquí.
Stefan Lasiewski

IPTables no negará específicamente el tráfico saliente a menos que usted lo indique. Sin embargo, puede denegar el tráfico entrante del mundo y una dirección específica, pero todos permiten una subred.
Mike

Creo que malinterpretas mi solicitud. Quiero aplicar este control de acceso solo a / server-status, no a todo el host. IPtables no puede hacer esto fácilmente, que yo sepa.
Stefan Lasiewski

-4

¿Puedes usar php? Si es así, agregue una instrucción php para salir / redirigir para esa dirección IP específica

Ejemplo:

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

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

{header ("ubicación: http://www.google.com/ ");

salida();

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


2
Esto debería estar en cada página alojada por el servidor web. Esta solución no es práctica y no es donde desea filtrar el acceso a un servidor web.
Andrew Case
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.