Erros 403 intermitentes ao usar allow para limitar o acesso ao url com IP explícito e SetEnvIf

2

Estamos executando o Apache 2.2.22 em um ambiente Solaris 10.

Temos um URL específico ao qual queremos limitar o acesso por IP. Recentemente, implementamos um CDN e agora temos a complexidade adicional de que os IPs de que uma solicitação é proveniente são, na verdade, os servidores CDN e não o último usuário final. No caso de precisarmos fazer o back out do CDN, queremos tratar do caso em que o CDN está encaminhando o pedido ou o cliente final está enviando o pedido diretamente.

O CDN envia o endereço IP do usuário final em um cabeçalho HTTP (para esse cenário, esse cabeçalho é chamado de "IP do usuário"). Aqui está a configuração que colocamos em prática:

SetEnvIf User-IP (\d+\.\d+\.\d+\.\d+) REAL_USER_IP=$1
SetEnvIf REAL_USER_IP "(10\.1\.2\.3|192\.168\..+)" access_allowed=1

<Location /uri/>
    Order deny,allow
    Allow from 10.1.2.3 192.168.
    allow from env=access_allowed
    Deny from all
</Location>

Isso parece funcionar bem por um tempo, no entanto, em algum momento, o servidor da Web começa a exibir erros 403 no usuário final - portanto, por algum motivo, ele está restringindo o acesso. O estranho é que uma rejeição do servidor da web parece resolver o problema, mas apenas por um tempo - então o comportamento volta.

Pode valer a pena notar também que esta URL é delegada a um servidor JBoss via mod_jk. A negação de acesso é, no entanto; confirmado para estar na camada do Apache e o problema só parece acontecer depois que o servidor estiver sendo executado por algum tempo.

    
por rbieber 19.09.2012 / 18:16

1 resposta

1

Aqui está a configuração final que resolveu nosso problema:

SetEnvIf User-IP (\d+\.\d+\.\d+\.\d+) REAL_USER_IP=$1

SetEnvIf Remote_Addr "(10\.1\.2\.3|192\.168\..+)" access_allowed=1
SetEnvIf REAL_USER_IP "(10\.1\.2\.3|192\.168\..+)" access_allowed=1

<Location /uri/>
    Order deny,allow
    Allow from env=access_allowed
    Deny from all
</Location>

Parece que a permissão explícita do IP de origem era o problema, uma vez que o REAL_USER_IP poderia ser válido, mas a permissão explícita com IPs nele falhou.

Basicamente, agora encadeamos as instruções SetEnvIf para garantir que a variável de ambiente "access_allowed" seja definida se Remote_Addr ou REAL_USER_IP corresponderem aos nossos IPs - e permitir somente a variável de ambiente.

    
por 10.12.2012 / 23:05

Tags