Apache httpd: come posso negare da tutto, consentire da sottorete, ma negare da IP all'interno di quella sottorete?


26

Sto eseguendo CentOS 5.5 con lo stock Apache httpd-2.2.3.

Ho abilitato mod_status allo stato Posizione / server. Vorrei consentire l'accesso a questa singola posizione nel modo seguente:

  1. Negato da tutti
  2. Consenti dalla sottorete 192.168.16.0/24
  3. Negare da un IP 192.168.16.100, che si trova nella sottorete 192.168.16.0/24.

1 e 2 sono facili. Tuttavia, poiché "Consenti da 192.168.16.0/24", è possibile negare da 192.168.16.100?

Ho provato ad aggiungere un'istruzione Deny per 192.168.16.100 ma non funziona. Ecco la configurazione rilevante:

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

Tuttavia, ciò non impedisce l'accesso a questa particolare pagina, come dimostrato nei registri di accesso:

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

Secondo il manuale di mod_authz_host :

Consenti, Nega

Innanzitutto, vengono valutate tutte le direttive Allow; almeno uno deve corrispondere o la richiesta viene respinta. Successivamente, vengono valutate tutte le direttive Nega. In caso di corrispondenze, la richiesta viene respinta

L'indirizzo IP corrisponde alla direttiva Nega, quindi la richiesta non dovrebbe essere respinta?

Secondo la tabella nella pagina mod_authz_host, questo indirizzo IP dovrebbe "Abbinare sia Consenti che Nega", quindi dovrebbe essere applicata la regola "Controlli di corrispondenza finali: Negato".

    Abbina Consenti, Nega risultato Nega, Consenti risultato
    Abbina Consenti solo Richiesta consentita Richiesta consentita
    Match Nega solo Richiesta negata Richiesta negata
    Nessuna corrispondenza Predefinito alla seconda direttiva: negato Predefinito alla seconda direttiva: consentito
    Abbina entrambi i controlli della partita finale Consenti e Nega: Controlli della partita finale negati: Consentito

Nega da tutto 192.168.16.100 - Dato che stai usando "tutto" qui, mi aspetterei che tutte le richieste vengano negate da qualsiasi indirizzo IP. Pensa che sta succedendo qualcos'altro qui.
Michea,

@Michah: sto anche facendo un Allow from 192.168.16.0/24. Come ho capito la documentazione, tutti gli IP dei richiedenti nella rete 192.168.16.0/24 corrisponderanno a questa istruzione Allow, la richiesta è consentita.
Stefan Lasiewski,

Di seguito la documentazione incollata sopra. "Innanzitutto, vengono valutate tutte le direttive Consenti; almeno una deve corrispondere o la richiesta viene respinta" ==> Deve corrispondere a "Consenti da 192.168.16.0/24", ma la seconda parte di "Avanti, tutte le direttive Nega sono valutato. Se ci sono corrispondenze, la richiesta viene respinta "Con" Nega da tutto ", ogni richiesta non corrisponderà a quella seconda parte e quindi verrà respinta?
Michea,

Dovresti davvero considerare se vuoi negare a quell'indirizzo IP l'accesso completo al tuo sistema o solo da httpd. Se i primi continuano con il tuo approccio all'utilizzo delle direttive apache. Se quest'ultimo dovrebbe essere fatto nel firewall.
Andrew Case,

Grazie ACase. Voglio solo negare l'accesso da 192.168.16.100 a questa pagina in particolare. Voglio 192.168.16.100 per poter accedere a tutte le altre pagine su questo server web.
Stefan Lasiewski,

Risposte:


35

Non ho ancora testato, ma penso che tu ci sia quasi.

<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 allnon è necessario. In realtà andrà in rovina perché tutto corrisponderà all, e quindi negato (e penso che Apache stia cercando di essere intelligente e fare qualcosa di stupido). Ho sempre trovato Apache Order, Allowe Denyle direttive confondendo, in modo sempre visualizzare le cose in una tabella (tratta dalla documentazione ):

Match | Consenti, Nega risultato | Nega, Consenti risultato
-------------------------------------------------- -----
Consenti solo | Consentito | Permesso
Nega solo | Negato | negato
Nessuna corrispondenza | Predefinito: Negato | Predefinito: consentito
Abbina entrambi | Incontro finale: negato | Incontro finale: consentito

Con le impostazioni sopra:

  • Le richieste da 192.168.16.100 ottengono "Abbina entrambi" e quindi negate.
  • Le richieste da 192.168.16.12 ottengono "Consenti solo" e quindi sono consentite.
  • Le richieste da 123.123.123.123 ottengono "Nessuna corrispondenza" e quindi vengono negate.

1

Probabilmente esaminerei anche l'aggiunta di regole IPTables per negare il singolo host sulla porta 80, negare da tutto e consentire la sottorete.

Non dovresti avere problemi a impostare una regola di rifiuto da un indirizzo specifico dopo aver autorizzato la sottorete. Fallo in questo ordine.


Ho aggiornato la mia risposta. Ho incluso una regola "Nega dal 192.168.16.100", ma l'accesso è ancora consentito dal 192.168.16.100
Stefan Lasiewski

Voglio consentire l'accesso a tutte le altre posizioni da questo host. Tuttavia, desidero negare posizioni specifiche. IPTables non mi aiuta qui.
Stefan Lasiewski,

IPTables non negherà in modo specifico il traffico in uscita a meno che tu non lo dica. Tuttavia, puoi negare il traffico in entrata dal mondo e un indirizzo specifico, ma tutti consentono una sottorete.
Mike

Penso che tu abbia frainteso la mia richiesta. Voglio applicare questo controllo di accesso solo allo stato / server, non all'intero host. IPtables non può farlo facilmente, per quanto ne so.
Stefan Lasiewski,

-4

Puoi usare php? In tal caso aggiungi un'istruzione php per uscire / reindirizzare per quell'indirizzo IP specifico

Esempio:

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

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

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

Uscita();

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


2
Questo dovrebbe essere in ogni singola pagina ospitata dal server web. Questa soluzione non è pratica e non è dove si desidera filtrare l'accesso a un server web.
Andrew Case,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.