Apache 2.4 restringe la URL a ciertas IP

14

Estoy tratando de restringir una URL específica para que esté disponible fuera de la red solo a direcciones IP específicas. Cuando un usuario externo intenta acceder a esa URL y no desde la lista de IP, debe ser redirigido a la página de inicio.

Esto es lo que he intentado hasta ahora sin suerte. La última parte redirige a todos a la página de inicio independientemente de la IP.

<Location "/secret">
#    <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
#    Redirect 303 "/secret" /
#    </If>

RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]

LogLevel debug rewrite:trace6
</Location>

PD: la URL / secret es, de hecho, una URL virtual y no existe físicamente en la unidad.

Denis Rendler
fuente
Si las declaraciones están comentadas? Habilitar reescritura - RewriteEngine On?
user9517
La declaración <If> es una versión que probé. La directiva RewriteEngine On se declaró anteriormente. Esa es la razón por la que redirige a todos
Denis Rendler
1
Creo que debería desmarcar la respuesta seleccionada, porque no es válida para Apache 2.4 como solicitó (da información incorrecta a las personas que pasan)
Erenor Paz

Respuestas:

4

Utilizar Order, Denyy allowpara especificar quién tiene acceso a su host virtual o la ubicación.

<VirtualHost *:80>
    ServerName example.net
    DocumentRoot /docroot

    <Directory "/docroot">
        Order Deny,Allow
        Deny from all
        Allow from 10.10.10.10
        Allow from 10.10.11.0/24
    </Directory>   
</VirtualHost>

Cuando se trata de redireccionar, piense en una página de error personalizada . Esto es mucho más general, porque cada acceso no autorizado debe provocar un error 403 y, por lo tanto, puede evaluarse fácilmente.

Nunca hice esto con apache, pero uso esta estrategia con nginx. Para apache, algo como esto debería hacer:

ErrorDocument 403 http://homepage.example.com

Los documentos de error personalizados se configuran utilizando la directiva ErrorDocument, que se puede usar en contexto global, virtualhost o de directorio. Se puede usar en archivos .htaccess si AllowOverride está configurado en FileInfo. (de los documentos de apache)

ansi_lumen
fuente
2
Esto parece un conjunto de configuración Apache httpd 2.2. ¿Seguirá funcionando con 2.4?
user9517
Al menos la ErrorDocumentparte es de los 2.4 documentos. No uso apache, ya que nginx está cerca, pero asumí eso Order, Denyy Allowtodavía están en apache 2.4
ansi_lumen
Gracias, pero no ayudo. Olvidé mencionar, pero actualicé la pregunta, la URL / secret es de hecho una URL virtual y no existe físicamente en el disco. La URL en sí misma es una reescritura de index.php, por eso utilicé la directiva <Location>.
Denis Rendler
44
Esta sintaxis está en desuso en apache 2.4
Luca Reghellin
1
¿Por qué es esta la respuesta aceptada? Esto es para Apache 2.2 no 2.4 como la pregunta implica ... Esto no funcionará.
Jeremy
23

Las opciones Ordenar, Denegar y Permitir se han reemplazado en Apache 2.4 con

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
</Directory>

Puede restringir explícitamente las direcciones mediante el uso de lo siguiente:

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
    Require not ip 192.168.0.1
</Directory>

Lo opuesto exacto también es cierto, para restringir todo y solo permitir un subconjunto use lo siguiente:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
</Directory>

Hay más información disponible en la documentación de control de acceso de Apache 2.4.

En lo que respecta a su pregunta (editado la mía debido a la falta de puntos para agregar un comentario), debería poder simplemente establecer un ErrorDocument con el índice establecido como la ruta URL:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
    ErrorDocument 401 /index.html
</Directory>

¡Espero que esto ayude!

Linztm
fuente
Gracias, @Linztm! Pero esto resuelve solo parcialmente mi problema. No solo quiero bloquear al usuario, sino también redirigirlo a la página de inicio.
Denis Rendler
Parece estar funcionando con la directiva ErrorDocument solo si proporciono la URL completa, incluido el dominio y el protocolo. Investigaré más a fondo. Gracias.
Denis Rendler
Encontré al menos un caso en el que necesita usar allowaunque está en desuso, Require 127.0.0.1 todavía permitir el acceso por dirección externa desde la máquina local, mientras que la sintaxis de permitir solo permite desde 127 direcciones.
Alexei Martianov
2

Para Apache 2.4, puede usar <RequireAny>. Puede hacerlo en un vhost o un archivo .htaccess ...

SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP  # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
  Require env AllowThisIP
  Require host example.com
</RequireAny>

Documentos de Apache https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany

MontyThreeCard
fuente