nginx localizações e precedência (negar ignorado por * .php)

3

Sou um administrador do Apache experiente em uma vida passada, mas decidi dar um mergulho e aprender o nginx. Até agora, tudo parece bastante intuitivo, mas está claro que eu ainda não internalizei o jeito nginx de fazer as coisas, então estou certo de que este é um problema fácil de resolver, mas não consigo encontrar uma resposta óbvia.

Eu tenho um servidor que usa o servidor php-fpm para PHP onde desejo restringir o acesso a alguns subdiretórios no meu documento raiz pelo IP de origem (por exemplo: phpmyadmin, alguns scripts de teste que eu escrevi, etc.). Por alguma razão, a restrição que tenho no lugar parece funcionar bem para diretórios e arquivos, mas os arquivos PHP servidos pelo servidor FastCGI aparentemente ignoram essa restrição de acesso. Eu verifiquei que esse é o caso criando arquivos de teste de tipos diferentes no diretório restrito. Arquivos de texto e HTML são de fato negados e retornam um 403, mas os arquivos PHP não importam que seus conteúdos pareçam ser analisados e retornados ao cliente.

Aqui estão as seções relevantes da configuração do meu site:

# pass all PHP scripts to FastCGI server socket
location ~ \.php$ {
  # Filter out arbitrary code execution
  location ~ \..*/.*\.php$ {return 404;}
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
  fastcgi_pass unix:/var/run/php5-fpm.sock;
}

# allow access to tools pages as necessary
location ~ /tools/ {
  allow 10.11.12.13/32;
  allow 10.11.12.14/32;
  deny all;
}

Há mais na configuração, mas não diretivas que afetam arquivos PHP ou / tools / location, tanto quanto eu posso dizer. O comportamento que estou procurando é que todos os arquivos em / tools / sejam restritos, não importa o tipo de arquivo, a menos que haja uma regra de permissão explícita para o intervalo de IPs em questão.

Qualquer luz que você possa lançar sobre isso para me apontar na direção certa seria muito bem vinda!

    
por Gabriel 18.03.2015 / 17:22

1 resposta

2

Isso porque o nginx veicula uma solicitação de um bloco de local correspondente, não múltiplo. Além disso, o nginx tem um processo específico para escolhê-lo, leia minha resposta em uma pergunta semelhante ou leia a documentação oficial para obter detalhes.

Eu estou supondo que você também está usando a diretiva index em algum lugar para dizer ao nginx para servir um arquivo index.php ao inserir o diretório tools ou subdiretório e esta diretiva aciona um redirecionamento interno para o bloco de localização do php onde o acesso não é restrito.

Você precisará usar blocos de localização aninhados ou usar regexs mais específicos.

    
por 18.03.2015 / 19:59

Tags