1

在我的 Apache 配置中,我首先拒绝访问整个文件系统:

<Directory />
    Require all denied
</Directory>

然后,在每个虚拟主机的配置中,我允许不受限制的访问:

<VirtualHost ...>
    <Directory /var/www/example.com/>
        Require all granted
    </Directory>
</VirtualHost>

或者需要经过身份验证的访问:

<VirtualHost ...>
    <Directory /var/www/example.com/>
        AuthType Basic
        AuthName "example.com"
        AuthUserFile htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

我在 Apache 文档中注意到:

对于文件系统中的内容,请使用 <Directory> 和 <Files>。<Location /> 是一个例外,这是一种将配置应用于整个服务器的简单方法。

我想知道 using 是否<Location />可能是一种要求对特定虚拟主机进行身份验证访问的方法:

<VirtualHost ...>
    <Location />
        AuthType Basic
        AuthName "example.com"
        AuthUserFile htpasswd
        Require valid-user
    </Location>
</VirtualHost>

但是 Apache 文档指出:

<Location> 指令不应用于控制对文件系统位置的访问。

这让我想知道是否不应该是一般指令的建议<Location>,以及在某些情况下,特定的<Location />指令是否可以用作允许访问的例外,或者换句话说,Apache<Location>指令是否可以安全地用于配置访问到服务器?

4

1 回答 1

2

不。 同样来自 Apache 文档:

特别注意位置和目录指令的交互;例如,即使 <Directory /> 拒绝访问,<Location /> 指令也可能会推翻它。

我的理解是,因为任何<Location>指令都可能推翻任何<Directory>指令[1],所以限制最少的<Location>指令的限制性不得低于整个服务器<Directory>中限制性最强的指令。

从合理<Directory />的默认值开始Require all denied并遵循上述规则将要求任何<Location>指令的限制性不低于Require all denied,这当然会使根本无法访问服务器。

另请注意,该<Location>指令的目的是配置位于文件系统之外的资源。

底线是,对于任何可能触及文件系统的请求,对于<Location>可能适用于任何这些请求的任何指令,适用的<Location>指令不得包含该Require语句。 [2]

[1]:例如,使用符号链接。
[2]:可以使用文件系统权限或 apparmor 之类的工具来缓解通过Require在某些指令中包含语句打开的安全漏洞<Location>,但请记住深度防御原则。

于 2013-09-23T22:39:01.563 回答