2

我们正在使用 Apache-2.4 提供的新的身份验证和授权框架,需要关闭整个站点(Location /)以防止未经授权的访问,除了一个子目录(Location /foo)可以获取授权 cookie。看起来,AuthMerging 是要使用的指令,但事情不起作用:

    <Location />
            AuthType                form
            AuthFormProvider        foo
            Session                 On
            SessionCookieName       ti2f
            Include                 conf/sessionpw.conf
            AuthName                TI
            <RequireAll>
                    Require         foo ipaddress
                    Require         foo expiration
            </RequireAll>
            ErrorDocument           401     /foo/
    </Location>

    <Location /foo>
            AuthMerging Or
            Require  all granted
            DirectoryIndex index.php
    </Location>

不幸的是,对 /foo 的访问仍然被阻止—— 401 Unauthorized。随着 LogLevel 的启动,我可以看到 mod_authz_core 记录的以下消息:

authorization result of Require all granted: granted
authorization result of <RequireAny>: granted
authorization result of AuthMerging Any: granted
authorization result of Require all granted: granted
authorization result of <RequireAny>: granted
authorization result of AuthMerging Any: granted
authorization result of Require foo ipaddress: denied (no authenticated user yet)
authorization result of Require foo expiration: denied (no authenticated user yet)
authorization result of <RequireAll>: denied (no authenticated user yet)
authorization result of <RequireAny>: denied (no authenticated user yet)

将子位置 /foo 的 AuthMerging 设置为“或”时,为什么 Apache 在“要求所有已授予”授权之后检查父位置的要求指令?

4

2 回答 2

0

改用LocationMatch

<LocationMatch "!^/foo">
   # lock down everything EXCEPT /foo
</LocationMatch>
于 2013-07-31T15:08:48.580 回答
0

经过一些调试,我能够弄清楚事情。Apache 的授权核心(据报道,在 Apache-2.2 中更糟)的奇怪之处在于,规则(如果有的话)可能会在每次命中时应用多次。例如,在上面的例子中,对于同一个请求,这发生了 3 次——对于“/foo/”

  1. 对于实际的“/foo/”。这是根据 Location /foo/ 的规则处理的,并按预期授予。
  2. 对于“/foo/index.php”。这也是根据 Location /foo/ 的规则处理的,并且是偶然授予的。这就解释了为什么我看到每次点击都会记录两个这样的授权。
  3. 因为我们使用PHP FPM来处理 PHP 文件,所以请求再次通过了 authz 规则——作为“/php-fpm/foo/index.php”。这一次它必须通过顶级Location /,因为它从来没有发生在我们身上,我们还需要一个单独的Location /php-fpm/......

当前 Apache 的行为是错误的还是奇怪的仍在争论中,但我的解决方案是这样描述我的子位置:

    <LocationMatch ^(/php-fpm)?/foo/>
            Require         all granted
            DirectoryIndex  index.php
    </LocationMatch>

在这种情况下,甚至不需要 AuthMerging。或者我也可以添加另一个位置 - 用于 /php-fpm/。无论哪种方式,一旦了解了问题,就有可用的解决方案......

于 2013-08-03T17:55:04.010 回答