Apache 2.4 .htaccess Instruções de exigência ignoradas

Apache 2.4 .htaccess Instruções de exigência ignoradas

Estou tentando restringir subdiretórios por cliente de um aplicativo contendo relatórios estáticos usando arquivos .htaccess gerados programaticamente com uma lista de usuários para cada cliente, mas embora eu possa demonstrar que o arquivo .htaccess está sendo analisado (500 ISE se contiver lixo, AllowOverride está funcionando) nenhuma das instruções Require mais restritivas está substituindo o Require valid-user na diretiva Location de nível superior.

por exemplo. /etc/httpd/conf.d/app.conf

<VirtualHost *:80>
ServerName app

RewriteEngine on
RewriteRule ^/cgi-bin\/api\/(\w+)$ /var/www/cgi-bin/App.cgi?mode=json&request=$1 [QSA,H=cgi-script]

<Directory "/var/www/cgi-bin/">
  Options ExecCGI
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
  AllowOverride FileInfo AuthConfig
  Options +Indexes +FollowSymLinks -ExecCGI
  IndexOptions +NameWidth=*
  SetHandler default-handler
  LogLevel trace8
</Directory>


<Location /cgi-bin/>
  AuthType Basic
  AuthName "App Server"
  AuthUserFile /etc/httpd/conf.d/app.passwd
  require valid-user
</Location>
<Location /cgi-bin/api/>
  AuthType Basic
  AuthName "App API"
  AuthUserFile /etc/httpd/conf.d/app-api.passwd
  Require valid-user
  LogLevel trace8
</Location>
</VirtualHost>

/var/www/cgi-bin/api/reports/customer1/.htaccess

Require user CUSTOMER1

Eu tenho o LogLevel trace8 ativado para o diretório de relatórios e vejo

AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
AH01626: authorization result of Require valid-user : granted,
AH01626: authorization result of <RequireAny>: granted
Response sent with status 200

nada que coloquei no arquivo .htaccess parece ser referenciado, agrupar instruções Require em RequireAll não faz nada, configurar Require all negado não faz nada, o Apache não está tratando as diretivas .htaccess como mais específicas do que a diretiva Location em a configuração em uma parte (superior, esquerda) do URI.

editado: tentei adicionar FileInfo sem efeito. Atualizado o exemplo para ficar mais completo. Localização das configurações /cgi-bin/api/reports/customer1 Exigir usuário CUSTOMER1 funciona muito bem na configuração, eu estava apenas tentando evitar a necessidade de recarregar o servidor da web toda vez que os trabalhos são executados e reconstruir os arquivos .htaccess AuthZ conforme alguns dos trabalhos são executados a cada minuto e eu não queria me esforçar para construir uma ferramenta mais completa, que pudesse recarregar o httpd apenas quando houver alterações materiais no AuthZ, já que em teoria o .htaccess deveria ser capaz de fazer o apache verificar se há alterações no AuthZ em cada acesso sem recargas privilegiadas.

Responder1

Resposta após a pergunta inicial

<Directory>e<Location>diretivas não são permitidas dentro.htaccessarquivos (vejaContextoseção).

Basta colocar um separado.htaccessarquivo dentro do/foo/bar/relatórios/pasta contendo as diretivas Auth*e Require. Certifique-se de que o caminho para o seu.htpasswdo arquivo é válido (caminhos absolutos devem ser preferidos).

Se ainda assim não funcionar, verifique se oAllowOverridediretiva foi definida corretamente (ou seja, dentro de um<Directory>directiva) dentro doanfitrião virtual/configuração do servidor(.confarquivo dentro do/etc/apache2/pasta).


Resposta após a 1ª edição da pergunta

A.htaccessarquivo é o equivalente a uma <Directory>diretiva dentro de um.confarquivo. No momento você está misturando <Directory>e <Location>diretivas para autenticação. Você poderia, por favor, remover as <Location>diretivas do seu.confarquivo e substitua suas <Directory>instruções pelas seguintes, deixando o.htaccessarquivos intocados:

<Directory "/var/www/cgi-bin/">
  Options ExecCGI
  AuthType Basic
  AuthName "App Server"
  AuthUserFile /etc/httpd/conf.d/app.passwd
  require valid-user
</Directory>
<Directory "/var/www/cgi-bin/api/">
  AuthType Basic
  AuthName "App API"
  AuthUserFile /etc/httpd/conf.d/app-api.passwd
  Require valid-user
  LogLevel trace8
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
  AllowOverride FileInfo AuthConfig
  Options +Indexes +FollowSymLinks -ExecCGI
  IndexOptions +NameWidth=*
  SetHandler default-handler
  LogLevel trace8
</Directory>

Até você editar sua pergunta, presumi que as <Location>diretivas foram colocadas dentro de um.htaccessarquivo e apontaria para pastas virtuais em vez de locais reais do sistema de arquivos. No entanto, omanual afirma explicitamente:

É importante nunca usar <Location>ao tentar restringir o acesso a objetos no sistema de arquivos. Isso ocorre porque muitos locais de espaço web (URLs) diferentes podem ser mapeados para o mesmo local do sistema de arquivos, permitindo que suas restrições sejam contornadas.

Responder2

Seu Permitir substituir falta directiva.

Apesar do que a documentação para o Exigir Diretiva diz, o comando deve ser:

AllowOverride FileInfo AuthConfig

informação relacionada