
Estoy intentando restringir los subdirectorios por cliente de una aplicación que contiene informes estáticos utilizando archivos .htaccess generados mediante programación con una lista de usuarios para cada cliente, pero aunque puedo demostrar que el archivo .htaccess se está analizando (500 ISE si contiene basura, AllowOverride está funcionando) ninguna de las declaraciones Require más restrictivas anula el usuario válido Require en la directiva Ubicación de nivel superior.
p.ej. /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
Tengo LogLevel trace8 activado para el directorio de informes y veo
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
Parece que no se hace referencia a nada de lo que puse en el archivo .htaccess, incluir declaraciones Require en RequireAll no hace nada, configurar Require all denegado no hace nada, Apache no trata las directivas .htaccess como más específicas que la directiva Location en la configuración en una parte (superior, izquierda) del URI.
editado: intenté agregar FileInfo sin ningún efecto. Se actualizó el ejemplo para que sea más completo. Configuración Ubicación /cgi-bin/api/reports/customer1 Requerir usuario CLIENTE1 funciona bien en la configuración, solo estaba tratando de evitar requerir una recarga del servidor web cada vez que se ejecutan los trabajos y reconstruir los archivos .htaccess AuthZ a medida que se ejecutan algunos de los trabajos cada minuto y no quería tomar el esfuerzo de construir una herramienta más completa, que pueda recargar httpd solo cuando hay cambios materiales de AuthZ, ya que en teoría .htaccess debería ser capaz de hacer que Apache verifique los cambios de AuthZ en cada acceso sin recargas privilegiadas.
Respuesta1
Respuesta después de la pregunta inicial
<Directory>
y<Location>
directivas no están permitidas dentro.htaccessarchivos (verContextosección).
Simplemente coloque un separado.htaccessarchivo dentro del/foo/bar/informes/carpeta que contiene las directivas Auth*
y Require
. Asegúrese de que el camino a su.htpasswdEl archivo es válido (se deben preferir las rutas absolutas).
Si aún así no funciona comprueba que elAllowOverride
directiva se configuró correctamente (es decir, dentro de un<Directory>
directiva) dentro delanfitrión virtual/configuración del servidor(.confarchivo dentro del/etc/apache2/carpeta).
Respuesta después de la primera edición de la pregunta
A.htaccessarchivo es el equivalente a una <Directory>
directiva dentro de un.confarchivo. Por el momento estás mezclando <Directory>
directivas <Location>
para autenticación. ¿Podría eliminar las <Location>
directivas de su.confarchivo y reemplace sus <Directory>
instrucciones con lo siguiente, mientras deja que el.htaccessarchivos intactos:
<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>
Hasta que editaste tu pregunta, asumí que las <Location>
directivas estaban colocadas dentro de un.htaccessarchivo y apuntaría a carpetas virtuales en lugar de ubicaciones reales del sistema de archivos. sin embargo, elmanual indica explícitamente:
Es importante no utilizar nunca
<Location>
cuando se intenta restringir el acceso a objetos en el sistema de archivos. Esto se debe a que muchas ubicaciones de espacios web (URL) diferentes podrían asignarse a la misma ubicación del sistema de archivos, lo que permitiría eludir sus restricciones.
Respuesta2
Su Permitir sobrescritura Falta directiva.
A pesar de lo que la documentación para el Requerir directiva dice, el comando debería ser:
AllowOverride FileInfo AuthConfig