是否可以安全地使用Apache <location>指令来配置对服务器的访问?</location>

时间:2013-09-23 22:39:02

标签: apache2 basic-authentication http-authentication digest-authentication

在我的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文档中注意到:

  

For content that lives in the filesystem, use <Directory> and <Files>. An exception is <Location />, which is an easy way to apply a configuration to the entire server.

我想知道使用<Location />是否可能需要对特定虚拟主机进行身份验证访问:

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

但Apache文档指出:

  

<Location> directives should not be used to control access to filesystem locations.

这让我想知道是否一般是<Location>指令的建议,以及在某些情况下是否可以使用<Location />指令作为< em>异常允许访问,换句话说,Apache <Location>指令可以安全地用于配置对服务器的访问吗?

1 个答案:

答案 0 :(得分:2)

否。同样来自Apache文档:

  

Pay particular attention to the interactions of Location and Directory directives; for instance, even if <Directory /> denies access, a <Location /> directive might overturn it.

我的理解是,因为任何<Location>指令都可能推翻任何<Directory>指令[1],所以限制性最小的<Location>指令的限制性不得超过限制性最强的{{1}整个服务器上的指令

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

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

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

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