O Apache 2.4 restringe o URL a determinados IPs

13

Estou tentando restringir um URL específico para estar disponível fora da rede apenas para endereços IP específicos. Quando um usuário externo tenta acessar esse URL e não da lista de IPs, ele deve ser redirecionado para a página inicial.

Isto é o que eu tentei até agora sem sorte. A última parte redireciona todos para a página inicial, independentemente do 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>

PS: a URL / secret é de fato uma URL virtual e não existe fisicamente na unidade.

Denis Rendler
fonte
as declarações If são comentadas? Ativar reescrita - RewriteEngine On?
user9517
A declaração <If> é uma versão que eu tentei. A diretiva RewriteEngine On é declarada anteriormente. Essa é a razão que redireciona todos
Denis Rendler
1
Acho que você deveria un-marcar a resposta selecionada, porque não é válida para o Apache 2.4 como você pediu (que dá informação errada para as pessoas que passam)
Erenor Paz

Respostas:

3

Use Order, Denye allowpara especificar quem tem acesso ao seu vhost ou localização.

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

Quando se trata de redirecionar, pense em uma página de erro personalizada . Isso é muito mais geral, porque todo acesso não autorizado deve provocar um erro 403 e, portanto, pode ser avaliado facilmente.

Eu nunca fiz isso com o apache, mas use essa estratégia com o nginx. Para o apache, algo assim deve fazer:

ErrorDocument 403 http://homepage.example.com

Os documentos de erro personalizados são configurados usando a diretiva ErrorDocument, que pode ser usada no contexto global, host virtual ou diretório. Pode ser usado em arquivos .htaccess se AllowOverride estiver definido como FileInfo. (dos documentos do apache)

ansi_lumen
fonte
2
Parece um conjunto de configurações do Apache httpd 2.2. Ainda funcionará com o 2.4?
user9517
Pelo menos a ErrorDocumentparte é dos documentos 2.4. Não uso apache, desde nginx está ao redor, mas assumiu que Order, Denye Allowainda estão por aí no Apache 2.4
ansi_lumen
Obrigado, mas eu não ajudo. Esqueci de mencionar, mas atualizei a pergunta, a URL / secret é de fato uma URL virtual e não existe fisicamente na unidade. A URL em si é uma reescrita de index.php, por isso usei a diretiva <Location>.
Denis Rendler 28/09
4
Essa sintaxe foi descontinuada no apache 2.4
Luca Reghellin
1
Por que essa é a resposta aceita? Isto é para o Apache 2.2, não 2.4, como a pergunta indica ... Isso não vai funcionar.
21418 Jeremy
22

As opções Order, Deny e Allow foram substituídas no Apache 2.4 por

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

Você pode restringir explicitamente endereços usando o seguinte:

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

O exato oposto também é verdadeiro: para restringir tudo e permitir apenas um subconjunto, use o seguinte:

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

Mais informações estão disponíveis na documentação de controle de acesso do Apache 2.4.

Em relação à sua pergunta (editada por falta de pontos para adicionar um comentário), você pode simplesmente definir um ErrorDocument com o índice definido como o caminho da 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 isto ajude!

Linztm
fonte
Obrigado, @Linztm! Mas isso resolve apenas parcialmente o meu problema. Não quero apenas bloquear o usuário, mas também redirecioná-lo para a página inicial.
Denis Rendler 28/09
Parece estar funcionando com a diretiva ErrorDocument apenas se eu fornecer a URL completa, incluindo domínio e protocolo. Vou pesquisar mais. Obrigado.
Denis Rendler
Eu encontrei pelo menos um caso em que você precisa usar, allowapesar de descontinuado, Require 127.0.0.1 ainda permite o acesso por endereço externo da máquina local, onde a sintaxe de permissão permite apenas o endereço 127.
Alexei Martianov
2

Para o Apache 2.4, você pode usar <RequireAny>. Você pode fazer isso em um arquivo vhost ou .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 do Apache https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany

MontyThreeCard
fonte